Как делегировать простые отчеты роботу. Пишем бота на Python и Google BigQuery
Есть ли у вас задачи, которые повторяются изо дня в день, из недели в неделю? Например, написание отчетов. Вы запрашиваете данные, проводите анализ, визуализируете (делаете графики, диаграммы), а затем отправляете начальнику. Но что, если все это автоматизировать?
В этом туториале мы создадим бота для Telegram, который поможет автоматизировать отчетность. А самое классное — вся программа будет состоять всего из 50 строк кода! Если вы создаете бота для Telegram впервые, то стоит прочитать еще вот этот пост.
Если мы хотим использовать сервис, нужно подключить Google BigQuery API. Для этого идем в Google Developers Console и создаем новый проект (или же выбираем существующий).
В контрольной панели выбираем ENABLE APIS AND SERVICES и ищем BigQuery API.
Выбираем Enable для подключения API.
Создаем ключ аккаунта
Снова отправляемся в Google Developers Console, выбираем вкладку Credentials, Create credentials и Service account key.
Затем — New service account, и в поле Service account name вводим имя.
Из выпадающего списка Role выбираем Project > Owner, затем Create.
Файл, который будет автоматически загружаться, называем creds.json.
Выставляем GOOGLE_APPLICATION_CREDENTIALS, указав путь к creds.json в терминале.
Нам нужно пять параметров, где x — данные по оси х, x_label — название для оси, y — данные оси y, y_label — название для оси и title — заголовок всей визуализации.
def visualize_bar_chart(x, x_label, y, y_label, title):
plt.title(title)
plt.xlabel(x_label)
plt.ylabel(y_label)
index = np.arange(len(x))
plt.xticks(index, x, fontsize=5, rotation=30)
plt.bar(index, y)
return plt
Сохраняем изображение
Теперь давайте воспользуемся двумя функциями, чтобы создать визуализацию и сохранить ее.
Будем отправлять число ежедневно публикуемых постов. Сначала пишем запрос.
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
Запрос помогает собрать данные за две недели, начиная с 2 декабря 2018 года.
Мы используем эту дату, потому что 2018-12-02 — последние данные, записанные в bigquery-public-data.stackoverflow.post_history, в других случаях вы можете использовать CURRENT_DATE () для получения самых новых данных.
Вызываем функцию query_to_bigquery для получения данных.
dataframe = query_to_bigquery(query)
Затем используем колонку данных date для оси х, а колонку total_posts для оси у.
x = dataframe[‘date’].tolist()
y = dataframe[‘total_posts’].tolist()
Визуализируем при помощи функции visualize_bar_chart и сохраняем в виде изображения.
Оборачиваем этот код в функцию под названием get_and_save_image.
def get_and_save_image():
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
dataframe = query_to_bigquery(query)
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
Отправляем изображение
Для того, чтобы отправить отчет адресату, нужно знать параметр chat_id.
Используем userinfobot и набираем /start. Бот отвечает нужной информацией, chat_id содержится в поле id.
Теперь создаем функцию send_image. Она будет задействовать функцию get_and_save_image для получения и сохранения изображения. А затем уже отправляем все правильному контакту.