Paano magtalaga ng mga simpleng ulat sa isang robot. Pagsusulat ng bot sa Python at Google BigQuery

Paano magtalaga ng mga simpleng ulat sa isang robot. Pagsusulat ng bot sa Python at Google BigQuery

Mayroon ka bang mga gawain na umuulit araw-araw, linggo-linggo? Halimbawa, pagsulat ng mga ulat. Humiling ka ng data, pag-aralan ito, i-visualize ito (gumawa ng mga graph, chart), at pagkatapos ay ipadala ito sa iyong boss. Ngunit paano kung ang lahat ng ito ay awtomatiko?

Sa tutorial na ito gagawa kami ng bot para sa Telegram na makakatulong sa pag-automate ng pag-uulat. At ang pinaka-cool na bagay ay ang buong programa ay bubuo lamang ng 50 linya ng code! Kung lumikha ka ng isang bot para sa Telegram sa unang pagkakataon, dapat mo ring basahin ang isang ito magpaskil.

Inirerekomenda ng Skillbox ang: Praktikal na kurso Python developer mula sa simula.

Pinapaalala namin sa iyo: para sa lahat ng mga mambabasa ng "Habr" - isang diskwento na 10 rubles kapag nag-enroll sa anumang kurso sa Skillbox gamit ang code na pang-promosyon ng "Habr".

Magsimula na tayo

Pag-install ng mga aklatan

Gagamitin natin google-cloud-bigquery upang makakuha ng data mula sa Google BigQuery. matplotlib, numpy ΠΈ pandas ay tutulong sa iyo na makita ang iyong data. python-telegram-bot ipapadala ang natapos na data sa Telegram.

pip3 i-install ang google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Pagkonekta ng Google BigQuery API

Kung gusto naming gamitin ang serbisyo, kailangan naming ikonekta ang Google BigQuery API. Upang gawin ito pumunta kami sa Google Developers Console at lumikha ng isang bagong proyekto (o pumili ng isang umiiral na).

Sa control panel, piliin ang I-ENABLE ANG MGA API AT SERBISYO at hanapin ang BigQuery API.

Paano magtalaga ng mga simpleng ulat sa isang robot. Pagsusulat ng bot sa Python at Google BigQuery

Piliin ang I-enable para ikonekta ang API.

Paano magtalaga ng mga simpleng ulat sa isang robot. Pagsusulat ng bot sa Python at Google BigQuery

Gumawa ng account key

Tara na ulit Google Developers Console, piliin ang tab na Mga Kredensyal, Lumikha ng mga kredensyal at Key ng account ng serbisyo.

Pagkatapos - Bagong service account, at ilagay ang pangalan sa Service account name field.

Mula sa drop-down na listahan ng Tungkulin, piliin ang Proyekto > May-ari, pagkatapos ay Gumawa.

Paano magtalaga ng mga simpleng ulat sa isang robot. Pagsusulat ng bot sa Python at Google BigQuery

Ang file na awtomatikong mada-download ay tinatawag na creds.json.

Itakda ang GOOGLE_APPLICATION_CREDENTIALS, na tumutukoy sa path sa creds.json sa terminal.

i-export ang GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Kung naging maayos ang lahat, oras na upang simulan ang pagsulat ng programa.

Paglikha ng isang application

Para sa tutorial na gagamitin namin ang data mula sa bigquery-public-data.stackoverflow, para sa aming ulat pipiliin namin ang bilang ng mga pang-araw-araw na publikasyon.

Ang lahat ay medyo simple.

I-query ang talahanayan -> I-visualize ang data -> I-save ang visualization -> Ipadala ang larawan

Gumawa tayo ng isang function para tukuyin ang bawat thread.

Query sa BigQuery

Umimport muna kami ng library.

mula sa google.cloud import bigquery

Lumilikha kami ng isang function na tinatawag na query_to_bigquery, kung saan ang parameter ay query.

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

Ibabalik ng function na ito ang kahilingan bilang isang data frame.

Pag-visualize ng data

Upang malutas ang problemang ito, piliin ang matplotlib.

i-import ang matplotlib.pyplot bilang plt

Kailangan namin ng limang parameter, kung saan ang x ay ang x-axis data, ang x_label ay ang pamagat para sa axis, y ang y-axis data, ang y_label ay ang pamagat para sa axis, at ang pamagat ay ang pamagat ng buong visualization.

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

I-save ang imahe

Ngayon ay gumamit tayo ng dalawang function upang lumikha ng visualization at i-save ito.

Ipapadala namin ang bilang ng mga post na nai-publish araw-araw. Una, sumulat kami ng isang kahilingan.

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

Nakakatulong ang query na mangolekta ng data para sa dalawang linggo simula Disyembre 2, 2018.

Ginagamit namin ang petsang ito dahil ang 2018-12-02 ay ang pinakabagong data na naitala sa bigquery-public-data.stackoverflow.post_history, sa ibang mga kaso maaari mong gamitin ang CURRENT_DATE() para makuha ang pinakabagong data.

Tawagan ang query_to_bigquery function para makuha ang data.

dataframe = query_to_bigquery(query)

Pagkatapos ay ginagamit namin ang column ng data ng petsa para sa x-axis, at ang column na total_posts para sa y-axis.

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

Inilarawan namin ito gamit ang visualize_bar_chart function at i-save ito bilang isang imahe.

plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')

Binalot namin ang code na ito sa isang function na tinatawag na 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')

Magpadala ng larawan

Upang makapagpadala ng ulat sa tatanggap, kailangan mong malaman ang parameter ng chat_id.

Gumamit userinfobot at i-type /simulan. Ang bot ay tumugon sa kinakailangang impormasyon, ang chat_id ay nasa field ng id.

Ngayon gawin natin ang send_image function. Gagamitin nito ang get_and_save_image function para kunin at i-save ang imahe. At pagkatapos ay ipinapadala namin ang lahat sa tamang contact.

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

Pangunahing programa

Sa wakas, lumikha kami ng isa pang function, pangunahing, upang ilunsad ang application. Huwag kalimutang palitan ang YOUR_TOKEN para sa bot.

Tandaan: awtomatikong ipapadala ng program na ito ang larawan sa oras na iyong tinukoy. Halimbawa, magpapadala kami ng ulat sa alas nuwebe ng umaga araw-araw.

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

Bilang resulta, magiging ganito ang hitsura ng aming aplikasyon:

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

I-save ang file at tawagan itong main.py.

Inilunsad namin ang application sa pamamagitan ng pagpasok ng command sa terminal:

python3 main.py

Handa na ang lahat. Ngayon ay mayroon na kaming robot na binubuo ng 50 linya ng code na bumubuo ng mga ulat nang walang aming interbensyon.

Suriin natin ang bot kayasa pamamagitan ng pagpili sa /send command.

Paano magtalaga ng mga simpleng ulat sa isang robot. Pagsusulat ng bot sa Python at Google BigQuery

Makukuha mo ang tapos na code sa aking GitHub.

Inirerekomenda ng Skillbox ang:

Pinagmulan: www.habr.com

Magdagdag ng komento