Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery

Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery

Имате ли задачи, които се повтарят ден след ден, седмица след седмица? Например писане на доклади. Искате данни, анализирате ги, визуализирате ги (правите графики, диаграми) и след това ги изпращате на шефа си. Но какво, ако всичко това беше автоматизирано?

В този урок ще създадем бот за Telegram, който ще помогне за автоматизирането на отчитането. И най-готиното е, че цялата програма ще се състои само от 50 реда код! Ако създавате бот за Telegram за първи път, трябва да прочетете и това пост.

Skillbox препоръчва: Практически курс Разработчик на Python от нулата.

Напомняме ви: за всички читатели на "Habr" - отстъпка от 10 000 рубли при записване във всеки курс Skillbox, използвайки промоционалния код на "Habr".

Захващам се

Инсталиране на библиотеки

Ще използваме google-cloud-bigquery за получаване на данни от Google BigQuery. matplotlib, буца и панди ще ви помогне да визуализирате вашите данни. python-телеграма-бот ще изпрати готовите данни на Telegram.

pip3 инсталирайте google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Свързване на Google BigQuery API

Ако искаме да използваме услугата, трябва да свържем Google BigQuery API. За да направим това, отиваме на Google Developers Console и създайте нов проект (или изберете съществуващ).

В контролния панел изберете АКТИВИРАНЕ НА API И УСЛУГИ и потърсете BigQuery API.

Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery

Изберете Активиране, за да свържете API.

Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery

Създайте ключ за акаунт

Да отидем отново Google Developers Console, изберете раздела Идентификационни данни, Създаване на идентификационни данни и ключ за акаунт за услуга.

След това - Нов акаунт за услуга и въведете името в полето Име на акаунт за услуга.

От падащия списък Роля изберете Проект > Собственик, след което Създаване.

Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery

Файлът, който ще бъде изтеглен автоматично, се нарича creds.json.

Задайте GOOGLE_APPLICATION_CREDENTIALS, като посочите пътя до creds.json в терминала.

експортиране GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ако всичко е минало добре, време е да започнете да пишете програмата.

Създаване на приложение

За урока ще използваме данни от bigquery-public-data.stackoverflow, за нашия отчет ще изберем броя на дневните публикации.

Всичко е съвсем просто.

Заявете таблицата -> Визуализирайте данните -> Запазете визуализацията -> Изпратете изображението

Нека създадем една функция, която да дефинира всяка нишка.

Заявка към BigQuery

Първо импортираме библиотеката.

от google.cloud импортиране на bigquery

Създаваме функция, наречена query_to_bigquery, където параметърът е query.

def query_to_bigquery(query):
    client = bigquery.Client()
    query_job = client.query(query)
    result = query_job.result()
    dataframe = result.to_dataframe()
    return dataframe

Тази функция ще върне заявката като рамка с данни.

Визуализиране на данни

За да разрешите този проблем, изберете matplotlib.

импортирайте matplotlib.pyplot като plt

Имаме нужда от пет параметъра, където x са данните по оста 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(заявка)

След това използваме колоната с данни за датата за оста x и колоната total_posts за оста y.

x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()

Ние го визуализираме с помощта на функцията visualize_bar_chart и го запазваме като изображение.

plt = visualize_bar_chart(x=x, x_label='Дата', y=y, y_label='Общо публикации', title='Ежедневни публикации')
plt.savefig('viz.png')

Обвиваме този код във функция, наречена 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 за извличане и запазване на изображението. И след това изпращаме всичко на правилния контакт.

def send_image(bot, update):
    get_and_save_image()
    chat_id = 'CHAT_ID_RECEIVER'
    bot.send_photo(chat_id=chat_id, photo=open('viz.png','rb'))

Основна програма

Накрая създаваме друга функция, main, за стартиране на приложението. Не забравяйте да промените YOUR_TOKEN за бота.

Запомнете: тази програма ще изпрати изображението автоматично във времето, което посочите. Например, ние ще изпращаме доклад в девет сутринта всеки ден.

def main():
    updater = Updater('YOUR_TOKEN')
    updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6))
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

В резултат нашето приложение ще изглежда така:

from google.cloud import bigquery
from telegram.ext import Updater
 
import matplotlib.pyplot as plt
import numpy as np
import datetime
 
def query_to_bigquery(query):
    client = bigquery.Client()
    query_job = client.query(query)
    result = query_job.result()
    dataframe = result.to_dataframe()
    return dataframe
 
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
 
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')
 
def send_image(bot, update):
    get_and_save_image()
    chat_id = 'CHAT_ID_RECEIVER'
    bot.send_photo(chat_id=chat_id, photo=open('viz.png', 'rb'))
 
def main():
    updater = Updater('YOUR_TOKEN')
    updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6))
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
main()

Запазете файла и го наречете main.py.

Стартираме приложението, като въвеждаме командата в терминала:

python3 main.py

Всичко е готово. Сега имаме робот, състоящ се от 50 реда код, който генерира отчети без наша намеса.

Да проверим бота следователнокато изберете командата /send.

Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery

Можете да получите готовия код на моя GitHub.

Skillbox препоръчва:

Източник: www.habr.com

Добавяне на нов коментар