Kuinka delegoida yksinkertaiset raportit robotille. Kirjoitamme botin Pythonissa ja Google BigQueryssä

Kuinka delegoida yksinkertaiset raportit robotille. Kirjoitamme botin Pythonissa ja Google BigQueryssä

Onko sinulla tehtäviä, jotka toistuvat päivästä toiseen, viikosta toiseen? Esimerkiksi raporttien kirjoittaminen. Pyydät tietoja, analysoit niitä, visualisoit ne (teet kaavioita, kaavioita) ja lähetät sen sitten pomollesi. Mutta entä jos tämä kaikki olisi automatisoitua?

Tässä opetusohjelmassa luomme Telegramille botin, joka auttaa automatisoimaan raportoinnin. Ja hienointa on, että koko ohjelma koostuu vain 50 rivistä koodia! Jos luot botin Telegramille ensimmäistä kertaa, sinun tulee myös lukea tämä posti.

Skillbox suosittelee: Käytännön kurssi Python-kehittäjä tyhjästä.

Muistutamme sinua: kaikille "Habrin" lukijoille - 10 000 ruplan alennus ilmoittautuessaan mille tahansa Skillbox-kurssille "Habr" -tarjouskoodilla.

Aloitetaan

Kirjastojen asentaminen

Käytämme google-cloud-bigquery saada tietoja Google BigQuerysta. matplotlib, numpy и pandas auttaa sinua visualisoimaan tietosi. python-telegram-bot lähettää valmiit tiedot Telegramille.

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

Yhdistetään Google BigQuery API:ta

Jos haluamme käyttää palvelua, meidän on yhdistettävä Google BigQuery API. Tätä varten menemme Google Developers Console ja luo uusi projekti (tai valitse olemassa oleva).

Valitse ohjauspaneelista OTA APIS JA PALVELUT KÄYTTÖÖN ja etsi BigQuery API.

Kuinka delegoida yksinkertaiset raportit robotille. Kirjoitamme botin Pythonissa ja Google BigQueryssä

Valitse Ota käyttöön yhdistääksesi API.

Kuinka delegoida yksinkertaiset raportit robotille. Kirjoitamme botin Pythonissa ja Google BigQueryssä

Luo tiliavain

Mennään taas Google Developers Console, valitse Tunnistetiedot-välilehti, Luo tunnistetiedot ja palvelutiliavain.

Sitten - Uusi palvelutili ja kirjoita nimi Palvelutilin nimi -kenttään.

Valitse avattavasta Rooli-luettelosta Projekti > Omistaja ja sitten Luo.

Kuinka delegoida yksinkertaiset raportit robotille. Kirjoitamme botin Pythonissa ja Google BigQueryssä

Automaattisesti ladattava tiedosto on nimeltään creds.json.

Aseta GOOGLE_APPLICATION_CREDENTIALS ja määritä polku creds.json-tiedostoon päätteessä.

vie GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Jos kaikki meni hyvin, on aika aloittaa ohjelman kirjoittaminen.

Luo sovellus

Tutoriaalissa käytämme dataa bigquery-public-data.stackoverflow-sivustosta, raportissamme valitsemme päivittäisten julkaisujen määrän.

Kaikki on melko yksinkertaista.

Kysely taulukosta -> Visualisoi tiedot -> Tallenna visualisointi -> Lähetä kuva

Luodaan yksi funktio kunkin säikeen määrittelemiseksi.

Kysely BigQuerylle

Ensin tuomme kirjaston.

google.cloud import bigquerysta

Luomme funktion nimeltä query_to_bigquery, jossa parametri on query.

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

Tämä toiminto palauttaa pyynnön tietokehyksenä.

Datan visualisointi

Ratkaise tämä ongelma valitsemalla matplotlib.

Tuo matplotlib.pyplot plt

Tarvitsemme viisi parametria, joissa x on x-akselin data, x_label on akselin otsikko, y on y-akselin data, y_label on akselin otsikko ja otsikko on koko visualisoinnin otsikko.

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

Tallenna kuva

Käytetään nyt kahta funktiota visualisoinnin luomiseen ja tallentamiseen.

Lähetämme päivittäin julkaistujen viestien määrän. Ensin kirjoitamme pyynnön.

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

Kysely auttaa keräämään tietoja kahden viikon ajalta 2 alkaen.

Käytämme tätä päivämäärää, koska 2018-12-02 on viimeisin data, joka on tallennettu tiedostoon bigquery-public-data.stackoverflow.post_history. Muissa tapauksissa voit käyttää CURRENT_DATE() saadaksesi uusimmat tiedot.

Soita query_to_bigquery-funktiota saadaksesi tiedot.

datakehys = query_to_bigquery(kysely)

Sitten käytämme päivämäärätietosaraketta x-akselille ja total_posts-saraketta y-akselille.

x = datakehys['päivämäärä'].tolist()
y = datakehys['total_posts'].tolist()

Visualisoimme sen visualize_bar_chart-funktiolla ja tallennamme sen kuvana.

plt = visualize_bar_chart(x=x, x_label='Päiväys', y=y, y_label='Viestit yhteensä', title='Päivittäiset viestit')
plt.savefig('viz.png')

Käärimme tämän koodin funktioon nimeltä 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')

Lähetä kuva

Jotta voit lähettää raportin vastaanottajalle, sinun on tiedettävä chat_id-parametri.

käyttö käyttäjätietobot ja kirjoita /start. Botti vastaa tarvittavilla tiedoilla, chat_id sisältyy id-kenttään.

Luodaan nyt send_image-funktio. Se käyttää get_and_save_image-funktiota kuvan hakemiseen ja tallentamiseen. Ja sitten lähetämme kaiken oikealle yhteyshenkilölle.

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ääohjelma

Lopuksi luomme toisen toiminnon, päätoiminnon, sovelluksen käynnistämiseksi. Muista vaihtaa YOUR_TOKEN bottiin.

Muista: tämä ohjelma lähettää kuvan automaattisesti määrittämäsi ajankohtana. Esimerkiksi lähetämme raportin joka päivä kello yhdeksän aamulla.

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

Tämän seurauksena sovelluksemme näyttää tältä:

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

Tallenna tiedosto ja kutsu se main.py:ksi.

Käynnistämme sovelluksen kirjoittamalla komennon terminaaliin:

python3 main.py

Kaikki on valmista. Nyt meillä on 50 koodirivistä koostuva robotti, joka luo raportteja ilman meidän väliintuloamme.

Tarkastetaan botti sitenvalitsemalla /send-komennon.

Kuinka delegoida yksinkertaiset raportit robotille. Kirjoitamme botin Pythonissa ja Google BigQueryssä

Saat valmiin koodin osoitteesta minun GitHub.

Skillbox suosittelee:

Lähde: will.com

Lisää kommentti