Jak delegować proste raporty robotowi. Napisanie bota w Pythonie i Google BigQuery

Jak delegować proste raporty robotowi. Napisanie bota w Pythonie i Google BigQuery

Czy masz zadania, które powtarzają się dzień po dniu, tydzień po tygodniu? Na przykład pisanie raportów. Żądasz danych, analizujesz je, wizualizujesz (robisz wykresy, wykresy), a następnie wysyłasz do swojego szefa. Ale co by było, gdyby wszystko to zostało zautomatyzowane?

W tym samouczku stworzymy bota dla Telegramu, który pomoże zautomatyzować raportowanie. A najfajniejsze jest to, że cały program będzie się składał z zaledwie 50 linii kodu! Jeśli po raz pierwszy tworzysz bota dla Telegramu, powinieneś również przeczytać ten pisać.

Skillbox poleca: Kurs praktyczny Programista Pythona od podstaw.

Przypomnienie: dla wszystkich czytelników „Habr” - rabat w wysokości 10 000 rubli przy zapisywaniu się na dowolny kurs Skillbox przy użyciu kodu promocyjnego „Habr”.

Zejść

Instalowanie bibliotek

Użyjemy google-cloud-bigquery aby uzyskać dane z Google BigQuery. matplotlib, tępy и pandy pomoże Ci zwizualizować swoje dane. python-telegram-bot wyśle ​​gotowe dane do Telegramu.

pip3 zainstaluj google-cloud-bigquery matplotlib numpy pandy python-telegram-bot

Podłączanie API Google BigQuery

Jeżeli chcemy skorzystać z usługi musimy podłączyć API Google BigQuery. Aby to zrobić, idziemy do Google Developers Console i utwórz nowy projekt (lub wybierz istniejący).

W panelu sterowania wybierz WŁĄCZ API I USŁUGI i poszukaj BigQuery API.

Jak delegować proste raporty robotowi. Napisanie bota w Pythonie i Google BigQuery

Wybierz opcję Włącz, aby połączyć interfejs API.

Jak delegować proste raporty robotowi. Napisanie bota w Pythonie i Google BigQuery

Utwórz klucz konta

Przejdźmy jeszcze raz Google Developers Console, wybierz zakładkę Poświadczenia, Utwórz poświadczenia i Klucz konta usługi.

Następnie - Nowe konto usługi i wpisz nazwę w polu Nazwa konta usługi.

Z listy rozwijanej Rola wybierz opcję Projekt > Właściciel, a następnie Utwórz.

Jak delegować proste raporty robotowi. Napisanie bota w Pythonie i Google BigQuery

Plik, który zostanie automatycznie pobrany, nazywa się creds.json.

Ustaw GOOGLE_APPLICATION_CREDENTIALS, podając ścieżkę do pliku creds.json w terminalu.

eksportuj GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Jeśli wszystko poszło dobrze, czas zacząć pisać program.

Utwórz aplikację

Do tutoriala wykorzystamy dane z bigquery-public-data.stackoverflow, do naszego raportu wybierzemy liczbę codziennych publikacji.

Wszystko jest dość proste.

Zapytaj tabelę -> Wizualizuj dane -> Zapisz wizualizację -> Wyślij obraz

Stwórzmy jedną funkcję definiującą każdy wątek.

Zapytanie do BigQuery

Najpierw importujemy bibliotekę.

z google.cloud zaimportuj Bigquery

Tworzymy funkcję o nazwie query_to_bigquery, której parametrem jest zapytanie.

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

Ta funkcja zwróci żądanie jako ramkę danych.

Wizualizacja danych

Aby rozwiązać ten problem, wybierz matplotlib.

import matplotlib.pyplot jako plt

Potrzebujemy pięciu parametrów, gdzie x to dane na osi X, x_label to tytuł osi, y to dane na osi Y, y_label to tytuł osi, a tytuł to tytuł całej wizualizacji.

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

Zapisz obraz

Użyjmy teraz dwóch funkcji, aby utworzyć wizualizację i zapisać ją.

Codziennie będziemy przesyłać liczbę opublikowanych postów. Najpierw piszemy prośbę.

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

Zapytanie pomaga zbierać dane przez dwa tygodnie, począwszy od 2 grudnia 2018 r.

Używamy tej daty, ponieważ 2018-12-02 to najnowsze dane zapisane w bigquery-public-data.stackoverflow.post_history, w innych przypadkach możesz użyć CURRENT_DATE(), aby uzyskać najnowsze dane.

Wywołaj funkcję query_to_bigquery, aby pobrać dane.

ramka danych = query_to_bigquery(zapytanie)

Następnie używamy kolumny danych daty dla osi x i kolumny total_posts dla osi y.

x = ramka danych['data'].tolist()
y = ramka danych['total_posts'].tolist()

Wizualizujemy go za pomocą funkcji Visualize_bar_chart i zapisujemy jako obraz.

plt = Visualize_bar_chart(x=x, x_label='Data', y=y, y_label='Wszystkie posty', title='Codzienne posty')
plt.savefig('viz.png')

Zawijamy ten kod w funkcję o nazwie 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')

Wyślij obraz

Aby wysłać raport do odbiorcy musisz znać parametr chat_id.

Używamy Informacje o użytkowniku i wpisz /start. Bot odpowiada niezbędnymi informacjami, chat_id zawarty jest w polu id.

Stwórzmy teraz funkcję send_image. Użyje funkcji get_and_save_image do pobrania i zapisania obrazu. A potem wysyłamy wszystko do odpowiedniego kontaktu.

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

Główny program

Na koniec tworzymy kolejną funkcję main, która uruchamia aplikację. Nie zapomnij zmienić YOUR_TOKEN dla bota.

Pamiętaj: ten program wyśle ​​obraz automatycznie w określonym przez Ciebie momencie. Na przykład raport będziemy wysyłać codziennie o dziewiątej rano.

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

W rezultacie nasza aplikacja będzie wyglądać następująco:

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

Zapisz plik i nazwij go main.py.

Aplikację uruchamiamy wpisując w terminalu polecenie:

python3 main.py

Wszystko jest gotowe. Teraz mamy robota składającego się z 50 linii kodu, który generuje raporty bez naszej interwencji.

Sprawdźmy bota stądwybierając polecenie /send.

Jak delegować proste raporty robotowi. Napisanie bota w Pythonie i Google BigQuery

Gotowy kod możesz otrzymać pod adresem mojego GitHuba.

Skillbox poleca:

Źródło: www.habr.com

Dodaj komentarz