Kā deleģēt vienkāršas atskaites robotam. Bota rakstīšana programmās Python un Google BigQuery

Kā deleģēt vienkāršas atskaites robotam. Bota rakstīšana programmās Python un Google BigQuery

Vai jums ir uzdevumi, kas atkārtojas dienu no dienas, nedēļu pēc nedēļas? Piemēram, ziņojumu rakstīšana. Jūs pieprasāt datus, analizējiet tos, vizualizējiet (veidojiet grafikus, diagrammas) un pēc tam nosūtiet to savam priekšniekam. Bet ja tas viss būtu automatizēts?

Šajā apmācībā mēs izveidosim Telegram robotprogrammu, kas palīdzēs automatizēt ziņošanu. Un pats foršākais ir tas, ka visa programma sastāvēs tikai no 50 koda rindām! Ja telegrammas robotu veidojat pirmo reizi, jums vajadzētu izlasīt arī šo post.

Skillbox iesaka: Praktiskais kurss Python izstrādātājs no nulles.

Atgādinām: visiem "Habr" lasītājiem - atlaide 10 000 rubļu, reģistrējoties jebkurā Skillbox kursā, izmantojot "Habr" reklāmas kodu.

Sāksim

Bibliotēku instalēšana

Mēs izmantosim google-cloud-bigquery lai iegūtu datus no Google BigQuery. matplotlib, dūšīgs и pandas palīdzēs vizualizēt datus. python-telegram-bot nosūtīs gatavos datus uz Telegram.

pip3 instalēt google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API savienojuma izveide

Ja vēlamies izmantot pakalpojumu, mums ir jāpievieno Google BigQuery API. Lai to izdarītu, mēs ejam uz Google izstrādātāju konsoles un izveidojiet jaunu projektu (vai atlasiet esošu).

Vadības panelī atlasiet IESPĒJOT API UN PAKALPOJUMU un meklējiet BigQuery API.

Kā deleģēt vienkāršas atskaites robotam. Bota rakstīšana programmās Python un Google BigQuery

Atlasiet Iespējot, lai izveidotu savienojumu ar API.

Kā deleģēt vienkāršas atskaites robotam. Bota rakstīšana programmās Python un Google BigQuery

Izveidojiet konta atslēgu

Iesim vēlreiz Google izstrādātāju konsoles, atlasiet cilni Akreditācijas dati, Izveidot akreditācijas datus un pakalpojuma konta atslēgu.

Pēc tam — Jauns pakalpojuma konts un laukā Pakalpojuma konta nosaukums ievadiet nosaukumu.

Nolaižamajā sarakstā Loma atlasiet Projekts > Īpašnieks un pēc tam — Izveidot.

Kā deleģēt vienkāršas atskaites robotam. Bota rakstīšana programmās Python un Google BigQuery

Fails, kas tiks automātiski lejupielādēts, tiek saukts par creds.json.

Iestatiet GOOGLE_APPLICATION_CREDENTIALS, terminālī norādot ceļu uz creds.json.

eksportēt GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ja viss noritēja labi, ir laiks sākt rakstīt programmu.

Aplikācijas izveide

Apmācībai mēs izmantosim datus no bigquery-public-data.stackoverflow, pārskatā mēs atlasīsim ikdienas publikāciju skaitu.

Viss ir pavisam vienkārši.

Vaicājiet tabulu -> Vizualizēt datus -> Saglabāt vizualizāciju -> Nosūtīt attēlu

Izveidosim vienu funkciju, lai definētu katru pavedienu.

Vaicājums BigQuery

Vispirms mēs importējam bibliotēku.

no google.cloud importa bigquery

Mēs izveidojam funkciju ar nosaukumu query_to_bigquery, kur parametrs ir vaicājums.

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

Šī funkcija atgriezīs pieprasījumu kā datu rāmi.

Datu vizualizācija

Lai atrisinātu šo problēmu, izvēlieties matplotlib.

importēt matplotlib.pyplot kā plt

Mums ir nepieciešami pieci parametri, kur x ir x ass dati, x_label ir ass nosaukums, y ir y ass dati, y_label ir ass nosaukums un nosaukums ir visas vizualizācijas nosaukums.

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

Saglabājiet attēlu

Tagad izmantosim divas funkcijas, lai izveidotu vizualizāciju un saglabātu to.

Publicēto ziņu skaitu nosūtīsim katru dienu. Vispirms mēs uzrakstām pieprasījumu.

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

Vaicājums palīdz apkopot datus par divām nedēļām, sākot no 2. gada 2018. decembra.

Mēs izmantojam šo datumu, jo 2018-12-02 ir jaunākie dati, kas ierakstīti failā bigquery-public-data.stackoverflow.post_history, citos gadījumos varat izmantot CURRENT_DATE(), lai iegūtu jaunākos datus.

Lai iegūtu datus, izsauciet funkciju query_to_bigquery.

datu rāmis = query_to_bigquery(query)

Pēc tam mēs izmantojam datuma datu kolonnu x asij un sleju total_posts y asij.

x = datu rāmis['datums'].tolist()
y = datu rāmis['total_posts'].tolist()

Mēs to vizualizējam, izmantojot visualize_bar_chart funkciju, un saglabājam kā attēlu.

plt = visualize_bar_chart(x=x, x_label='Datums', y=y, y_label='Kopējais ziņu skaits', title='Dienas ziņas')
plt.savefig('viz.png')

Mēs iesaiņojam šo kodu funkcijā 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')

Nosūtiet attēlu

Lai nosūtītu ziņojumu adresātam, jums jāzina parametrs chat_id.

Mēs izmantojam lietotāja infobots un ierakstiet /sākt. Bots atbild ar nepieciešamo informāciju, id laukā ir ietverts chat_id.

Tagad izveidosim funkciju send_image. Tas izmantos funkciju get_and_save_image, lai izgūtu un saglabātu attēlu. Un tad mēs visu nosūtām pareizajam kontaktam.

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

Galvenā programma

Visbeidzot, mēs izveidojam citu funkciju, galveno, lai palaistu lietojumprogrammu. Neaizmirstiet nomainīt YOUR_TOKEN robotam.

Atcerieties: šī programma automātiski nosūtīs attēlu jūsu norādītajā laikā. Piemēram, mēs katru dienu nosūtīsim ziņojumu deviņos no rīta.

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

Rezultātā mūsu lietojumprogramma izskatīsies šādi:

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

Saglabājiet failu un nosauciet to main.py.

Mēs palaižam lietojumprogrammu, terminālī ievadot komandu:

python3 main.py

Viss ir gatavs. Tagad mums ir robots, kas sastāv no 50 koda rindām, kas ģenerē atskaites bez mūsu iejaukšanās.

Pārbaudīsim botu tātadizvēloties komandu / send.

Kā deleģēt vienkāršas atskaites robotam. Bota rakstīšana programmās Python un Google BigQuery

Gatavo kodu varat iegūt vietnē mans GitHub.

Skillbox iesaka:

Avots: www.habr.com

Pievieno komentāru