Kif tiddelega rapporti sempliċi lil robot. Aħna niktbu bot f'Python u Google BigQuery

Kif tiddelega rapporti sempliċi lil robot. Aħna niktbu bot f'Python u Google BigQuery

Għandek kompiti li jirrepetu jum wara jum, ġimgħa wara ġimgħa? Per eżempju, bil-miktub rapporti. Titlob id-dejta, tanalizzaha, viżivaha (agħmel graffs, charts), u mbagħad ibgħatha lill-imgħallem tiegħek. Imma x'jiġri jekk dan kollu kien awtomatizzat?

F'dan it-tutorja se noħolqu bot għal Telegram li se jgħin biex awtomat ir-rappurtar. U l-iktar ħaġa sabiħa hija li l-programm kollu se jikkonsisti biss minn 50 linja ta 'kodiċi! Jekk qed toħloq bot għal Telegram għall-ewwel darba, allura għandek taqra dan ukoll wara.

Skillbox jirrakkomanda: Kors prattiku Iżviluppatur Python mill-bidu.

Infakkrukom: għall-qarrejja kollha ta '"Habr" - skont ta' 10 rublu meta tirreġistra fi kwalunkwe kors ta 'Skillbox billi tuża l-kodiċi promozzjonali "Habr".

Ejja nibdew

Installazzjoni ta' libreriji

Aħna nużaw google-cloud-bigquery biex tikseb data minn Google BigQuery. matplotlib, numpy и panda se jgħinek Ħares id-data tiegħek. python-telegram-bot se tibgħat id-data lesta lil Telegram.

pip3 installa google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Konnessjoni ta' Google BigQuery API

Jekk irridu nużaw is-servizz, irridu nikkonnettjaw il-Google BigQuery API. Biex nagħmlu dan immorru Google Developers Console u toħloq proġett ġdid (jew agħżel wieħed eżistenti).

Fil-pannell tal-kontroll, agħżel ENABLE APIS AND SERVICES u fittex BigQuery API.

Kif tiddelega rapporti sempliċi lil robot. Aħna niktbu bot f'Python u Google BigQuery

Agħżel Ippermettiet biex tikkonnettja l-API.

Kif tiddelega rapporti sempliċi lil robot. Aħna niktbu bot f'Python u Google BigQuery

Oħloq ċavetta tal-kont

Ejja mmorru għal darb'oħra Google Developers Console, agħżel it-tab tal-Kredenzjali, Oħloq kredenzjali u ċavetta tal-kont tas-Servizz.

Imbagħad - Kont tas-servizz ġdid, u daħħal l-isem fil-qasam Isem tal-kont tas-servizz.

Mil-lista drop-down Rwol, agħżel Proġett > Sid, imbagħad Oħloq.

Kif tiddelega rapporti sempliċi lil robot. Aħna niktbu bot f'Python u Google BigQuery

Il-fajl li se jitniżżel awtomatikament jissejjaħ creds.json.

Issettja GOOGLE_APPLICATION_CREDENTIALS, billi tispeċifika t-triq għal creds.json fit-terminal.

esporta GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Jekk kollox mar tajjeb, wasal iż-żmien li tibda tikteb il-programm.

Ħolqien ta' applikazzjoni

Għat-tutorja se nużaw dejta minn bigquery-public-data.stackoverflow, għar-rapport tagħna se nagħżlu n-numru ta 'pubblikazzjonijiet ta' kuljum.

Kollox huwa pjuttost sempliċi.

Mistoqsija t-tabella -> Ħares id-dejta -> Issejvja l-viżwalizzazzjoni -> Ibgħat l-immaġni

Ejja noħolqu funzjoni waħda biex tiddefinixxi kull ħajta.

Mistoqsija lil BigQuery

L-ewwel aħna jimportaw il-librerija.

minn google.cloud import bigquery

Noħolqu funzjoni msejħa query_to_bigquery, fejn il-parametru huwa query.

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

Din il-funzjoni tirritorna t-talba bħala qafas tad-dejta.

Viżwalizzazzjoni tad-data

Biex issolvi din il-problema, agħżel matplotlib.

importazzjoni matplotlib.pyplot bħala plt

Għandna bżonn ħames parametri, fejn x hija d-dejta tal-assi x, x_label huwa t-titlu għall-assi, y hija d-dejta tal-assi y, y_label huwa t-titlu għall-assi, u t-titlu huwa t-titlu tal-viżwalizzazzjoni kollha.

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

Issejvja l-immaġni

Issa ejja nużaw żewġ funzjonijiet biex noħolqu viżwalizzazzjoni u ssalvaha.

Aħna se nibagħtu n-numru ta 'postijiet ippubblikati kuljum. L-ewwel niktbu talba.

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

Il-mistoqsija tgħin biex tiġbor id-dejta għal ġimgħatejn li jibdew mit-2 ta’ Diċembru 2018.

Aħna nużaw din id-data għaliex 2018-12-02 hija l-aħħar data rreġistrata fi bigquery-public-data.stackoverflow.post_history, f'każijiet oħra tista' tuża CURRENT_DATE() biex tikseb l-aktar data ġdida.

Ċempel il-funzjoni query_to_bigquery biex tikseb id-dejta.

dataframe = query_to_bigquery (mistoqsija)

Imbagħad nużaw il-kolonna tad-data tad-data għall-assi x, u l-kolonna total_posts għall-assi y.

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

Aħna nħarsuha billi tuża l-funzjoni visualize_bar_chart u nissejvjaha bħala immaġini.

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

Aħna nagħlaq dan il-kodiċi f'funzjoni msejħa 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')

Ibgħat immaġini

Sabiex tibgħat rapport lir-riċevitur, trid tkun taf il-parametru chat_id.

Aħna nużaw userinfobot u tip /start. Il-bot jirrispondi bl-informazzjoni meħtieġa, chat_id jinsab fil-qasam id.

Issa ejja noħolqu l-funzjoni send_image. Se tuża l-funzjoni get_and_save_image biex tirkupra u tissejvja l-immaġni. U mbagħad nibagħtu kollox lill-kuntatt korrett.

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

Programm ewlieni

Fl-aħħarnett, noħolqu funzjoni oħra, prinċipali, biex iniedu l-applikazzjoni. Tinsiex tibdel YOUR_TOKEN għall-bot.

Ftakar: dan il-programm jibgħat l-immaġni awtomatikament fil-ħin li tispeċifika. Pereżempju, nibagħtu rapport fid-disgħa ta’ filgħodu kuljum.

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

Bħala riżultat, l-applikazzjoni tagħna se tidher bħal din:

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

Issejvja l-fajl u sejjaħlu main.py.

Inniedu l-applikazzjoni billi ndaħħlu l-kmand fit-terminal:

python3 main.py

Kollox lest. Issa għandna robot magħmul minn 50 linja ta 'kodiċi li jiġġenera rapporti mingħajr l-intervent tagħna.

Ejja niċċekkjaw il-bot għalhekkbilli tagħżel il-kmand /send.

Kif tiddelega rapporti sempliċi lil robot. Aħna niktbu bot f'Python u Google BigQuery

Tista 'tikseb il-kodiċi lest fuq GitHub tiegħi.

Skillbox jirrakkomanda:

Sors: www.habr.com

Żid kumment