Hoe om eenvoudige verslae aan 'n robot te delegeer. Ons skryf 'n bot in Python en Google BigQuery

Hoe om eenvoudige verslae aan 'n robot te delegeer. Ons skryf 'n bot in Python en Google BigQuery

Het jy take wat dag na dag, week na week herhaal? Byvoorbeeld, die skryf van verslae. Jy versoek data, ontleed dit, visualiseer dit (maak grafieke, kaarte) en stuur dit dan aan jou baas. Maar wat as dit alles outomaties was?

In hierdie handleiding sal ons 'n bot vir Telegram skep wat sal help om verslaggewing te outomatiseer. En die coolste ding is dat die hele program uit slegs 50 reëls kode sal bestaan! As jy vir die eerste keer 'n bot vir Telegram skep, moet jy ook hierdie een lees post.

Skillbox beveel aan: Praktiese kursus Python-ontwikkelaar van nuuts af.

Ons herinner: vir alle lesers van "Habr" - 'n afslag van 10 000 roebels wanneer u inskryf vir enige Skillbox-kursus met behulp van die "Habr"-promosiekode.

Aan die gang kom

Installeer biblioteke

Ons sal gebruik google-wolk-bigquery om data van Google BigQuery af te kry. matplotlib, Numpy и pandas sal jou help om jou data te visualiseer. luislang-telegram-bot sal die voltooide data na Telegram stuur.

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

Koppel Google BigQuery API

As ons die diens wil gebruik, moet ons die Google BigQuery API koppel. Om dit te doen gaan ons na Google-ontwikkelaarkonsole en skep 'n nuwe projek (of kies 'n bestaande een).

Kies in die beheerpaneel AKTIVEER APIS EN DIENSTE en soek BigQuery API.

Hoe om eenvoudige verslae aan 'n robot te delegeer. Ons skryf 'n bot in Python en Google BigQuery

Kies Aktiveer om die API te koppel.

Hoe om eenvoudige verslae aan 'n robot te delegeer. Ons skryf 'n bot in Python en Google BigQuery

Skep 'n rekeningsleutel

Kom ons gaan weer na Google-ontwikkelaarkonsole, kies die Geloofsbriewe-oortjie, Skep geloofsbriewe en Diensrekeningsleutel.

Dan - Nuwe diensrekening, en voer die naam in die Diensrekeningnaam-veld in.

Kies Projek > Eienaar in die Rol-aftreklys, en dan Skep.

Hoe om eenvoudige verslae aan 'n robot te delegeer. Ons skryf 'n bot in Python en Google BigQuery

Die lêer wat outomaties afgelaai sal word, word creds.json genoem.

Stel GOOGLE_APPLICATION_CREDENTIALS, spesifiseer die pad na creds.json in die terminaal.

uitvoer GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

As alles goed gegaan het, is dit tyd om die program te begin skryf.

Die skep van 'n toepassing

Vir die tutoriaal sal ons data van bigquery-public-data.stackoverflow gebruik, vir ons verslag sal ons die aantal daaglikse publikasies kies.

Alles is redelik eenvoudig.

Besoek die tabel -> Visualiseer die data -> Stoor die visualisering -> Stuur die prent

Kom ons skep een funksie om elke draad te definieer.

Navraag na BigQuery

Eerstens voer ons die biblioteek in.

vanaf google.cloud voer bigquery in

Ons skep 'n funksie genaamd query_to_bigquery, waar die parameter navraag is.

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

Hierdie funksie sal die versoek as 'n dataraam terugstuur.

Visualisering van data

Om hierdie probleem op te los, kies matplotlib.

voer matplotlib.pyplot in as plt

Ons benodig vyf parameters, waar x die x-asdata is, x_label die titel vir die as, y die y-asdata is, y_label die titel vir die as is, en titel die titel van die hele visualisering is.

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

Stoor die prent

Kom ons gebruik nou twee funksies om 'n visualisering te skep en dit te stoor.

Ons sal die aantal plasings wat daagliks gepubliseer word, stuur. Eers skryf ons 'n versoek.

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 navraag help om data vir twee weke in te samel vanaf 2 Desember 2018.

Ons gebruik hierdie datum omdat 2018-12-02 die jongste data is wat in bigquery-public-data.stackoverflow.post_history aangeteken is, in ander gevalle kan jy CURRENT_DATE() gebruik om die nuutste data te kry.

Roep die query_to_bigquery-funksie om die data te kry.

dataraam = query_to_bigquery(navraag)

Dan gebruik ons ​​die datumdatakolom vir die x-as, en die total_posts-kolom vir die y-as.

x = dataraam['datum'].tolist()
y = dataraam['total_posts'].tolist()

Ons visualiseer dit deur die visualize_bar_chart-funksie te gebruik en stoor dit as 'n prent.

plt = visualize_bar_chart(x=x, x_label='Datum', y=y, y_label='Totale plasings', title='Daglikse plasings')
plt.savefig('viz.png')

Ons draai hierdie kode in 'n funksie genaamd 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')

Stuur 'n prent

Om 'n verslag aan die ontvanger te stuur, moet jy die chat_id parameter ken.

Ons gebruik gebruikersinfobot en tik /start. Die bot reageer met die nodige inligting, chat_id is vervat in die id-veld.

Kom ons skep nou die send_image-funksie. Dit sal die get_and_save_image-funksie gebruik om die prent te herwin en te stoor. En dan stuur ons alles na die regte kontak.

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

Hoofprogram

Ten slotte skep ons 'n ander funksie, hoof, om die toepassing te begin. Moenie vergeet om YOUR_TOKEN vir die bot te verander nie.

Onthou: hierdie program sal die prent outomaties stuur op die tyd wat jy spesifiseer. Ons sal byvoorbeeld elke dag om negeuur in die oggend 'n verslag stuur.

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 gevolg hiervan sal ons aansoek soos volg lyk:

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

Stoor die lêer en noem dit main.py.

Ons begin die toepassing deur die opdrag in die terminale in te voer:

python3 hoof.py

Alles is gereed. Nou het ons 'n robot wat uit 50 reëls kode bestaan ​​wat verslae genereer sonder ons ingryping.

Kom ons kyk na die bot vandaardeur die /send-opdrag te kies.

Hoe om eenvoudige verslae aan 'n robot te delegeer. Ons skryf 'n bot in Python en Google BigQuery

Jy kan die voltooide kode kry by my GitHub.

Skillbox beveel aan:

Bron: will.com

Voeg 'n opmerking