Kuidas delegeerida lihtsaid aruandeid robotile. Kirjutame roboti Pythonis ja Google BigQuerys

Kuidas delegeerida lihtsaid aruandeid robotile. Kirjutame roboti Pythonis ja Google BigQuerys

Kas teil on ülesandeid, mis korduvad päevast päeva, nädalast nädalasse? Näiteks aruannete kirjutamine. Te taotlete andmeid, analüüsite neid, visualiseerite (kooste graafikuid, diagramme) ja saadate need seejärel oma ülemusele. Aga mis siis, kui see kõik oleks automatiseeritud?

Selles õpetuses loome Telegrami jaoks roboti, mis aitab aruandlust automatiseerida. Ja kõige lahedam on see, et kogu programm koosneb vaid 50 koodireast! Kui loote Telegrami jaoks robotit esimest korda, peaksite ka seda lugema postitus.

Skillbox soovitab: Praktiline kursus Pythoni arendaja nullist.

Tuletame meelde: kõigile "Habr" lugejatele - allahindlus 10 000 rubla, kui registreerute mis tahes Skillboxi kursusele, kasutades sooduskoodi "Habr".

Alla laskumine

Teekide installimine

Me kasutame google-cloud-bigquery Google BigQueryst andmete hankimiseks. matplotlib, tuim и pandas aitab teil oma andmeid visualiseerida. python-telegram-bot saadab valmis andmed Telegramile.

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

Google BigQuery API ühendamine

Kui tahame teenust kasutada, peame ühendama Google BigQuery API. Selleks läheme Google'i arendajakonsool ja looge uus projekt (või valige olemasolev).

Valige juhtpaneelil LUBA APISED JA TEENUSED ning otsige üles BigQuery API.

Kuidas delegeerida lihtsaid aruandeid robotile. Kirjutame roboti Pythonis ja Google BigQuerys

API ühendamiseks valige Luba.

Kuidas delegeerida lihtsaid aruandeid robotile. Kirjutame roboti Pythonis ja Google BigQuerys

Looge konto võti

Läheme uuesti Google'i arendajakonsool, valige vahekaart Mandaat, Loo mandaadid ja teenusekonto võti.

Seejärel – Uus teenusekonto ja sisestage nimi väljale Teenuse konto nimi.

Rippmenüüst Roll valige Projekt > Omanik ja seejärel Loo.

Kuidas delegeerida lihtsaid aruandeid robotile. Kirjutame roboti Pythonis ja Google BigQuerys

Automaatselt allalaaditava faili nimi on creds.json.

Määrake GOOGLE_APPLICATION_CREDENTIALS, määrates terminalis creds.jsoni tee.

eksportida GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Kui kõik läks hästi, on aeg hakata programmi kirjutama.

Rakenduse loomine

Õpetuse jaoks kasutame andmeid saidilt bigquery-public-data.stackoverflow, aruande jaoks valime igapäevaste väljaannete arvu.

Kõik on üsna lihtne.

Päring tabelist -> Visualiseeri andmed -> Salvesta visualiseering -> Saada pilt

Loome iga lõime määratlemiseks ühe funktsiooni.

Päring BigQueryle

Kõigepealt impordime raamatukogu.

saidilt google.cloud import bigquery

Loome funktsiooni nimega query_to_bigquery, kus parameetriks on päring.

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

See funktsioon tagastab päringu andmeraamina.

Andmete visualiseerimine

Selle probleemi lahendamiseks valige matplotlib.

import matplotlib.pyplot plt-na

Vajame viit parameetrit, kus x on x-telje andmed, x_silt on telje pealkiri, y on y-telje andmed, y_silt on telje pealkiri ja pealkiri on kogu visualiseerimise pealkiri.

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

Salvestage pilt

Nüüd kasutame visualiseeringu loomiseks ja salvestamiseks kahte funktsiooni.

Avaldatud postituste arvu saadame iga päev. Kõigepealt kirjutame päringu.

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

Päring aitab koguda andmeid kahe nädala jooksul alates 2. detsembrist 2018.

Kasutame seda kuupäeva, kuna 2018-12-02 on faili bigquery-public-data.stackoverflow.post_history salvestatud viimased andmed, muudel juhtudel saate uusimate andmete hankimiseks kasutada CURRENT_DATE().

Andmete hankimiseks helistage funktsioonile query_to_bigquery.

andmeraam = query_to_bigquery(päring)

Seejärel kasutame x-telje jaoks kuupäeva andmete veergu ja y-telje jaoks veergu total_posts.

x = dataframe['kuupäev'].tolist()
y = andmeraam['total_posts'].tolist()

Visualiseerime selle funktsiooni visualize_bar_chart abil ja salvestame pildina.

plt = visualize_bar_chart(x=x, x_label='Kuupäev', y=y, y_label='Postitusi kokku', title='Igapäevased postitused')
plt.savefig('viz.png')

Mähime selle koodi funktsiooniga 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')

Saada pilt

Adressaadile aruande saatmiseks peate teadma parameetrit chat_id.

Me kasutame kasutajainfobot ja tippige /start. Bot vastab vajaliku teabega, chat_id sisaldub id väljal.

Nüüd loome funktsiooni send_image. See kasutab pildi toomiseks ja salvestamiseks funktsiooni get_and_save_image. Ja siis saadame kõik õigele kontaktile.

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

Põhiprogramm

Lõpuks loome rakenduse käivitamiseks teise funktsiooni, peamise. Ärge unustage muuta roboti jaoks YOUR_TOKEN-i.

Pidage meeles: see programm saadab pildi automaatselt teie määratud ajal. Näiteks saadame iga päev kell üheksa hommikul raporti.

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

Selle tulemusena näeb meie rakendus välja järgmine:

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

Salvestage fail ja nimetage see main.py.

Käivitame rakenduse, sisestades terminali käsu:

python3 main.py

Kõik on valmis. Nüüd on meil 50 koodireast koosnev robot, mis genereerib aruandeid ilma meie sekkumiseta.

Kontrollime robotit siitvalides käsu /send.

Kuidas delegeerida lihtsaid aruandeid robotile. Kirjutame roboti Pythonis ja Google BigQuerys

Valmis koodi saate aadressilt minu GitHub.

Skillbox soovitab:

Allikas: www.habr.com

Lisa kommentaar