Sådan uddelegeres simple rapporter til en robot. Vi skriver en bot i Python og Google BigQuery

Sådan uddelegeres simple rapporter til en robot. Vi skriver en bot i Python og Google BigQuery

Har du opgaver, der gentager sig dag efter dag, uge ​​efter uge? For eksempel at skrive rapporter. Du anmoder om data, analyserer dem, visualiserer dem (laver grafer, diagrammer) og sender dem derefter til din chef. Men hvad nu hvis alt dette var automatiseret?

I denne tutorial vil vi oprette en bot til Telegram, der hjælper med at automatisere rapportering. Og det fedeste er, at hele programmet kun vil bestå af 50 linjer kode! Hvis du opretter en bot til Telegram for første gang, så bør du også læse denne indlæg.

Skillbox anbefaler: Praktisk kursus Python udvikler fra bunden.

Påmindelse: for alle læsere af "Habr" - en rabat på 10 rubler ved tilmelding til ethvert Skillbox-kursus ved hjælp af "Habr"-kampagnekoden.

Lad os komme igang

Installation af biblioteker

Vi vil bruge google-cloud-bigquery for at hente data fra Google BigQuery. matplotlib, bedøvet и pandaer hjælper dig med at visualisere dine data. python-telegram-bot vil sende de færdige data til Telegram.

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

Tilslutning af Google BigQuery API

Hvis vi vil bruge tjenesten, skal vi forbinde Google BigQuery API. For at gøre dette går vi til Google Developers Console og opret et nyt projekt (eller vælg et eksisterende).

I kontrolpanelet skal du vælge AKTIVER APIS OG TJENESTER og se efter BigQuery API.

Sådan uddelegeres simple rapporter til en robot. Vi skriver en bot i Python og Google BigQuery

Vælg Aktiver for at forbinde API'en.

Sådan uddelegeres simple rapporter til en robot. Vi skriver en bot i Python og Google BigQuery

Opret en kontonøgle

Lad os gå til igen Google Developers Console, vælg fanen Oplysninger, Opret legitimationsoplysninger og tjenestekontonøgle.

Derefter - Ny servicekonto, og indtast navnet i feltet Servicekontonavn.

Fra rullelisten Rolle skal du vælge Projekt > Ejer og derefter Opret.

Sådan uddelegeres simple rapporter til en robot. Vi skriver en bot i Python og Google BigQuery

Filen, der automatisk downloades, hedder creds.json.

Indstil GOOGLE_APPLICATION_CREDENTIALS, og angiv stien til creds.json i terminalen.

eksporter GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Hvis alt gik godt, er det tid til at begynde at skrive programmet.

Oprettelse af en applikation

Til selvstudiet vil vi bruge data fra bigquery-public-data.stackoverflow, til vores rapport vil vi vælge antallet af daglige udgivelser.

Alt er ret simpelt.

Forespørg i tabellen -> Visualiser dataene -> Gem visualiseringen -> Send billedet

Lad os oprette en funktion til at definere hver tråd.

Forespørgsel til BigQuery

Først importerer vi biblioteket.

fra google.cloud importer bigquery

Vi laver en funktion kaldet 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 funktion returnerer anmodningen som en dataramme.

Visualisering af data

For at løse dette problem skal du vælge matplotlib.

importer matplotlib.pyplot som plt

Vi har brug for fem parametre, hvor x er x-aksens data, x_label er titlen for aksen, y er y-aksens data, y_label er titlen for aksen, og title er titlen 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

Gem billedet

Lad os nu bruge to funktioner til at oprette en visualisering og gemme den.

Vi sender antallet af publicerede indlæg dagligt. Først skriver vi en anmodning.

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

Forespørgslen hjælper med at indsamle data i to uger fra den 2. december 2018.

Vi bruger denne dato, fordi 2018-12-02 er de seneste data, der er registreret i bigquery-public-data.stackoverflow.post_history, i andre tilfælde kan du bruge CURRENT_DATE() til at få de nyeste data.

Kald funktionen query_to_bigquery for at få dataene.

dataramme = query_to_bigquery(forespørgsel)

Så bruger vi datodatakolonnen for x-aksen og total_posts kolonnen for y-aksen.

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

Vi visualiserer det ved hjælp af visualize_bar_chart-funktionen og gemmer det som et billede.

plt = visualize_bar_chart(x=x, x_label='Dato', y=y, y_label='Samlet antal indlæg', title='Daglige indlæg')
plt.savefig('viz.png')

Vi pakker denne kode i en funktion kaldet 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 billede

For at sende en rapport til modtageren skal du kende parameteren chat_id.

Vi bruger brugerinfobot og skriv /start. Botten svarer med de nødvendige oplysninger, chat_id er indeholdt i id-feltet.

Lad os nu oprette send_image-funktionen. Den vil bruge funktionen get_and_save_image til at hente og gemme billedet. Og så sender vi alt til den rigtige 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 sidst opretter vi en anden funktion, hovedfunktion, for at starte applikationen. Glem ikke at ændre YOUR_TOKEN for botten.

Husk: dette program sender billedet automatisk på det tidspunkt, du angiver. For eksempel sender vi 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 vores ansøgning se sådan ud:

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

Gem filen og kald den main.py.

Vi starter applikationen ved at indtaste kommandoen i terminalen:

python3 main.py

Alt er klar. Nu har vi en robot bestående af 50 linjer kode, der genererer rapporter uden vores indgriben.

Lad os tjekke botten dermedved at vælge kommandoen /send.

Sådan uddelegeres simple rapporter til en robot. Vi skriver en bot i Python og Google BigQuery

Du kan få den færdige kode på min GitHub.

Skillbox anbefaler:

Kilde: www.habr.com

Tilføj en kommentar