Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery

Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery

Har du oppgaver som gjentar seg dag etter dag, uke etter uke? For eksempel å skrive rapporter. Du ber om data, analyserer dem, visualiserer dem (lag grafer, diagrammer), og sender dem deretter til sjefen din. Men hva om alt dette var automatisert?

I denne opplæringen vil vi lage en bot for Telegram som vil hjelpe med å automatisere rapportering. Og det kuleste er at hele programmet vil bestå av kun 50 linjer med kode! Hvis du lager en bot for Telegram for første gang, bør du også lese denne post.

Skillbox anbefaler: Praktisk kurs Python-utvikler fra bunnen av.

Vi minner om: for alle lesere av "Habr" - en rabatt på 10 000 rubler når du melder deg på et hvilket som helst Skillbox-kurs ved å bruke kampanjekoden "Habr".

La oss komme i gang

Installere biblioteker

Vi vil bruke google-cloud-bigquery for å hente data fra Google BigQuery. matplotlib, følelsesløs и pandaer vil hjelpe deg med å visualisere dataene dine. python-telegram-bot vil sende de ferdige dataene til Telegram.

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

Kobler til Google BigQuery API

Hvis vi vil bruke tjenesten, må vi koble til Google BigQuery API. For å gjøre dette går vi til Google Developers Console og opprett et nytt prosjekt (eller velg et eksisterende).

I kontrollpanelet velger du ENABLE APIS AND SERVICES og ser etter BigQuery API.

Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery

Velg Aktiver for å koble til API.

Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery

Opprett en kontonøkkel

La oss gå til igjen Google Developers Console, velg påloggingsfanen, Opprett påloggingsinformasjon og tjenestekontonøkkel.

Deretter - Ny tjenestekonto, og skriv inn navnet i feltet Tjenestekontonavn.

Fra rullegardinlisten Rolle velger du Prosjekt > Eier og deretter Opprett.

Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery

Filen som automatisk lastes ned heter creds.json.

Angi GOOGLE_APPLICATION_CREDENTIALS, spesifiser banen til creds.json i terminalen.

eksporter GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Hvis alt gikk bra, er det på tide å begynne å skrive programmet.

Opprette en applikasjon

For opplæringen vil vi bruke data fra bigquery-public-data.stackoverflow, for rapporten vår vil vi velge antall daglige publikasjoner.

Alt er ganske enkelt.

Spørr tabellen -> Visualiser dataene -> Lagre visualiseringen -> Send bildet

La oss lage en funksjon for å definere hver tråd.

Spørring til BigQuery

Først importerer vi biblioteket.

fra google.cloud importer bigquery

Vi lager en funksjon kalt query_to_bigquery, hvor parameteren er query.

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

Denne funksjonen vil returnere forespørselen som en dataramme.

Visualisere data

For å løse dette problemet, velg matplotlib.

importer matplotlib.pyplot som plt

Vi trenger fem parametere, der x er x-aksedata, x_label er tittelen for aksen, y er y-aksedata, y_label er tittelen for aksen og tittel er tittelen på hele visualiseringen.

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

Lagre bildet

La oss nå bruke to funksjoner for å lage en visualisering og lagre den.

Vi vil sende antall publiserte innlegg daglig. Først skriver vi en forespørsel.

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

Spørringen hjelper til med å samle inn data i to uker fra og med 2. desember 2018.

Vi bruker denne datoen fordi 2018-12-02 er de siste dataene registrert i bigquery-public-data.stackoverflow.post_history, i andre tilfeller kan du bruke CURRENT_DATE() for å få de nyeste dataene.

Ring query_to_bigquery-funksjonen for å få dataene.

dataramme = query_to_bigquery(query)

Deretter bruker vi datodatakolonnen for x-aksen, og total_posts-kolonnen for y-aksen.

x = dataramme['date'].tolist()
y = dataramme['total_posts'].tolist()

Vi visualiserer det ved å bruke visualize_bar_chart-funksjonen og lagrer det som et bilde.

plt = visualize_bar_chart(x=x, x_label='Dato', y=y, y_label='Totalt antall innlegg', title='Daglige innlegg')
plt.savefig('viz.png')

Vi pakker denne koden inn i en funksjon kalt 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')

Send et bilde

For å sende en rapport til mottakeren må du kjenne til parameteren chat_id.

Vi bruker brukerinfobot og skriv /start. Boten svarer med nødvendig informasjon, chat_id finnes i id-feltet.

La oss nå lage send_image-funksjonen. Den vil bruke funksjonen get_and_save_image for å hente og lagre bildet. Og så sender vi alt til riktig kontakt.

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

Hovedprogram

Til slutt lager vi en annen funksjon, hovedfunksjon, for å starte applikasjonen. Ikke glem å endre YOUR_TOKEN for boten.

Husk: dette programmet vil sende bildet automatisk på det tidspunktet du angir. Vi vil for eksempel sende en rapport klokken ni om morgenen hver dag.

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

Som et resultat vil søknaden vår se slik ut:

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

Lagre filen og kall den main.py.

Vi starter applikasjonen ved å skrive inn kommandoen i terminalen:

python3 main.py

Alt er klart. Nå har vi en robot bestående av 50 linjer med kode som genererer rapporter uten vår innblanding.

La oss sjekke boten deravved å velge /send-kommandoen.

Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery

Du kan få den ferdige koden på min GitHub.

Skillbox anbefaler:

Kilde: www.habr.com

Legg til en kommentar