Wie Sie einen Bot erstellen, um Ihre sinnlosen Aufgaben mit Python und Google BigQuery zu automatisieren

Foto von Lukas aus Pexels

Haben Sie sich wiederholende Aufgaben? Etwas, das du regelmäßig, jede Woche oder sogar jeden Tag machst? Die Berichterstellung kann eine Ihrer wöchentlichen oder täglichen Aufgaben sein. Sie fragen oder fragen nach den Daten, machen einige Visualisierungen und geben sie dann Ihrem Chef. Was wäre, wenn Sie es anstatt manuell automatisieren müssten, damit Sie nicht langweilig werden und Ihre kostbare Zeit für andere Aufgaben nutzen können?

In diesem Tutorial erstellen wir einen Telegramm-Bot, der die langweiligen Teile Ihrer Jobberichte automatisiert. Oh, und habe ich erwähnt, dass zum Erstellen nicht mehr als 50 Codezeilen erforderlich sind? ;)

Wenn Sie zum ersten Mal einen Telegramm-Bot erstellen, sollten Sie diesen Beitrag zuerst lesen.

Loslegen

1. Installieren Sie die Bibliotheken

Wir werden Google-Cloud-BigQuery verwenden, um die Daten von Google BigQuery abzufragen. matplotlib, numpy und pandas helfen uns bei der Datenvisualisierung. python-telegram-bot sendet das Visualisierungsbild über den Telegramm-Chat.

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

2. Aktivieren Sie die Google BigQuery-API

Wir müssen zuerst die Google BigQuery-API aktivieren, wenn wir den Service nutzen möchten.

Rufen Sie die Google Developers Console auf und erstellen Sie ein neues Projekt (oder wählen Sie das vorhandene aus).

Klicken Sie im Projekt-Dashboard auf APIS UND DIENSTLEISTUNGEN AKTIVIEREN und suchen Sie nach der BigQuery-API.

Klicken Sie auf AKTIVIEREN, um die API zu aktivieren.

3. Erstellen Sie den Dienstkontoschlüssel

Wenn wir Google Cloud-Dienste wie Google BigQuery verwenden möchten, benötigen wir einen Dienstkontoschlüssel. Dies entspricht unseren Anmeldeinformationen für die Nutzung der Google-Dienste.

Wechseln Sie zur Google Developers Console, klicken Sie auf die Registerkarte Anmeldeinformationen, wählen Sie Anmeldeinformationen erstellen und klicken Sie auf Dienstkontoschlüssel.

Wählen Sie Neues Dienstkonto, und geben Sie im Feld Dienstkontoname einen Namen ein.

Wählen Sie in der Dropdown-Liste Rolle die Option Projekt> Besitzer aus und klicken Sie dann auf Erstellen.

Es gibt eine .json-Datei, die automatisch heruntergeladen wird. Nennen Sie sie creds.json.

Stellen Sie GOOGLE_APPLICATION_CREDENTIALS auf den Pfad unserer Datei creds.json im Terminal ein.

export GOOGLE_APPLICATION_CREDENTIALS = '[PATH_TO_CREDS.JSON]'

Alles sollte jetzt gut sein, es ist Zeit, unser Programm zu schreiben.

Schreiben Sie das Programm

Wir werden das Programm schreiben, das die Daten von BigQuery abfragt (wir gehen davon aus, dass die Daten dort gespeichert sind). Dann werden wir die Daten visualisieren und als Bild speichern. Das Bild wird dann über den Telegramm-Chat gesendet.

In diesem Lernprogramm wird das Dataset bigquery-public-data.stackoverflow verwendet. Für unseren Bericht werden die täglichen Gesamtbeitragsdaten verwendet.

Der Workflow unseres Programms ist ziemlich einfach:

Tabelle abfragen -> Daten visualisieren -> Visualisierung speichern -> Bild senden

Erstellen wir eine einzelne Funktion, um jeden Flow zu definieren.

1. Fragen Sie BigQuery ab

Importieren Sie zuerst die Bibliothek.

von google.cloud bigquery importieren

Erstellen Sie eine Funktion mit dem Namen query_to_bigquery, die query als Parameter verwendet.

def query_to_bigquery (Abfrage):
    client = bigquery.Client ()
    query_job = client.query (Abfrage)
    result = query_job.result ()
    dataframe = result.to_dataframe ()
    Datenrahmen zurückgeben

Diese Funktion gibt die Daten als Datenrahmen zurück.

2. Visualisieren Sie die Daten

Wir werden matplotlib verwenden, um die Daten zu visualisieren.

importiere matplotlib.pyplot als plt

Wir verwenden fünf Parameter: x als Daten der x-Achse, x_label als Bezeichnung der x-Achse, y als Daten der y-Achse, y_label als Bezeichnung der y-Achse und title als Titel unserer Visualisierung.

def visualize_bar_chart (x, x_label, y, y_label, title):
    plt.title (Titel)
    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)
    Rückgabe plt

3. Speichern Sie das Bild

Verwenden Sie die beiden oben genannten Funktionen, um eine Visualisierung zu erstellen, und speichern Sie das Bild.

Wie ich bereits erwähnt habe, möchten wir die täglichen Gesamtpostdaten senden. Schreiben Sie zuerst die Abfrage.

query = "" "
        SELECT DATE (Erstellungsdatum) Datum, COUNT (*) Gesamtbeiträge
        FROM `bigquery-public-data.stackoverflow.post_history`
        GRUPPE NACH 1
        HAVING date> DATE_SUB ('2018-12-02', INTERVALL 14 TAGE)
        BESTELLEN NACH 1
        "" "

Beachten Sie, dass in der obigen Abfrage HAVING date> DATE_SUB ('2018-12-02', INTERVAL 14 DAY) bedeutet, dass wir die Daten ab dem 14. Tag von 2018-12-02 erfassen möchten.

Wir verwenden dieses Datum, da 2018-12-02 die letzten in bigquery-public-data.stackoverflow.post_history aufgezeichneten Daten sind. In verschiedenen Fällen möchten Sie möglicherweise stattdessen CURRENT_DATE () verwenden, damit Sie die neuesten Daten erhalten.

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

dataframe = query_to_bigquery (Abfrage)

Nehmen Sie die Datumsspalte als unsere X-Achsendaten und die Spalte total_posts als unsere Y-Achsendaten.

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

Visualisieren Sie die Daten mit der Funktion visualize_bar_chart und speichern Sie sie dann als Bild.

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

Binden Sie diesen Code in eine Funktion namens get_and_save_image ein.

def get_and_save_image ():
    query = "" "
            SELECT DATE (Erstellungsdatum) Datum, COUNT (*) Gesamtbeiträge
            FROM `bigquery-public-data.stackoverflow.post_history`
            GRUPPE NACH 1
            HAVING date> DATE_SUB ('2018-12-02', INTERVALL 14 TAGE)
            BESTELLEN NACH 1
            "" "
    dataframe = query_to_bigquery (Abfrage)
    x = Datenrahmen ['Datum']. tolist ()
    y = dataframe ['total_posts']. tolist ()
    plt = visualize_bar_chart (x = x, x_label = 'Datum', y = y, y_label = 'Beiträge insgesamt', title = 'Tägliche Beiträge')
    plt.savefig ('viz.png')

4. Senden Sie das Bild

Um es an die richtige Person senden zu können, müssen wir deren chat_id kennen, da dies einer der erforderlichen Parameter ist.

Gehen Sie zum Benutzerinfobot und geben Sie / start ein. Der Bot antwortet mit unseren Benutzerinformationen und unsere chat_id ist die Nummer im Feld ID.

Erstellen Sie eine Funktion mit dem Namen send_image. Diese Funktion ruft zuerst die Funktion get_and_save_image auf, um die Visualisierung abzurufen und zu speichern, und sendet sie dann an die Person, deren chat_id in der Variablen chat_id deklariert ist.

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

5. Hauptprogramm

Zuletzt erstellen Sie eine weitere Funktion namens main, um unser Programm auszuführen. Vergessen Sie nicht, YOUR_TOKEN mit dem Token Ihres Bots zu ändern.

Denken Sie daran, dass dieses Programm das Bild basierend auf dem von uns festgelegten Tag und der Uhrzeit automatisch sendet.

In diesem Tutorial stellen wir es beispielsweise jeden Tag auf 9:00 Uhr ein.

def main ():
    updater = Updater ('YOUR_TOKEN')
    updater.job_queue.run_daily (send_image, time = datetime.datetime.strptime ('9:00 AM', '% I:% M% p'). time (), days = (0,1,2,3,4, 5,6))
    updater.start_polling ()
    updater.idle ()
if __name__ == '__main__':
    Main()

Am Ende sollte Ihr Code so aussehen:

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

Führen Sie das Programm aus, indem Sie diesen Befehl im Terminal eingeben.

python3 main.py

Toll! Jetzt haben Sie einen automatischen Berichtsgenerator mit nicht mehr als 50 Codezeilen - ziemlich cool, oder?

Überprüfen Sie den Bot hier und geben Sie den Befehl / send ein, um das Beispiel der Bildvisualisierung zu sehen.

Das Bild unten zeigt die Visualisierung, die der Bot senden wird. Jetzt kannst du dich einfach zurücklehnen, dich entspannen und warten, bis der Bot dir jeden Tag den Bericht schickt :)

Sie können meinen GitHub besuchen, um den Code zu erhalten, und zögern Sie nicht, eine Verbindung herzustellen und eine Nachricht in meinem Linkedin-Profil zu hinterlassen, wenn Sie etwas fragen möchten.

Bitte hinterlassen Sie einen Kommentar, wenn Sie der Meinung sind, dass mein Code oder meine Texte fehlerhaft sind.

Wenn Sie Interesse an Data Science oder maschinellem Lernen haben, lesen Sie vielleicht meinen Beitrag über den Aufbau eines Stimmungsanalysators.

Nochmals vielen Dank und viel Glück! :)