So delegieren Sie einfache Berichte an einen Roboter. Einen Bot in Python und Google BigQuery schreiben

So delegieren Sie einfache Berichte an einen Roboter. Einen Bot in Python und Google BigQuery schreiben

Haben Sie Aufgaben, die sich Tag für Tag, Woche für Woche wiederholen? Zum Beispiel das Schreiben von Berichten. Sie fordern Daten an, analysieren sie, visualisieren sie (erstellen Grafiken, Diagramme) und senden sie dann an Ihren Chef. Aber was wäre, wenn das alles automatisiert wäre?

In diesem Tutorial erstellen wir einen Bot für Telegram, der dabei hilft, die Berichterstellung zu automatisieren. Und das Coolste ist, dass das gesamte Programm nur aus 50 Codezeilen besteht! Wenn Sie zum ersten Mal einen Bot für Telegram erstellen, sollten Sie auch diesen lesen Post.

Skillbox empfiehlt: Praktischer Kurs Python-Entwickler von Grund auf.

Erinnerung: für alle Leser von „Habr“ – ein Rabatt von 10 Rubel bei der Anmeldung zu einem beliebigen Skillbox-Kurs mit dem Aktionscode „Habr“.

Lass uns anfangen

Bibliotheken installieren

Wir werden verwenden google-cloud-bigquery um Daten von Google BigQuery abzurufen. Matplotlib, numpig и Pandas hilft Ihnen bei der Visualisierung Ihrer Daten. Python-Telegramm-Bot sendet die fertigen Daten an Telegram.

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

Anbindung der Google BigQuery API

Wenn wir den Dienst nutzen möchten, müssen wir die Google BigQuery API anbinden. Dazu gehen wir zu Google Entwicklerkonsole und erstellen Sie ein neues Projekt (oder wählen Sie ein vorhandenes aus).

Wählen Sie im Steuerungsfeld APIs und Dienste aktivieren aus und suchen Sie nach der BigQuery-API.

So delegieren Sie einfache Berichte an einen Roboter. Einen Bot in Python und Google BigQuery schreiben

Wählen Sie „Aktivieren“, um die API zu verbinden.

So delegieren Sie einfache Berichte an einen Roboter. Einen Bot in Python und Google BigQuery schreiben

Erstellen Sie einen Kontoschlüssel

Lasst uns noch einmal gehen Google Entwicklerkonsole, wählen Sie die Registerkarte Anmeldeinformationen, Anmeldeinformationen erstellen und Dienstkontoschlüssel aus.

Dann – Neues Dienstkonto, und geben Sie den Namen in das Feld „Dienstkontoname“ ein.

Wählen Sie in der Dropdown-Liste „Rolle“ „Projekt“ > „Eigentümer“ und dann „Erstellen“ aus.

So delegieren Sie einfache Berichte an einen Roboter. Einen Bot in Python und Google BigQuery schreiben

Die Datei, die automatisch heruntergeladen wird, heißt creds.json.

Legen Sie GOOGLE_APPLICATION_CREDENTIALS fest und geben Sie den Pfad zu creds.json im Terminal an.

export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Wenn alles gut gelaufen ist, ist es Zeit, mit dem Schreiben des Programms zu beginnen.

Anwendung erstellen

Für das Tutorial verwenden wir Daten aus bigquery-public-data.stackoverflow, für unseren Bericht wählen wir die Anzahl der täglichen Veröffentlichungen aus.

Alles ist ganz einfach.

Fragen Sie die Tabelle ab -> Visualisieren Sie die Daten -> Speichern Sie die Visualisierung -> Senden Sie das Bild

Lassen Sie uns eine Funktion erstellen, um jeden Thread zu definieren.

Abfrage an BigQuery

Zuerst importieren wir die Bibliothek.

aus google.cloud BigQuery importieren

Wir erstellen eine Funktion namens query_to_bigquery, wobei der Parameter query ist.

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

Diese Funktion gibt die Anfrage als Datenrahmen zurück.

Daten visualisieren

Um dieses Problem zu lösen, wählen Sie matplotlib.

importiere matplotlib.pyplot als plt

Wir benötigen fünf Parameter, wobei x die x-Achsendaten sind, x_label der Titel für die Achse ist, y die y-Achsendaten sind, y_label der Titel für die Achse ist und title der Titel der gesamten Visualisierung ist.

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

Speichern Sie das Bild

Lassen Sie uns nun mit zwei Funktionen eine Visualisierung erstellen und speichern.

Wir senden Ihnen täglich die Anzahl der veröffentlichten Beiträge. Zuerst schreiben wir eine Anfrage.

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

Die Abfrage hilft bei der Datenerfassung für zwei Wochen ab dem 2. Dezember 2018.

Wir verwenden dieses Datum, da der 2018 die neuesten Daten sind, die in bigquery-public-data.stackoverflow.post_history aufgezeichnet wurden. In anderen Fällen können Sie CURRENT_DATE() verwenden, um die neuesten Daten abzurufen.

Rufen Sie die Funktion query_to_bigquery auf, um die Daten abzurufen.

dataframe = query_to_bigquery(query)

Dann verwenden wir die Datumsdatenspalte für die x-Achse und die total_posts-Spalte für die y-Achse.

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

Wir visualisieren es mit der Funktion visualize_bar_chart und speichern es als Bild.

plt = visualize_bar_chart(x=x, x_label='Datum', y=y, y_label='Gesamtbeiträge', Titel='Tägliche Beiträge')
plt.savefig('viz.png')

Wir packen diesen Code in eine Funktion namens 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')

Senden Sie ein Bild

Um einen Bericht an den Empfänger zu senden, müssen Sie den Parameter chat_id kennen.

Wir gebrauchen Benutzerinfobot und geben Sie /start ein. Der Bot antwortet mit den notwendigen Informationen, chat_id ist im ID-Feld enthalten.

Jetzt erstellen wir die Funktion send_image. Es wird die Funktion get_and_save_image verwenden, um das Bild abzurufen und zu speichern. Und dann schicken wir alles an den richtigen Ansprechpartner.

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

Hauptprogramm

Schließlich erstellen wir eine weitere Funktion, main, um die Anwendung zu starten. Vergessen Sie nicht, YOUR_TOKEN für den Bot zu ändern.

Denken Sie daran: Dieses Programm sendet das Bild automatisch zu dem von Ihnen angegebenen Zeitpunkt. Beispielsweise versenden wir jeden Tag um neun Uhr morgens einen Bericht.

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 Ergebnis wird unsere Bewerbung so aussehen:

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

Speichern Sie die Datei und nennen Sie sie main.py.

Wir starten die Anwendung, indem wir den Befehl im Terminal eingeben:

python3 main.py

Alles ist fertig. Jetzt haben wir einen Roboter bestehend aus 50 Codezeilen, der ohne unser Zutun Berichte generiert.

Lassen Sie uns den Bot überprüfen daherindem Sie den Befehl /send auswählen.

So delegieren Sie einfache Berichte an einen Roboter. Einen Bot in Python und Google BigQuery schreiben

Den fertigen Code erhalten Sie unter mein GitHub.

Skillbox empfiehlt:

Source: habr.com

Kommentar hinzufügen