Giunsa pagdelegar ang yano nga mga taho sa usa ka robot. Nagsulat kami og bot sa Python ug Google BigQuery

Giunsa pagdelegar ang yano nga mga taho sa usa ka robot. Nagsulat kami og bot sa Python ug Google BigQuery

Aduna ka bay mga buluhaton nga gisubli kada adlaw, matag semana? Pananglitan, pagsulat sa mga taho. Nangayo ka ug datos, pag-analisar niini, paghanduraw niini (paghimog mga graph, mga tsart), ug dayon ipadala kini sa imong amo. Apan komosta kon awtomatiko kining tanan?

Sa kini nga panudlo maghimo kami usa ka bot alang sa Telegram nga makatabang sa pag-automate sa pagreport. Ug ang labing cool nga butang mao nga ang tibuuk nga programa maglangkob lamang sa 50 nga linya sa code! Kung naghimo ka usa ka bot alang sa Telegram sa una nga higayon, kinahanglan nimo usab basahon kini post.

Girekomenda sa Skillbox: Praktikal nga kurso Python developer gikan sa scratch.

Gipahinumduman namon ikaw: alang sa tanan nga mga magbabasa sa "Habr" - usa ka diskwento sa 10 nga mga rubles kung nagpalista sa bisan unsang kurso sa Skillbox gamit ang code sa promosyon nga "Habr".

Magsugod na ta

Pag-instalar sa mga librarya

Gamiton namon google-cloud-bigquery aron makakuha og data gikan sa Google BigQuery. matplotlib, numpy и pandas makatabang kanimo nga mahanduraw ang imong datos. python-telegram-bot ipadala ang nahuman nga datos sa Telegram.

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

Pagkonektar sa Google BigQuery API

Kung gusto namong gamiton ang serbisyo, kinahanglan namong ikonektar ang Google BigQuery API. Sa pagbuhat niini kita moadto sa Google Developers Console ug paghimo og bag-ong proyekto (o pagpili og usa na).

Sa control panel, pilia ang ENBLE APIS AND SERVICES ug pangitaa ang BigQuery API.

Giunsa pagdelegar ang yano nga mga taho sa usa ka robot. Nagsulat kami og bot sa Python ug Google BigQuery

Pilia ang Enable aron makonektar ang API.

Giunsa pagdelegar ang yano nga mga taho sa usa ka robot. Nagsulat kami og bot sa Python ug Google BigQuery

Paghimo og yawe sa account

Adto ta pag-usab Google Developers Console, pilia ang tab nga Mga Kredensyal, Paghimo mga kredensyal ug yawe sa account sa Serbisyo.

Dayon - Bag-ong service account, ug isulod ang ngalan sa Service account name field.

Gikan sa Role drop-down list, pilia ang Project > Owner, unya Create.

Giunsa pagdelegar ang yano nga mga taho sa usa ka robot. Nagsulat kami og bot sa Python ug Google BigQuery

Ang file nga awtomatiko nga ma-download gitawag nga creds.json.

Itakda ang GOOGLE_APPLICATION_CREDENTIALS, nga nagpiho sa agianan padulong sa creds.json sa terminal.

export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Kung maayo ang tanan, panahon na nga magsugod sa pagsulat sa programa.

Paghimo og aplikasyon

Para sa tutorial gamiton namo ang data gikan sa bigquery-public-data.stackoverflow, para sa among report pilion namo ang gidaghanon sa inadlaw nga publikasyon.

Ang tanan yano ra.

Pangutana sa lamesa -> I-visualize ang data -> I-save ang visualization -> Ipadala ang imahe

Magbuhat ta ug usa ka function para ma-define ang matag thread.

Pangutana sa BigQuery

Una among gi-import ang library.

gikan sa google.cloud import bigquery

Naghimo mi og function nga gitawag og query_to_bigquery, diin ang parameter kay query.

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

Kini nga function ibalik ang hangyo ingon usa ka frame sa datos.

Pagtan-aw sa datos

Aron masulbad kini nga problema, pilia ang matplotlib.

import matplotlib.pyplot isip plt

Nagkinahanglan kami og lima ka mga parameter, diin ang x mao ang x-axis data, x_label ang titulo sa axis, y ang y-axis data, ang y_label mao ang titulo sa axis, ug ang titulo mao ang titulo sa tibuok 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

Karon atong gamiton ang duha ka mga function sa paghimo og visualization ug i-save kini.

Ipadala namo ang gidaghanon sa mga post nga gipatik kada adlaw. Una mi nagsulat og hangyo.

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

Ang pangutana makatabang sa pagkolekta sa datos sulod sa duha ka semana sugod sa Disyembre 2, 2018.

Gigamit namo kini nga petsa tungod kay ang 2018-12-02 mao ang pinakabag-o nga datos nga natala sa bigquery-public-data.stackoverflow.post_history, sa ubang mga kaso mahimo nimong gamiton ang CURRENT_DATE() aron makuha ang pinakabag-o nga datos.

Tawga ang query_to_bigquery function aron makuha ang datos.

dataframe = query_to_bigquery(query)

Dayon atong gamiton ang kolum sa datos sa petsa para sa x-axis, ug ang total_posts nga kolum para sa y-axis.

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

Gihanduraw namo kini gamit ang visualize_bar_chart function ug i-save kini isip usa ka hulagway.

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

Giputos namo kini nga code sa usa ka function nga gitawag og 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 ug hulagway

Aron makapadala ug report sa nakadawat, kinahanglan nimong masayran ang parameter sa chat_id.

Gigamit namo userinfobot ug type/start. Ang bot motubag uban sa gikinahanglan nga impormasyon, chat_id anaa sa id field.

Karon atong himoon ang send_image function. Gamiton niini ang get_and_save_image function aron makuha ug i-save ang imahe. Ug dayon ipadala namon ang tanan sa husto nga 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'))

Panguna nga programa

Sa katapusan, naghimo kami og laing function, panguna, aron ilunsad ang aplikasyon. Ayaw kalimot sa pag-ilis sa YOUR_TOKEN para sa bot.

Hinumdumi: kini nga programa awtomatikong ipadala ang imahe sa oras nga imong gitakda. Pananglitan, magpadala mi og report alas nuybe sa buntag kada adlaw.

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

Ingon usa ka sangputanan, ang among aplikasyon mahimong ingon niini:

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 ug tawga kini main.py.

Gilunsad namo ang aplikasyon pinaagi sa pagsulod sa command sa terminal:

python3 main.py

Andam na ang tanan. Karon kami adunay usa ka robot nga gilangkoban sa 50 ka linya sa code nga nagmugna og mga taho nga wala ang among pagpangilabot.

Atong susihon ang bot gikan dinhipinaagi sa pagpili sa /send command.

Giunsa pagdelegar ang yano nga mga taho sa usa ka robot. Nagsulat kami og bot sa Python ug Google BigQuery

Makuha nimo ang nahuman nga code sa akong GitHub.

Girekomenda sa Skillbox:

Source: www.habr.com

Idugang sa usa ka comment