Чӣ гуна ҳисоботҳои оддиро ба робот супурдан мумкин аст. Навиштани бот дар Python ва Google BigQuery

Чӣ гуна ҳисоботҳои оддиро ба робот супурдан мумкин аст. Навиштани бот дар Python ва Google BigQuery

Оё шумо вазифаҳое доред, ки рӯз ба рӯз, ҳафта ба ҳафта такрор мешаванд? Масалан, навиштани гузоришҳо. Шумо маълумотро дархост мекунед, онро таҳлил мекунед, визуализатсия мекунед (графҳо, диаграммаҳо созед) ва сипас онро ба роҳбари худ мефиристед. Аммо чӣ мешавад, агар ҳамаи ин автоматӣ карда шавад?

Дар ин дарс мо барои Telegram бот эҷод мекунем, ки ба автоматикунонии гузориш кӯмак мекунад. Ва аз ҳама ҷолиб он аст, ки тамоми барнома танҳо аз 50 сатри рамз иборат хоҳад буд! Агар шумо бори аввал барои Telegram бот эҷод карда истода бошед, пас шумо бояд инро низ хонед пост.

Skillbox тавсия медиҳад: Курси амалӣ Таҳиягари Python аз сифр.

Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".

Биёед оғоз кунем

Насб кардани китобхонаҳо

Мо истифода хоҳем бурд google-cloud-bigquery Барои гирифтани маълумот аз Google BigQuery. матплотлиб, карахт и пандахо ба шумо кӯмак мекунад, ки маълумоти шуморо тасаввур кунед. python-telegram-bot маълумоти тайёрро ба Telegram мефиристад.

pip3 насб кардани google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Пайвастшавӣ ба Google BigQuery API

Агар мо хоҳем, ки хидматро истифода барем, мо бояд API-и Google BigQuery-ро пайваст кунем. Барои ин мо меравем Консерваторияи Google ва лоиҳаи нав эҷод кунед (ё лоиҳаи мавҷударо интихоб кунед).

Дар панели идоракунӣ, APIS ВА ХИЗМАТРАСОНИРО ДАРКОР КУНЕД -ро интихоб кунед ва BigQuery API-ро ҷустуҷӯ кунед.

Чӣ гуна ҳисоботҳои оддиро ба робот супурдан мумкин аст. Навиштани бот дар Python ва Google BigQuery

Барои пайваст кардани API-ро интихоб кунед Фаъол.

Чӣ гуна ҳисоботҳои оддиро ба робот супурдан мумкин аст. Навиштани бот дар Python ва Google BigQuery

Калиди ҳисоб эҷод кунед

Биёед боз ба Консерваторияи Google, ҷадвали Эҷоди эътимоднома ва калиди ҳисоби хидматро интихоб кунед.

Сипас - Ҳисоби хидматрасонии нав ва номро дар майдони номи ҳисоби хидмат ворид кунед.

Аз рӯйхати афтанда Нақш, Лоиҳа > Соҳиб ва баъд Эҷод -ро интихоб кунед.

Чӣ гуна ҳисоботҳои оддиро ба робот супурдан мумкин аст. Навиштани бот дар Python ва Google BigQuery

Файле, ки ба таври худкор бор карда мешавад, creds.json номида мешавад.

GOOGLE_APPLICATION_CREDENTIALS -ро насб кунед, ки роҳро ба creds.json дар терминал муайян кунед.

содироти GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Агар ҳама чиз хуб бошад, вақти он расидааст, ки ба навиштани барнома шурӯъ кунед.

Эҷоди барнома

Барои дарс мо маълумотро аз bigquery-public-data.stackoverflow истифода мебарем, барои гузориши худ мо шумораи нашрияҳои ҳаррӯзаро интихоб мекунем.

Ҳама чиз осон аст.

Ҷадвалро пурсед -> Маълумотро визуалӣ кунед -> Захира кардани визуализатсия -> Ирсоли тасвир

Биёед барои муайян кардани ҳар як ришта як функсия эҷод кунем.

Дархост ба BigQuery

Аввалан мо китобхонаро ворид мекунем.

аз google.cloud воридоти bigquery

Мо функсияеро бо номи query_to_bigquery эҷод мекунем, ки дар он параметр дархост аст.

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

Ин функсия дархостро ҳамчун чаҳорчӯбаи додаҳо бармегардонад.

Визуаликунонии маълумот

Барои ҳалли ин мушкилот, matplotlib -ро интихоб кунед.

воридоти matplotlib.pyplot ҳамчун plt

Ба мо панҷ параметр лозим аст, ки дар он x маълумоти меҳвари x аст, x_label сарлавҳа барои меҳвар, y маълумоти меҳвари y аст, y_label сарлавҳа барои меҳвар ва унвон унвони тамоми визуализатсия аст.

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

Тасвирро захира кунед

Акнун биёед ду функсияро барои сохтани визуализатсия ва захира кардани он истифода барем.

Мо шумораи паёмҳои ҳаррӯза нашршударо мефиристем. Аввалан мо дархост менависем.

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

Дархост барои ҷамъоварии маълумот дар давоми ду ҳафта аз 2 декабри соли 2018 кӯмак мекунад.

Мо ин санаро истифода мебарем, зеро 2018-12-02 охирин маълумоти дар bigquery-public-data.stackoverflow.post_history сабтшуда мебошад, дар дигар ҳолатҳо шумо метавонед CURRENT_DATE()-ро барои гирифтани маълумоти навтарин истифода баред.

Барои гирифтани маълумот ба функсияи query_to_bigquery занг занед.

dataframe = query_to_bigquery(пурсиш)

Сипас мо сутуни маълумоти санаро барои меҳвари x ва сутуни total_posts барои меҳвари y истифода мебарем.

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

Мо онро бо истифода аз функсияи visualize_bar_chart тасаввур мекунем ва онро ҳамчун тасвир захира мекунем.

plt = visualize_bar_chart(x=x, x_label='Сана', y=y, y_label='Маҷмӯи интишорҳо', унвон ='Интишори ҳаррӯза')
plt.savefig('viz.png')

Мо ин кодро дар функсия бо номи 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')

Тасвир фиристед

Барои фиристодани гузориш ба қабулкунанда, шумо бояд параметри chat_id-ро бидонед.

Мо истифода мебарем userinfobot ва ворид кунед / оғоз кунед. Бот бо маълумоти зарурӣ ҷавоб медиҳад, chat_id дар майдони id мавҷуд аст.

Акнун биёед функсияи send_image эҷод кунем. Он функсияи get_and_save_image -ро барои дарёфт ва захира кардани тасвир истифода мебарад. Ва он гоҳ мо ҳама чизро ба тамоси дуруст мефиристем.

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

Барномаи асосй

Ниҳоят, мо функсияи дигареро, яъне асосӣ, барои оғози барнома эҷод мекунем. Фаромӯш накунед, ки YOUR_TOKEN-ро барои бот иваз кунед.

Дар хотир доред: ин барнома тасвирро дар вақти муайянкардаи шумо ба таври худкор мефиристад. Масалан, мо хар руз соати нухи пагохй хабар мефиристем.

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

Дар натиҷа, аризаи мо чунин хоҳад буд:

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

Файлро захира кунед ва онро main.py даъват кунед.

Мо барномаро тавассути ворид кардани фармон дар терминал оғоз мекунем:

python3 main.py

Ҳама омода аст. Ҳоло мо роботе дорем, ки аз 50 сатри код иборат аст, ки бидуни дахолати мо гузоришҳо тавлид мекунад.

Биёед ботро тафтиш кунем аз ин ҷобо интихоби фармони /send.

Чӣ гуна ҳисоботҳои оддиро ба робот супурдан мумкин аст. Навиштани бот дар Python ва Google BigQuery

Шумо метавонед рамзи тайёрро аз он гиред GitHub ман.

Skillbox тавсия медиҳад:

Манбаъ: will.com

Илова Эзоҳ