
Haben Sie Aufgaben, die Tag für Tag von Woche zu Woche wiederholt werden? Zum Beispiel Berichte schreiben. Sie fordern Daten an, führen Analysen durch, visualisieren (erstellen Diagramme, Diagramme) und senden sie dann an den Chef. Aber was ist, wenn dies alles automatisiert ist?
In diesem Tutorial erstellen wir einen Bot für Telegramm, der die Berichterstellung automatisiert. Und das Coolste ist, dass das gesamte Programm nur aus 50 Codezeilen besteht! Wenn Sie zum ersten Mal einen Bot für Telegramm erstellen, sollten Sie diesen
Beitrag hier lesen.
Skillbox empfiehlt: Ein Python-Entwickler von Grund auf .
Wir erinnern Sie daran: Für alle Leser von „Habr“ - ein Rabatt von 10.000 Rubel bei der Anmeldung für einen Skillbox-Kurs mit dem Promo-Code „Habr“.
Runter
Installieren Sie BibliothekenWir werden
google-cloud-bigquery verwenden , um Daten von Google BigQuery abzurufen.
Matplotlib ,
Numpy und
Pandas helfen bei der Visualisierung der Daten.
python-telegram-bot sendet die fertigen Daten an Telegram.
pip3 installiere google-cloud-bigquery matplotlib numpy pandas python-telegram-botVerbinden Sie die Google BigQuery-APIWenn wir den Dienst nutzen möchten, müssen wir die Google BigQuery-API verbinden. Rufen Sie dazu die
Google Developers Console auf und erstellen Sie ein neues Projekt (oder wählen Sie ein vorhandenes aus).
Wählen Sie in der Systemsteuerung APIS UND DIENSTLEISTUNGEN AKTIVIEREN aus und suchen Sie nach der BigQuery-API.

Wählen Sie Aktivieren, um die API zu verbinden.
Erstellen Sie einen KontoschlüsselWir gehen erneut zur
Google Developers Console und wählen die Registerkarte Anmeldeinformationen, Anmeldeinformationen erstellen und Dienstkontoschlüssel.
Geben Sie dann - Neues Dienstkonto und im Feld Dienstkontoname den Namen ein.
Wählen Sie in der Dropdown-Liste Rolle die Option Projekt> Eigentümer und dann Erstellen aus.

Eine Datei, die automatisch geladen wird, heißt creds.json.
Wir machen GOOGLE_APPLICATION_CREDENTIALS verfügbar und geben den Pfad zu creds.json im Terminal an.
export GOOGLE_APPLICATION_CREDENTIALS = '[PATH_TO_CREDS.JSON]'Wenn alles gut gegangen ist, ist es Zeit, ein Programm zu schreiben.
Anwendungserstellung
Für das Tutorial verwenden wir die Daten aus bigquery-public-data.stackoverflow. Für unseren Bericht wählen wir die Anzahl der täglichen Veröffentlichungen.
Alles ist ganz einfach.
Tabelle abfragen -> Daten visualisieren -> Visualisierung speichern -> Bild senden
Erstellen wir eine Funktion, um jeden Thread zu definieren.
Abfrage an BigQueryImportieren Sie zunächst die Bibliothek.
aus google.cloud importiere bigqueryErstellen Sie eine Funktion namens query_to_bigquery, bei der 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 Anforderung als Datenrahmen zurück.
Visualisieren Sie die DatenUm dieses Problem zu lösen, wählen Sie matplotlib.
importiere matplotlib.pyplot als pltWir benötigen fünf Parameter, wobei x die Daten auf der x-Achse sind, x_label der Name für die Achse ist, y die Daten für die y-Achse sind, y_label der Name 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
Bild speichernVerwenden wir nun zwei Funktionen, um eine Visualisierung zu erstellen und zu speichern.
Wir senden die Anzahl der täglich 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 beim Sammeln von Daten für zwei Wochen ab dem 2. Dezember 2018.
Wir verwenden dieses Datum, da 2018-12-02 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 (Abfrage)Verwenden Sie dann die Datumsspalte für die x-Achse und die Spalte total_posts für die y-Achse.
x = Datenrahmen ['Datum']. tolist ()
y = Datenrahmen ['total_posts']. tolist ()Wir visualisieren mit der Funktion visualize_bar_chart und speichern sie als Bild.
plt = visualize_bar_chart (x = x, x_label = 'Datum', y = y, y_label = 'Gesamtzahl der Beiträge', title = 'Tägliche Beiträge')
plt.savefig ('viz.png')Wir verpacken 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')
Bild sendenUm einen Bericht an den Empfänger zu senden, müssen Sie den Parameter chat_id kennen.
Wir verwenden
userinfobot und geben / start ein. Der Bot antwortet mit den notwendigen Informationen, chat_id ist im ID-Feld enthalten.
Erstellen Sie nun die Funktion send_image. Es wird die Funktion get_and_save_image verwenden, um das Bild abzurufen und zu speichern. Und dann senden 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'))
HauptprogrammErstellen Sie abschließend 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. Zum Beispiel werden wir jeden Tag um neun Uhr morgens einen Bericht senden.
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()
Infolgedessen sieht unsere Anwendung folgendermaßen aus:
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.pyAlles ist fertig. Jetzt haben wir einen Roboter, der aus 50 Codezeilen besteht und Berichte ohne unser Eingreifen generiert.
Lassen Sie uns den Bot
von hier aus überprüfen
, indem Sie den Befehl / send auswählen.

Sie können den fertigen Code in
meinem GitHub erhalten .
Skillbox empfiehlt: