Si t'i delegoni raporte të thjeshta një roboti. Shkrimi i një roboti në Python dhe Google BigQuery

Si t'i delegoni raporte të thjeshta një roboti. Shkrimi i një roboti në Python dhe Google BigQuery

A keni detyra që përsëriten ditë pas dite, javë pas jave? Për shembull, shkrimi i raporteve. Ju kërkoni të dhëna, analizoni ato, vizualizoni ato (bëni grafikët, grafikët) dhe më pas ia dërgoni shefit tuaj. Por, çka nëse e gjithë kjo do të ishte e automatizuar?

Në këtë tutorial ne do të krijojmë një bot për Telegram që do të ndihmojë në automatizimin e raportimit. Dhe gjëja më interesante është se i gjithë programi do të përbëhet nga vetëm 50 rreshta kodi! Nëse po krijoni një bot për Telegram për herë të parë, atëherë duhet ta lexoni edhe këtë post.

Skillbox rekomandon: Kurse praktike Zhvilluesi i Python nga e para.

Kujtojmë: për të gjithë lexuesit e "Habr" - një zbritje prej 10 rubla kur regjistroheni në çdo kurs Skillbox duke përdorur kodin promovues "Habr".

Le të fillojmë

Instalimi i bibliotekave

ne do të përdorim google-cloud-bigquery për të marrë të dhëna nga Google BigQuery. matplotlib, i mpirë и pandas do t'ju ndihmojë të vizualizoni të dhënat tuaja. python-telegram-bot do të dërgojë të dhënat e përfunduara në Telegram.

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

API i Google BigQuery po lidhet

Nëse duam të përdorim shërbimin, duhet të lidhim Google BigQuery API. Për ta bërë këtë shkojmë në Google Developers Console dhe krijoni një projekt të ri (ose zgjidhni një ekzistues).

Në panelin e kontrollit, zgjidhni ENABLE APIS AND SERVICES dhe kërkoni për BigQuery API.

Si t'i delegoni raporte të thjeshta një roboti. Shkrimi i një roboti në Python dhe Google BigQuery

Zgjidhni Aktivizo për të lidhur API-në.

Si t'i delegoni raporte të thjeshta një roboti. Shkrimi i një roboti në Python dhe Google BigQuery

Krijo një çelës llogarie

Le të shkojmë përsëri në Google Developers Console, zgjidhni skedën Kredencialet, Krijo kredencialet dhe çelësin e llogarisë së shërbimit.

Pastaj - Llogaria e re e shërbimit dhe futni emrin në fushën Emri i llogarisë së shërbimit.

Nga lista rënëse Role, zgjidhni Projekt > Pronari, më pas Krijo.

Si t'i delegoni raporte të thjeshta një roboti. Shkrimi i një roboti në Python dhe Google BigQuery

Skedari që do të shkarkohet automatikisht quhet creds.json.

Cakto GOOGLE_APPLICATION_CREDENTIALS, duke specifikuar shtegun drejt creds.json në terminal.

eksporto GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Nëse gjithçka shkoi mirë, është koha të filloni të shkruani programin.

Krijimi i një aplikacioni

Për tutorialin do të përdorim të dhëna nga bigquery-public-data.stackoverflow, për raportin tonë do të zgjedhim numrin e publikimeve ditore.

Gjithçka është mjaft e thjeshtë.

Pyetni tabelën -> Vizualizoni të dhënat -> Ruani vizualizimin -> Dërgoni imazhin

Le të krijojmë një funksion për të përcaktuar çdo thread.

Pyetje për BigQuery

Së pari ne importojmë bibliotekën.

nga google.cloud import bigquery

Ne krijojmë një funksion të quajtur query_to_bigquery, ku parametri është query.

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

Ky funksion do ta kthejë kërkesën si një kornizë të dhënash.

Vizualizimi i të dhënave

Për të zgjidhur këtë problem, zgjidhni matplotlib.

import matplotlib.pyplot si plt

Ne kemi nevojë për pesë parametra, ku x është të dhënat e boshtit x, x_label është titulli i boshtit, y është i dhënat e boshtit y, y_label është titulli për boshtin dhe titulli është titulli i të gjithë vizualizimit.

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

Ruani imazhin

Tani le të përdorim dy funksione për të krijuar një vizualizim dhe për ta ruajtur atë.

Ne do të dërgojmë numrin e postimeve të publikuara çdo ditë. Së pari ne shkruajmë një kërkesë.

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

Kërkesa ndihmon në mbledhjen e të dhënave për dy javë duke filluar nga 2 dhjetori 2018.

Ne e përdorim këtë datë sepse 2018-12-02 janë të dhënat më të fundit të regjistruara në bigquery-public-data.stackoverflow.post_history, në raste të tjera mund të përdorni CURRENT_DATE() për të marrë të dhënat më të reja.

Thirrni funksionin query_to_bigquery për të marrë të dhënat.

korniza e të dhënave = query_to_bigquery (pyetje)

Pastaj përdorim kolonën e të dhënave të datës për boshtin x dhe kolonën total_posts për boshtin y.

x = korniza e të dhënave['data'].tolist()
y = korniza e të dhënave['total_posts'].tolist()

Ne e vizualizojmë atë duke përdorur funksionin visualize_bar_chart dhe e ruajmë atë si imazh.

plt = visualize_bar_chart(x=x, x_label='Data', y=y, y_label='Totali i Postimeve', titulli='Postimet ditore')
plt.savefig ('viz.png')

Ne e mbështjellim këtë kod në një funksion të quajtur 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')

Dërgo një imazh

Për të dërguar një raport te marrësi, duhet të dini parametrin chat_id.

Ne përdorim userinfobot dhe shkruani /start. Bot përgjigjet me informacionin e nevojshëm, chat_id gjendet në fushën id.

Tani le të krijojmë funksionin send_image. Do të përdorë funksionin get_and_save_image për të marrë dhe ruajtur imazhin. Dhe pastaj ne dërgojmë gjithçka në kontaktin e duhur.

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

Programi kryesor

Së fundi, ne krijojmë një funksion tjetër, kryesor, për të nisur aplikacionin. Mos harroni të ndryshoni YOUR_TOKEN për robotin.

Mbani mend: ky program do të dërgojë imazhin automatikisht në kohën që ju specifikoni. Për shembull, ne do të dërgojmë një raport në nëntë të mëngjesit çdo ditë.

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

Si rezultat, aplikacioni ynë do të duket si ky:

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

Ruani skedarin dhe quajeni main.py.

Ne e hapim aplikacionin duke futur komandën në terminal:

python3 kryesore.py

Gjithçka është gati. Tani ne kemi një robot të përbërë nga 50 rreshta kodi që gjeneron raporte pa ndërhyrjen tonë.

Le të kontrollojmë robotin prandajduke zgjedhur komandën /send.

Si t'i delegoni raporte të thjeshta një roboti. Shkrimi i një roboti në Python dhe Google BigQuery

Ju mund të merrni kodin e përfunduar në GitHub-i im.

Skillbox rekomandon:

Burimi: www.habr.com

Shto një koment