Hoe kinne jo ienfâldige rapporten delegearje oan in robot. Skriuw in bot yn Python en Google BigQuery

Hoe kinne jo ienfâldige rapporten delegearje oan in robot. Skriuw in bot yn Python en Google BigQuery

Hawwe jo taken dy't dei nei dei, wike nei wike werhelje? Bygelyks it skriuwen fan rapporten. Jo freegje gegevens oan, analysearje it, visualisearje it (meitsje grafiken, diagrammen), en stjoer it dan nei jo baas. Mar wat as dit alles automatisearre wie?

Yn dizze tutorial sille wy in bot meitsje foar Telegram dy't sil helpe om rapportaazje te automatisearjen. En it coolste ding is dat it hiele programma sil bestean út mar 50 rigels koade! As jo ​​​​foar it earst in bot meitsje foar Telegram, dan moatte jo dizze ek lêze post.

Skillbox advisearret: Praktyske kursus Python-ûntwikkelder fanôf it begjin.

Wy herinnerje: foar alle lêzers fan "Habr" - in koarting fan 10 roebel by it ynskriuwen fan in Skillbox-kursus mei de promoasjekoade "Habr".

Litte wy begjinne

Ynstallaasje fan biblioteken

Wy sille brûke google-wolk-bigquery om gegevens te krijen fan Google BigQuery. matplotlib, ferdôve и pandas sil jo helpe om jo gegevens te visualisearjen. python-telegram-bot sil de ôfmakke gegevens stjoere nei Telegram.

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

Ferbine Google BigQuery API

As wy de tsjinst wolle brûke, moatte wy de Google BigQuery API ferbine. Om dit te dwaan geane wy ​​nei Google ûntwikkelders konsole en meitsje in nij projekt (of selektearje in besteand).

Selektearje yn it kontrôlepaniel APIS EN TSJINSTEN ynskeakelje en sykje nei BigQuery API.

Hoe kinne jo ienfâldige rapporten delegearje oan in robot. Skriuw in bot yn Python en Google BigQuery

Selektearje ynskeakelje om de API te ferbinen.

Hoe kinne jo ienfâldige rapporten delegearje oan in robot. Skriuw in bot yn Python en Google BigQuery

Meitsje in akkount kaai

Litte wy wer nei Google ûntwikkelders konsole, selektearje it ljepblêd Bewizen, Bewiis oanmeitsje en Kaai foar tsjinstkonto.

Dan - Nij tsjinst account, en fier de namme yn it Service account namme fjild.

Selektearje yn 'e útklaplist Rol Projekt > Eigner, dan oanmeitsje.

Hoe kinne jo ienfâldige rapporten delegearje oan in robot. Skriuw in bot yn Python en Google BigQuery

It bestân dat automatysk ynladen wurdt hjit creds.json.

Stel GOOGLE_APPLICATION_CREDENTIALS yn, spesifisearje it paad nei creds.json yn 'e terminal.

eksportearje GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

As alles goed gie, is it tiid om te begjinnen mei it skriuwen fan it programma.

It meitsjen fan in applikaasje

Foar de tutorial sille wy gegevens brûke fan bigquery-public-data.stackoverflow, foar ús rapport sille wy it oantal deistige publikaasjes selektearje.

Alles is frij simpel.

Query de tabel -> Visualisearje de gegevens -> Bewarje de fisualisaasje -> Stjoer de ôfbylding

Litte wy ien funksje meitsje om elke thread te definiearjen.

Query nei BigQuery

Earst ymportearje wy de bibleteek.

fan google.cloud ymportearje bigquery

Wy meitsje in funksje neamd query_to_bigquery, dêr't de parameter is query.

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

Dizze funksje sil it fersyk weromjaan as in gegevensframe.

Visualisearjen fan gegevens

Om dit probleem op te lossen, kies matplotlib.

ymportearje matplotlib.pyplot as plt

Wy moatte fiif parameters, dêr't x is de x-as gegevens, x_label is de titel foar de as, y is de y-as gegevens, y_label is de titel foar de as, en titel is de titel fan de hiele fisualisaasje.

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

Bewarje de ôfbylding

Litte wy no twa funksjes brûke om in fisualisaasje te meitsjen en op te slaan.

Wy stjoere it oantal berjochten alle dagen publisearre. Earst skriuwe wy in fersyk.

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

De query helpt gegevens te sammeljen foar twa wiken fanôf 2 desimber 2018.

Wy brûke dizze datum omdat 2018-12-02 is de lêste gegevens opnommen yn bigquery-public-data.stackoverflow.post_history, yn oare gefallen kinne jo brûke CURRENT_DATE () te krijen de nijste gegevens.

Rop de query_to_bigquery-funksje op om de gegevens te krijen.

dataframe = query_to_bigquery(query)

Dan brûke wy de datumgegevenskolom foar de x-as, en de kolom total_posts foar de y-as.

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

Wy fisualisearje it mei de funksje visualize_bar_chart en bewarje it as in ôfbylding.

plt = visualize_bar_chart(x=x, x_label='Datum', y=y, y_label='Totaal berjochten', title='Daily Posts')
plt.savefig('viz.png')

Wy wrap dizze koade yn in funksje neamd 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')

Stjoer in ôfbylding

Om in rapport nei de ûntfanger te stjoeren, moatte jo de parameter chat_id witte.

Wy brûke userinfobot en typ /start. De bot reagearret mei de nedige ynformaasje, chat_id stiet yn it id-fjild.

Litte wy no de send_image-funksje oanmeitsje. It sil de get_and_save_image-funksje brûke om de ôfbylding op te heljen en te bewarjen. En dan stjoere wy alles nei it goede kontakt.

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

Haadprogramma

Uteinlik meitsje wy in oare funksje, haad, om de applikaasje te starten. Ferjit net YOUR_TOKEN te feroarjen foar de bot.

Unthâld: dit programma sil de ôfbylding automatysk ferstjoere op it momint dat jo oantsjutte. Wy stjoere bygelyks alle dagen om njoggen oere in ferslach.

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

As resultaat sil ús applikaasje der sa útsjen:

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

Bewarje de triem en neam it main.py.

Wy starte de applikaasje troch it kommando yn te fieren yn 'e terminal:

python3 main.py

Alles is klear. No hawwe wy in robot dy't bestiet út 50 rigels koade dy't rapporten genereart sûnder ús yntervinsje.

Litte wy de bot kontrolearje fan hjirtroch it kommando / ferstjoere te selektearjen.

Hoe kinne jo ienfâldige rapporten delegearje oan in robot. Skriuw in bot yn Python en Google BigQuery

Jo kinne krije de klear koade by myn GitHub.

Skillbox advisearret:

Boarne: www.habr.com

Add a comment