Kiel delegi simplajn raportojn al roboto. Skribante bot en Python kaj Google BigQuery

Kiel delegi simplajn raportojn al roboto. Skribante bot en Python kaj Google BigQuery

Ĉu vi havas taskojn, kiuj ripetas tagon post tago, semajnon post semajno? Ekzemple, verkado de raportoj. Vi petas datumojn, analizas ĝin, bildigas ĝin (faru grafikaĵojn, diagramojn), kaj poste sendas ĝin al via estro. Sed kio se ĉio ĉi estus aŭtomatigita?

En ĉi tiu lernilo ni kreos bot por Telegramo, kiu helpos aŭtomatigi raportadon. Kaj la plej bonega afero estas, ke la tuta programo konsistos el nur 50 linioj de kodo! Se vi kreas roboton por Telegramo por la unua fojo, tiam vi ankaŭ devus legi ĉi tiun afiŝo.

Skillbox rekomendas: Praktika kurso Python-programisto de nulo.

Ni memorigas vin: por ĉiuj legantoj de "Habr" - rabato de 10 000 rubloj kiam oni enskribas en iu ajn Skillbox-kurso per la reklamkodo "Habr".

Ni komencu

Instalado de bibliotekoj

Ni uzos google-cloud-bigquery akiri datumojn de Google BigQuery. matplotlib, numpy и pandoj helpos vin vidi viajn datumojn. python-telegram-bot sendos la finitajn datumojn al Telegramo.

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

Konektante Google BigQuery API

Se ni volas uzi la servon, ni devas konekti la Google BigQuery API. Por fari tion ni iru al Google Developers-konzolo kaj kreu novan projekton (aŭ elektu ekzistantan).

En la kontrolpanelo, elektu AKTIVI API KAJ SERVOJ kaj serĉu BigQuery API.

Kiel delegi simplajn raportojn al roboto. Skribante bot en Python kaj Google BigQuery

Elektu Ebligi por konekti la API.

Kiel delegi simplajn raportojn al roboto. Skribante bot en Python kaj Google BigQuery

Kreu kontŝlosilon

Ni iru al denove Google Developers-konzolo, elektu la langeton Akreditaĵojn, Kreu akreditaĵojn kaj Ŝlosilon pri Serva konto.

Tiam - Nova serva konto, kaj enigu la nomon en la kampon pri nomo de Serva konto.

El la fallisto Rolo, elektu Projekto > Posedanto, tiam Krei.

Kiel delegi simplajn raportojn al roboto. Skribante bot en Python kaj Google BigQuery

La dosiero, kiu estos aŭtomate elŝutita, nomiĝas creds.json.

Agordu GOOGLE_APPLICATION_CREDENTIALS, specifante la vojon al creds.json en la terminalo.

eksporti GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Se ĉio iris bone, estas tempo komenci verki la programon.

Kreante aplikaĵon

Por la lernilo ni uzos datumojn de bigquery-public-data.stackoverflow, por nia raporto ni elektos la nombron da ĉiutagaj publikaĵoj.

Ĉio estas sufiĉe simpla.

Pridemandu la tabelon -> Vidigu la datumojn -> Konservu la bildigon -> Sendu la bildon

Ni kreu unu funkcion por difini ĉiun fadenon.

Demandu al BigQuery

Unue ni importas la bibliotekon.

de google.cloud import bigquery

Ni kreas funkcion nomatan query_to_bigquery, kie la parametro estas query.

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

Ĉi tiu funkcio resendos la peton kiel datumkadro.

Vidigo de datumoj

Por solvi ĉi tiun problemon, elektu matplotlib.

importu matplotlib.pyplot kiel plt

Ni bezonas kvin parametrojn, kie x estas la x-aksa datumoj, x_label estas la titolo por la akso, y estas la y-aksa datumoj, y_label estas la titolo por la akso, kaj titolo estas la titolo de la tuta bildigo.

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

Konservu la bildon

Nun ni uzu du funkciojn por krei bildigon kaj konservi ĝin.

Ni sendos la nombron da afiŝoj eldonitaj ĉiutage. Unue ni skribas peton.

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

La demando helpas kolekti datumojn dum du semajnoj ekde la 2-a de decembro 2018.

Ni uzas ĉi tiun daton ĉar 2018-12-02 estas la plej novaj datumoj registritaj en bigquery-public-data.stackoverflow.post_history, en aliaj kazoj vi povas uzi CURRENT_DATE() por akiri la plej novajn datumojn.

Voku la funkcion query_to_bigquery por akiri la datumojn.

datumkadro = demand_al_bigquery (demando)

Tiam ni uzas la datan datumkolumnon por la x-akso, kaj la total_posts-kolumnon por la y-akso.

x = datumkadro['dato'].tolist()
y = datumkadro ['total_afiŝoj'].tolist()

Ni bildigas ĝin per la funkcio visualize_bar_chart kaj konservas ĝin kiel bildon.

plt = visualize_bar_chart (x=x, x_label='Dato', y=y, y_label='Tutaj Afiŝoj', title='Ĉiutagaj Afiŝoj')
plt.savefig('viz.png')

Ni envolvas ĉi tiun kodon en funkcio nomata 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')

Sendu bildon

Por sendi raporton al la ricevanto, vi devas scii la parametron chat_id.

Ni uzas uzantinfobot kaj tajpu /komencon. La bot respondas kun la necesaj informoj, chat_id estas enhavita en la id-kampo.

Nun ni kreu la funkcion send_image. Ĝi uzos la funkcion get_and_save_image por retrovi kaj konservi la bildon. Kaj tiam ni sendas ĉion al la ĝusta kontakto.

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

Ĉefa programo

Fine, ni kreas alian funkcion, ĉefa, por lanĉi la aplikaĵon. Ne forgesu ŝanĝi YOUR_TOKEN por la bot.

Memoru: ĉi tiu programo sendos la bildon aŭtomate je la tempo, kiun vi specifos. Ekzemple, ni sendos raporton je la naŭa matene ĉiutage.

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

Kiel rezulto, nia aplikaĵo aspektos jene:

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

Konservu la dosieron kaj nomu ĝin main.py.

Ni lanĉas la aplikaĵon enmetante la komandon en la terminalo:

python3 ĉefa.py

Ĉio estas preta. Nun ni havas roboton konsistantan el 50 linioj de kodo, kiu generas raportojn sen nia interveno.

Ni kontrolu la bot de ĉi tieelektante la komandon /send.

Kiel delegi simplajn raportojn al roboto. Skribante bot en Python kaj Google BigQuery

Vi povas akiri la finitan kodon ĉe mia GitHub.

Skillbox rekomendas:

fonto: www.habr.com

Aldoni komenton