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ć.
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”.
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.
Wybierz opcję Włącz, aby połączyć interfejs API.
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.
Plik, który zostanie automatycznie pobrany, nazywa się creds.json.
Ustaw GOOGLE_APPLICATION_CREDENTIALS, podając ścieżkę do pliku creds.json w terminalu.
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.
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.
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.