Hoe u eenvoudige rapporten kunt delegeren aan een robot. We schrijven een bot in Python en Google BigQuery

Hoe u eenvoudige rapporten kunt delegeren aan een robot. We schrijven een bot in Python en Google BigQuery

Heeft u taken die zich dag na dag, week na week herhalen? Bijvoorbeeld het schrijven van rapporten. Je vraagt ​​data op, analyseert deze, visualiseert deze (maakt grafieken, diagrammen) en stuurt deze vervolgens naar je baas. Maar wat als dit allemaal geautomatiseerd zou zijn?

In deze tutorial gaan we een bot voor Telegram maken die de rapportage helpt automatiseren. En het coolste is dat het hele programma uit slechts 50 regels code zal bestaan! Als je voor het eerst een bot voor Telegram maakt, moet je deze ook lezen post.

Skillbox beveelt aan: Praktische cursus Python-ontwikkelaar vanaf nul.

Herinnering: voor alle lezers van "Habr" - een korting van 10 roebel bij inschrijving voor een Skillbox-cursus met behulp van de promotiecode "Habr".

Naar beneden gaan

Bibliotheken installeren

We zullen gebruiken google-cloud-bigquery om gegevens uit Google BigQuery te halen. matplotlib, numpy и panda's helpt u uw gegevens te visualiseren. python-telegram-bot stuurt de voltooide gegevens naar Telegram.

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

Google BigQuery API verbinden

Als we de dienst willen gebruiken, moeten we de Google BigQuery API koppelen. Om dit te doen gaan we naar Google Developers Console en maak een nieuw project aan (of selecteer een bestaand project).

Selecteer API'S EN DIENSTEN INSCHAKELEN in het configuratiescherm en zoek naar BigQuery API.

Hoe u eenvoudige rapporten kunt delegeren aan een robot. We schrijven een bot in Python en Google BigQuery

Selecteer Inschakelen om de API te verbinden.

Hoe u eenvoudige rapporten kunt delegeren aan een robot. We schrijven een bot in Python en Google BigQuery

Maak een accountsleutel aan

Laten we nog eens naar gaan Google Developers Console, selecteer het tabblad Inloggegevens, Inloggegevens aanmaken en Serviceaccountsleutel.

Vervolgens - Nieuw serviceaccount en voer de naam in het veld Serviceaccountnaam in.

Selecteer in de vervolgkeuzelijst Rol Project > Eigenaar en vervolgens Maken.

Hoe u eenvoudige rapporten kunt delegeren aan een robot. We schrijven een bot in Python en Google BigQuery

Het bestand dat automatisch wordt gedownload heet creds.json.

Stel GOOGLE_APPLICATION_CREDENTIALS in en geef het pad naar creds.json op in de terminal.

exporteer GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Als alles goed is gegaan, is het tijd om te beginnen met het schrijven van het programma.

Een applicatie maken

Voor de tutorial gebruiken we gegevens uit bigquery-public-data.stackoverflow, voor ons rapport selecteren we het aantal dagelijkse publicaties.

Alles is vrij eenvoudig.

Vraag de tabel op -> Visualiseer de gegevens -> Sla de visualisatie op -> Verzend de afbeelding

Laten we één functie maken om elke thread te definiëren.

Query naar BigQuery

Eerst importeren we de bibliotheek.

van google.cloud importeer bigquery

We maken een functie met de naam query_to_bigquery, waarbij de parameter query is.

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

Deze functie retourneert het verzoek als een dataframe.

Gegevens visualiseren

Om dit probleem op te lossen, kiest u matplotlib.

matplotlib.pyplot importeren als plt

We hebben vijf parameters nodig, waarbij x de gegevens op de x-as is, x_label de titel van de as is, y de gegevens van de y-as is, y_label de titel van de as is en titel de titel van de gehele visualisatie is.

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

Sla de afbeelding op

Laten we nu twee functies gebruiken om een ​​visualisatie te maken en deze op te slaan.

We sturen dagelijks het aantal gepubliceerde berichten. Eerst schrijven we een verzoek.

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

De query helpt bij het verzamelen van gegevens gedurende twee weken vanaf 2 december 2018.

We gebruiken deze datum omdat 2018-12-02 de nieuwste gegevens zijn die zijn vastgelegd in bigquery-public-data.stackoverflow.post_history. In andere gevallen kunt u CURRENT_DATE() gebruiken om de nieuwste gegevens te verkrijgen.

Roep de functie query_to_bigquery aan om de gegevens op te halen.

dataframe = query_to_bigquery(query)

Vervolgens gebruiken we de datumgegevenskolom voor de x-as en de kolom total_posts voor de y-as.

x = dataframe['datum'].tolist()
y = dataframe['totaal_posts'].tolist()

We visualiseren het met behulp van de visualiseren_bar_chart-functie en slaan het op als een afbeelding.

plt = visualiseer_bar_chart(x=x, x_label='Datum', y=y, y_label='Totaal aantal berichten', title='Dagelijkse berichten')
plt.savefig('viz.png')

We verpakken deze code in een functie genaamd 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')

Stuur een afbeelding

Om een ​​rapport naar de ontvanger te sturen, moet u de parameter chat_id kennen.

We gebruiken gebruikersinfobot en typ /start. De bot antwoordt met de nodige informatie, chat_id staat in het id-veld.

Laten we nu de functie send_image maken. Het zal de functie get_and_save_image gebruiken om de afbeelding op te halen en op te slaan. En dan sturen wij alles naar de juiste contactpersoon.

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

Hoofdprogramma

Ten slotte creëren we nog een functie, main, om de applicatie te starten. Vergeet niet YOUR_TOKEN voor de bot te wijzigen.

Let op: dit programma verzendt de afbeelding automatisch op het door u opgegeven tijdstip. Zo sturen wij elke dag om negen uur in de ochtend een rapport.

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

Als gevolg hiervan zal onze applicatie er als volgt uitzien:

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

Sla het bestand op en noem het main.py.

We starten de applicatie door de opdracht in de terminal in te voeren:

python3 hoofd.py

Alles is klaar. Nu hebben we een robot bestaande uit 50 regels code die zonder onze tussenkomst rapporten genereert.

Laten we de bot controleren vandaardoor de opdracht /send te selecteren.

Hoe u eenvoudige rapporten kunt delegeren aan een robot. We schrijven een bot in Python en Google BigQuery

U kunt de voltooide code verkrijgen op mijn GitHub.

Skillbox beveelt aan:

Bron: www.habr.com

Voeg een reactie