Ki jan yo delege rapò senp nan yon robo. Ekri yon bot nan Python ak Google BigQuery

Ki jan yo delege rapò senp nan yon robo. Ekri yon bot nan Python ak Google BigQuery

Èske ou gen travay ki repete jou apre jou, semèn apre semèn? Pou egzanp, ekri rapò. Ou mande done, analize li, vizyalize li (fè graf, tablo), epi voye li bay bòs nan travay ou. Men, e si tout bagay sa yo te otomatik?

Nan leson patikilye sa a nou pral kreye yon bot pou Telegram ki pral ede otomatize rapò. Ak bagay ki pi fre se ke tout pwogram nan pral konpoze de sèlman 50 liy nan kòd! Si w ap kreye yon bot pou Telegram pou premye fwa, ou ta dwe li tou sa a pòs.

Skillbox rekòmande: Kou pratik Pwomotè Python soti nan grafouyen.

Nou raple: pou tout lektè "Habr" - yon rabè nan 10 rubles lè w ap enskri nan nenpòt kou Skillbox lè l sèvi avèk kòd pwomosyon "Habr".

An n kòmanse

Enstale bibliyotèk

Nou pral itilize google-cloud-bigquery pou jwenn done nan Google BigQuery. matplotlib, numpy и panda pral ede w vizyalize done ou yo. python-telegram-bot pral voye done yo fini bay Telegram.

pip3 enstale google-cloud-bigquery matplotlib numpy panda python-telegram-bot

Konekte Google BigQuery API

Si nou vle sèvi ak sèvis la, nou bezwen konekte API Google BigQuery. Pou fè sa nou ale nan Google devlopè konsole epi kreye yon nouvo pwojè (oswa chwazi youn ki deja egziste).

Nan panèl kontwòl la, chwazi AKMET APIS AK SÈVIS epi chèche API BigQuery.

Ki jan yo delege rapò senp nan yon robo. Ekri yon bot nan Python ak Google BigQuery

Chwazi Pèmèt pou konekte API a.

Ki jan yo delege rapò senp nan yon robo. Ekri yon bot nan Python ak Google BigQuery

Kreye yon kle kont

Ann ale nan ankò Google devlopè konsole, chwazi tab la kalifikasyon, Kreye kalifikasyon ak kle kont sèvis.

Lè sa a - Nouvo kont sèvis, epi antre non an nan non sèvis kont jaden an.

Soti nan lis drop-down Wòl, chwazi Pwojè> Pwopriyetè, Lè sa a, Kreye.

Ki jan yo delege rapò senp nan yon robo. Ekri yon bot nan Python ak Google BigQuery

Fichye a ki pral telechaje otomatikman yo rele creds.json.

Mete GOOGLE_APPLICATION_CREDENTIALS, espesifye chemen an nan creds.json nan tèminal la.

ekspòte GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Si tout bagay ale byen, li lè pou kòmanse ekri pwogram nan.

Kreye yon aplikasyon

Pou leson patikilye a nou pral sèvi ak done ki soti nan bigquery-public-data.stackoverflow, pou rapò nou an nou pral chwazi kantite piblikasyon chak jou.

Li trè senp.

Demande tab la -> Vizyalize done yo -> Sove vizyalizasyon an -> Voye imaj la

Ann kreye yon fonksyon pou defini chak fil.

Rechèch nan BigQuery

Premye nou enpòte bibliyotèk la.

soti nan google.cloud enpòte bigquery

Nou kreye yon fonksyon ki rele query_to_bigquery, kote paramèt la se requête.

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

Fonksyon sa a pral retounen demann lan kòm yon ankadreman done.

Vizyalize done yo

Pou rezoud pwoblèm sa a, chwazi matplotlib.

enpòte matplotlib.pyplot kòm plt

Nou bezwen senk paramèt, kote x se done aks x, x_label se tit la pou aks la, y se done aks y, y_label se tit la pou aks la, ak tit se tit la nan vizyalizasyon an antye.

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

Sove imaj la

Koulye a, kite a sèvi ak de fonksyon yo kreye yon vizyalizasyon epi sove li.

Nou pral voye kantite pòs ki pibliye chak jou. Premye nou ekri yon demann.

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

Rekèt la ede kolekte done pou de semèn apati 2 desanm 2018.

Nou itilize dat sa a paske 2018-12-02 se dènye done ki anrejistre nan bigquery-public-data.stackoverflow.post_history, nan lòt ka ou ka itilize CURRENT_DATE() pou jwenn dènye done yo.

Rele fonksyon query_to_bigquery pou jwenn done yo.

dataframe = query_to_bigquery (rekèt)

Lè sa a, nou itilize kolòn done dat pou aks x la, ak kolòn total_posts pou aks y.

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

Nou visualize li lè l sèvi avèk fonksyon visualize_bar_chart epi sove li kòm yon imaj.

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

Nou vlope kòd sa a nan yon fonksyon ki rele 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')

Voye yon imaj

Pou w ka voye yon rapò bay moun k ap resevwa a, ou bezwen konnen paramèt chat_id la.

Nou itilize userinfobot epi tape / kòmanse. Bot la reponn ak enfòmasyon ki nesesè yo, chat_id genyen nan jaden id la.

Koulye a, ann kreye fonksyon send_image. Li pral sèvi ak fonksyon get_and_save_image pou rekipere epi sove imaj la. Lè sa a, nou voye tout bagay nan kontak ki kòrèk la.

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

Pwogram prensipal la

Finalman, nou kreye yon lòt fonksyon, prensipal, pou lanse aplikasyon an. Pa bliye chanje YOUR_TOKEN pou bot la.

Sonje byen: pwogram sa a pral voye imaj la otomatikman nan moman ou presize a. Pa egzanp, nou pral voye yon rapò a nèf nan maten chak jou.

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

Kòm yon rezilta, aplikasyon nou an pral sanble sa a:

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

Sove fichye a epi rele li main.py.

Nou lanse aplikasyon an lè nou antre kòmandman an nan tèminal la:

python3 main.py

Tout pare. Koulye a, nou gen yon robo ki gen 50 liy kòd ki jenere rapò san entèvansyon nou an.

Ann tcheke bot la kon sapa chwazi / voye kòmandman an.

Ki jan yo delege rapò senp nan yon robo. Ekri yon bot nan Python ak Google BigQuery

Ou ka jwenn kòd la fini nan GitHub mwen an.

Skillbox rekòmande:

Sous: www.habr.com

Add nouvo kòmantè