Як делегувати простий звіт роботи. Пишемо бота на Python і Google BigQuery
Чи є у вас завдання, які повторюються день за днем, з тижня на тиждень? Наприклад, написання звітів. Ви запитуєте дані, проводите аналіз, візуалізуєте (робите графіки, діаграми), потім відправляєте начальнику. Але якщо все це автоматизувати?
У цьому туторіалі ми створимо робота для Telegram, який допоможе автоматизувати звітність. А найкласніше — вся програма складатиметься лише з 50 рядків коду! Якщо ви створюєте бота для Telegram вперше, то варто прочитати ще ось цей пост.
Якщо ми бажаємо використовувати сервіс, потрібно підключити Google BigQuery API. Для цього йдемо в Консоль розробників Google і створюємо новий проект (або вибираємо існуючий).
У контрольній панелі вибираємо ENABLE APIS AND SERVICES та шукаємо BigQuery API.
Вибираємо Enable для підключення API.
Створюємо ключ облікового запису
Знову вирушаємо в Консоль розробників Google, вибираємо вкладку Credentials, Create credentials та Service account key.
Потім - New service account, і в полі Service account name вводимо ім'я.
З списку Role вибираємо Project > Owner, потім Create.
Файл, який автоматично завантажуватиметься, називається creds.json.
Виставляємо GOOGLE_APPLICATION_CREDENTIALS, вказавши шлях до creds.json у терміналі.
Для вирішення цього завдання вибираємо matplotlib.
імпортувати matplotlib.pyplot як plt
Нам потрібно п'ять параметрів, де 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 для отримання та збереження зображення. А потім уже надсилаємо все правильному контакту.