Nola delegatu txosten sinpleak robot bati. Bot bat idazten dugu Python eta Google BigQuery-n

Nola delegatu txosten sinpleak robot bati. Bot bat idazten dugu Python eta Google BigQuery-n

Egunez egun, astez aste errepikatzen diren zereginak dituzu? Adibidez, txostenak idaztea. Datuak eskatu, aztertu, bistaratu (grafikoak, taulak egin) eta, ondoren, zure nagusiari bidaltzen dizkiozu. Baina hori guztia automatizatuta egongo balitz?

Tutorial honetan Telegramentzako bot bat sortuko dugu, txostenak automatizatzen lagunduko duena. Eta gauzarik politena da programa osoa 50 kode lerroz soilik osatuta egongo dela! Telegramerako bot bat sortzen ari bazara lehen aldiz, hau ere irakurri beharko zenuke post.

Skillbox-ek gomendatzen du: Ikastaro praktikoa Python garatzailea hutsetik.

Gogoratzen dugu: "Habr" irakurle guztientzat - 10 errubloko deskontua "Habr" promozio-kodea erabiliz Skillbox-eko edozein ikastarotan izena ematean.

Has gaitezen

Liburutegiak instalatzea

Erabiliko dugu google-cloud-bigquery Google BigQuery-ren datuak lortzeko. matplotlib, numpy ΠΈ pandas zure datuak bistaratzen lagunduko dizu. python-telegram-bot amaitutako datuak Telegram-era bidaliko ditu.

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

Google BigQuery APIa konektatzen

Zerbitzua erabili nahi badugu, Google BigQuery APIa konektatu behar dugu. Horretarako joango gara Google Developers Console eta sortu proiektu berri bat (edo hautatu lehendik dagoen bat).

Kontrol-panelean, hautatu GAITU APIAK ETA ZERBITZUAK eta bilatu BigQuery APIa.

Nola delegatu txosten sinpleak robot bati. Bot bat idazten dugu Python eta Google BigQuery-n

Hautatu Gaitu APIa konektatzeko.

Nola delegatu txosten sinpleak robot bati. Bot bat idazten dugu Python eta Google BigQuery-n

Sortu kontu-gako bat

Goazen berriro Google Developers Console, hautatu Kredentzialak fitxa, Sortu kredentzialak eta Zerbitzu-kontuaren gakoa.

Ondoren - Zerbitzu-kontu berria, eta idatzi izena Zerbitzu-kontuaren izena eremuan.

Eginkizuna goitibeherako zerrendan, hautatu Proiektua > Jabea, eta gero Sortu.

Nola delegatu txosten sinpleak robot bati. Bot bat idazten dugu Python eta Google BigQuery-n

Automatikoki deskargatuko den fitxategia creds.json deitzen da.

Ezarri GOOGLE_APPLICATION_CREDENTIALS, terminalean creds.json-erako bidea zehaztuz.

esportatu GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Dena ondo joan bada, programa idazten hasteko ordua da.

Aplikazio bat sortzea

Tutorialerako bigquery-public-data.stackoverflow-ko datuak erabiliko ditugu, gure txostenerako eguneroko argitalpen kopurua hautatuko dugu.

Nahiko erraza da.

Kontsultatu taula -> Ikusi datuak -> Gorde bistaratzea -> Bidali irudia

Sortu dezagun funtzio bat hari bakoitza definitzeko.

Kontsultatu BigQuery-ri

Lehenik eta behin liburutegia inportatzen dugu.

google.cloud inportatu bigquery-tik

Query_to_bigquery izeneko funtzioa sortzen dugu, non parametroa query den.

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

Funtzio honek eskaera datu-marko gisa itzuliko du.

Datuak bistaratzea

Arazo hau konpontzeko, aukeratu matplotlib.

inportatu matplotlib.pyplot plt gisa

Bost parametro behar ditugu, non x x ardatzaren datuak, x_label ardatzaren izenburua, y y ardatzaren datuak, y_label ardatzaren izenburua eta izenburua bistaratze osoaren izenburua.

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

Gorde irudia

Orain erabil ditzagun bi funtzio bisualizazio bat sortzeko eta gordetzeko.

Egunero argitaratzen diren mezu kopurua bidaliko dugu. Lehenengo eskaera bat idazten dugu.

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

Kontsultak bi astez datuak biltzen laguntzen du 2ko abenduaren 2018tik aurrera.

Data hau erabiltzen dugu 2018-12-02 bigquery-public-data.stackoverflow.post_history-en erregistratutako azken datuak direlako, beste kasu batzuetan CURRENT_DATE() erabil dezakezu datu berrienak lortzeko.

Deitu query_to_bigquery funtzioari datuak lortzeko.

datu-markoa = kontsulta_bigquery(kontsulta)

Ondoren, dataren datuen zutabea erabiltzen dugu x ardatzerako, eta total_posts zutabea y ardatzerako.

x = datu-markoa['data'].tolist()
y = datu-markoa['guztizko_mezuak'].tolist()

Visualize_bar_chart funtzioa erabiliz bistaratzen dugu eta irudi gisa gordetzen dugu.

plt = visualize_bar_chart(x=x, x_label='Data', y=y, y_label='Guztira argitalpenak', title='Eguneroko argitalpenak')
plt.savefig('viz.png')

Kode hau get_and_save_image izeneko funtzio batean biltzen dugu.

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

Bidali irudi bat

Hartzaileari txosten bat bidaltzeko, chat_id parametroa ezagutu behar duzu.

Erabiltzen dugu userinfobot eta idatzi /hasi. Botak beharrezko informazioarekin erantzuten du, chat_id id eremuan dago.

Orain sor dezagun send_image funtzioa. get_and_save_image funtzioa erabiliko du irudia berreskuratzeko eta gordetzeko. Eta gero dena kontaktu zuzenari bidaltzen diogu.

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

Programa nagusia

Azkenik, beste funtzio bat sortzen dugu, nagusia, aplikazioa abiarazteko. Ez ahaztu bot-rako YOUR_TOKEN aldatzea.

Gogoratu: programa honek irudia automatikoki bidaliko du zuk zehaztutako unean. Adibidez, egunero goizeko bederatzietan txosten bat bidaliko dugu.

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

Ondorioz, gure aplikazioak itxura hau izango du:

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

Gorde fitxategia eta deitu main.py.

Aplikazioa abiarazten dugu komandoa terminalean sartuz:

python3 main.py

Dena prest dago. Orain gure esku-hartzerik gabe txostenak sortzen dituen 50 kode lerroz osatutako robot bat dugu.

Ikus dezagun bot-a beraz,/send komandoa hautatuz.

Nola delegatu txosten sinpleak robot bati. Bot bat idazten dugu Python eta Google BigQuery-n

Amaitutako kodea hemen lor dezakezu nire GitHub.

Skillbox-ek gomendatzen du:

Iturria: www.habr.com

Gehitu iruzkin berria