Cumu delegate rapporti simplici à un robot. Scrivemu un bot in Python è Google BigQuery

Cumu delegate rapporti simplici à un robot. Scrivemu un bot in Python è Google BigQuery

Avete travaglii chì si ripetenu ghjornu dopu ghjornu, settimana dopu settimana? Per esempiu, scrive rapporti. Richiede dati, analizà, visualisate (fate grafici, charts), è poi mandate à u vostru capu. Ma chì si tuttu questu era automatizatu?

In questu tutoriale creeremu un bot per Telegram chì aiuterà à automatizà a rappurtazione. È a cosa più bella hè chì tuttu u prugramma serà custituitu da solu 50 linee di codice! Sè vo site à creà un bot per Telegram per a prima volta, allora duvete ancu leghje questu post.

Skillbox consiglia: Corso praticu Sviluppatore Python da zero.

Ramintemu: per tutti i lettori di "Habr" - un scontu di 10 000 rubles quandu si iscrizzione in ogni cursu Skillbox cù u codice promozionale "Habr".

Cuminciamu

Installazione di librerie

Avemu da aduprà google-cloud-bigquery pè ottene dati da Google BigQuery. matplotlib, numpia и pandas vi aiuterà à visualizà i vostri dati. python-telegram-bot manderà i dati finiti à Telegram.

pip3 installà google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Cunnettendu l'API Google BigQuery

Se vulemu usà u serviziu, avemu bisognu di cunnette l'API Google BigQuery. Per fà questu andemu à Google Console Developers è creanu un novu prughjettu (o selezziunate un esistente).

In u pannellu di cuntrollu, selezziunate ENABLE APIS AND SERVICES è cercate BigQuery API.

Cumu delegate rapporti simplici à un robot. Scrivemu un bot in Python è Google BigQuery

Sceglite Enable per cunnette l'API.

Cumu delegate rapporti simplici à un robot. Scrivemu un bot in Python è Google BigQuery

Crea una chjave di u contu

Andemu di novu Google Console Developers, selezziunate a tabulazione Credenziali, Crea credenziali è Chjave di u contu di serviziu.

Allora - New contu serviziu, è entre u nomu in u campu di u nomu contu Service.

Da a lista di Rule, selezziunate Prughjettu> Proprietariu, dopu Crea.

Cumu delegate rapporti simplici à un robot. Scrivemu un bot in Python è Google BigQuery

U schedariu chì serà scaricatu automaticamente hè chjamatu creds.json.

Stabilisci GOOGLE_APPLICATION_CREDENTIALS, specificendu u percorsu à creds.json in u terminal.

esportà GOOGLE_APPLICATION_CREDENTIALS = '[PATH_TO_CREDS.JSON]'

Sè tuttu andava bè, hè ora di cumincià à scrive u prugramma.

Crià una applicazione

Per u tutoriale useremu dati da bigquery-public-data.stackoverflow, per u nostru rapportu selezziunate u numeru di publicazioni di ogni ghjornu.

Tuttu hè abbastanza simplice.

Query the table -> Visualize the data -> Save the visualization -> Send the image

Creemu una funzione per definisce ogni filu.

Interroga à BigQuery

Prima avemu impurtà a biblioteca.

da google.cloud import bigquery

Creemu una funzione chjamata query_to_bigquery, induve u paràmetru hè query.

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

Sta funzione torna a dumanda cum'è un quadru di dati.

Visualizà i dati

Per risolve stu prublema, sceglite matplotlib.

impurtà matplotlib.pyplot cum'è plt

Avemu bisognu di cinque paràmetri, induve x hè a data di l'assi x, x_label hè u titulu per l'assi, y hè a data di l'assi y, y_label hè u titulu per l'assi, è u titulu hè u titulu di a visualizazione sana.

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

Salvà l'imagine

Avà usemu duie funzioni per creà una visualizazione è salvà.

Manderemu u numeru di posti publicati ogni ghjornu. Prima scrivemu una dumanda.

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
        """

A dumanda aiuta à cullà dati per duie settimane à partesi da u 2 di dicembre di u 2018.

Avemu aduprà sta data perchè 2018-12-02 hè l'ultime dati arregistrati in bigquery-public-data.stackoverflow.post_history, in altri casi pudete aduprà CURRENT_DATE () per uttene i dati più recenti.

Chjamate a funzione query_to_bigquery per uttene i dati.

dataframe = query_to_bigquery (interrogazione)

Allora usemu a colonna di data data per l'assi x, è a colonna total_posts per l'assi y.

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

Visualizemu cù a funzione visualize_bar_chart è salvemu cum'è una maghjina.

plt = visualize_bar_chart(x=x, x_label='Data', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')

Imbulighjamu stu codice in una funzione chjamata 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')

Mandate una maghjina

Per mandà un rapportu à u destinatariu, avete bisognu di cunnosce u paràmetru chat_id.

Avemu aduprà userinfobot è scrive / start. U bot risponde cù l'infurmazioni necessarii, chat_id hè cuntenutu in u campu id.

Avà criemu a funzione send_image. Aduprà a funzione get_and_save_image per ricuperà è salvà l'imaghjini. E poi mandemu tuttu à u cuntattu currettu.

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'))

Prugramma principale

Infine, creamu una altra funzione, principale, per lancià l'applicazione. Ùn vi scurdate di cambià YOUR_TOKEN per u bot.

Ricurdativi: stu prugramma mandarà l'imaghjini automaticamente à u mumentu chì specificate. Per esempiu, manderemu un rapportu à nove ore di a matina ogni ghjornu.

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()

In u risultatu, a nostra applicazione sarà cusì:

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()

Salvà u schedariu è chjamate main.py.

Lanciamu l'applicazione inserendu u cumandamentu in u terminal:

python3 main.py

Tuttu hè prontu. Avà avemu un robot custituitu di 50 linee di codice chì genera rapporti senza a nostra intervenzione.

Cuntrollamu u bot da quìscegliendu u cumandimu / manda.

Cumu delegate rapporti simplici à un robot. Scrivemu un bot in Python è Google BigQuery

Pudete ottene u codice finitu à u mo GitHub.

Skillbox consiglia:

Source: www.habr.com

Add a comment