Ինչպես փոխանցել պարզ հաշվետվությունները ռոբոտին: Բոտ գրել Python-ում և Google BigQuery-ում

Ինչպես փոխանցել պարզ հաշվետվությունները ռոբոտին: Բոտ գրել Python-ում և Google BigQuery-ում

Ունե՞ք առաջադրանքներ, որոնք կրկնվում են օր առ օր, շաբաթ առ շաբաթ: Օրինակ՝ հաշվետվություններ գրելը։ Դուք տվյալներ եք խնդրում, վերլուծում, պատկերացնում եք դրանք (գրաֆիկներ, գծապատկերներ պատրաստում) և այնուհետև ուղարկում ձեր ղեկավարին: Բայց ինչ կլիներ, եթե այս ամենը ավտոմատացված լիներ:

Այս ձեռնարկում մենք կստեղծենք բոտ Telegram-ի համար, որը կօգնի ավտոմատացնել հաշվետվությունները: Եվ ամենաթեժն այն է, որ ամբողջ ծրագիրը բաղկացած կլինի ընդամենը 50 տող կոդից: Եթե ​​առաջին անգամ եք բոտ ստեղծում Telegram-ի համար, ապա պետք է կարդալ նաև սա գրառում.

Skillbox-ը խորհուրդ է տալիս. Գործնական դասընթաց Python-ի մշակողը զրոյից.

Հիշեցում. «Habr»-ի բոլոր ընթերցողների համար՝ 10 ռուբլի զեղչ «Habr» գովազդային կոդով Skillbox-ի ցանկացած դասընթացին գրանցվելիս:

Եկեք սկսենք

Գրադարանների տեղադրում

Մենք կօգտագործենք google-cloud-bigquery Google BigQuery-ից տվյալներ ստանալու համար: մատպլոտլիբ, անզգամ и pandas կօգնի ձեզ պատկերացնել ձեր տվյալները: python-telegram-bot պատրաստի տվյալները կուղարկի Telegram-ին։

pip3 տեղադրել google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API-ի միացում

Եթե ​​ցանկանում ենք օգտվել ծառայությունից, մենք պետք է միացնենք Google BigQuery API-ն: Դա անելու համար մենք գնում ենք Google Developers- ի վահանակ և ստեղծել նոր նախագիծ (կամ ընտրել գոյություն ունեցողը):

Կառավարման վահանակում ընտրեք ENABLE APIS AND SERVICES և փնտրեք BigQuery API:

Ինչպես փոխանցել պարզ հաշվետվությունները ռոբոտին: Բոտ գրել Python-ում և Google BigQuery-ում

API-ը միացնելու համար ընտրեք Միացնել:

Ինչպես փոխանցել պարզ հաշվետվությունները ռոբոտին: Բոտ գրել Python-ում և Google BigQuery-ում

Ստեղծեք հաշվի բանալի

Եկեք նորից գնանք Google Developers- ի վահանակ, ընտրեք «Հավատարմագրեր» ներդիրը, «Ստեղծել հավատարմագրեր» և «Ծառայության» հաշվի բանալին:

Այնուհետև - Նոր ծառայության հաշիվ և մուտքագրեք անունը Ծառայության հաշվի անուն դաշտում:

Դեր բացվող ցանկից ընտրեք Նախագիծ > Սեփականատեր, ապա Ստեղծեք:

Ինչպես փոխանցել պարզ հաշվետվությունները ռոբոտին: Բոտ գրել Python-ում և Google BigQuery-ում

Այն ֆայլը, որը ավտոմատ կերպով կներբեռնվի, կոչվում է creds.json:

Սահմանեք GOOGLE_APPLICATION_CREDENTIALS՝ տերմինալում նշելով դեպի creds.json ճանապարհը:

արտահանել GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Եթե ​​ամեն ինչ լավ է անցել, ժամանակն է սկսել գրել ծրագիրը:

Հավելվածի ստեղծում

Ուսուցման համար մենք կօգտագործենք տվյալները bigquery-public-data.stackoverflow-ից, մեր զեկույցի համար կընտրենք ամենօրյա հրապարակումների քանակը:

Ամեն ինչ բավականին պարզ է.

Հարցրեք աղյուսակը -> Պատկերացրեք տվյալները -> Պահպանեք վիզուալիզացիան -> Ուղարկեք պատկերը

Եկեք ստեղծենք մեկ ֆունկցիա՝ յուրաքանչյուր շարանը սահմանելու համար։

Հարցում BigQuery-ին

Նախ ներմուծում ենք գրադարանը։

google.cloud import bigquery-ից

Մենք ստեղծում ենք մի ֆունկցիա, որը կոչվում է query_to_bigquery, որտեղ պարամետրը query է:

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 ֆունկցիան:

տվյալների շրջանակ = query_to_bigquery (հարցում)

Այնուհետև x առանցքի համար օգտագործում ենք ամսաթվի տվյալների սյունակը, y առանցքի համար՝ total_posts սյունակը:

x = տվյալների շրջանակ['date'].tolist()
y = տվյալների շրջանակ['total_posts'].tolist()

Մենք պատկերացնում ենք այն՝ օգտագործելով visualize_bar_chart ֆունկցիան և պահպանում այն ​​որպես պատկեր:

plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Ընդամենը հաղորդագրություններ', title='Ամենօրյա գրառումներ')
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 և մուտքագրեք /start. Բոտը պատասխանում է անհրաժեշտ տեղեկություններով, 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-ը խորհուրդ է տալիս.

Source: www.habr.com

Добавить комментарий