Indlela yokuhambisa iingxelo ezilula kwirobhothi. Ukubhala i-bot kwiPython kunye neGoogle BigQuery

Indlela yokuhambisa iingxelo ezilula kwirobhothi. Ukubhala i-bot kwiPython kunye neGoogle BigQuery

Ngaba unayo imisebenzi ephindaphinda usuku nosuku, iveki emva kweveki? Umzekelo, ukubhala iingxelo. Ucela idatha, uyihlalutye, uyibone (yenza iigrafu, iitshathi), uze uyithumele kumphathi wakho. Kodwa kuthekani ukuba yonke le nto yayizenzekela?

Kwesi sifundo siya kwenza i-bot yeTelegram eya kunceda ukunika ingxelo ngokuzenzekelayo. Kwaye into epholileyo kukuba yonke inkqubo iya kuba nemigca yekhowudi ye-50 kuphela! Ukuba wenza i-bot yeTelegram okokuqala, kuya kufuneka uyifunde kwakhona iposti.

I-Skillbox iyacebisa: Ikhosi esebenzayo Umphuhlisi wePython ukusuka ekuqaleni.

Siyakhumbuza: kubo bonke abafundi be "Habr" - isaphulelo se-ruble ye-10 xa ubhalisa kuyo nayiphi na ikhosi ye-Skillbox usebenzisa ikhowudi yokuphromotha "Habr".

Masiqalise

Ukufakela amathala eencwadi

Siza kusebenzisa google-cloud-bigquery ukufumana idata kuGoogle BigQuery. matliblib, numpy и pandas kuya kukunceda ubone idatha yakho. ipython-telegram-bot iyakuthumela idatha egqityiweyo kwiTelegram.

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

Iqhagamshela iGoogle BigQuery API

Ukuba sifuna ukusebenzisa inkonzo, kufuneka sidibanise iGoogle BigQuery API. Ukwenza oku siya ku Google Developers Console kwaye wenze iprojekthi entsha (okanye ukhethe ekhoyo).

Kwiphaneli yolawulo, khetha YENZA I-APIS NEENKONZO kwaye ujonge iBigQuery API.

Indlela yokuhambisa iingxelo ezilula kwirobhothi. Ukubhala i-bot kwiPython kunye neGoogle BigQuery

Khetha Vulela ukudibanisa i-API.

Indlela yokuhambisa iingxelo ezilula kwirobhothi. Ukubhala i-bot kwiPython kunye neGoogle BigQuery

Yenza isitshixo seakhawunti

Masiyeni kwakhona Google Developers Console, khetha i IiNkcazo isithuba, Yenza iziqinisekiso kunye neqhosha leakhawunti yeNkonzo.

Emva koko - I-akhawunti entsha yenkonzo, kwaye ufake igama kwindawo yegama le-akhawunti yeNkonzo.

Kuluhlu oluhlayo lwendima, khetha iProjekthi > uMnini, emva koko Yenza.

Indlela yokuhambisa iingxelo ezilula kwirobhothi. Ukubhala i-bot kwiPython kunye neGoogle BigQuery

Ifayile eya kukhutshelwa ngokuzenzekelayo ibizwa ngokuba yi-creds.json.

Cwangcisa GOOGLE_APPLICATION_CREDENTIALS, ikhankanya indlela eya creds.json kwitheminali.

thumela ngaphandle GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ukuba yonke into ihambe kakuhle, lixesha lokuba uqale ukubhala inkqubo.

Ukwenza isicelo

Kwisifundo siza kusebenzisa idatha esuka kwi-binqury-public-data.stackoverflow, kwingxelo yethu siya kukhetha inani lopapasho lwemihla ngemihla.

Yonke into ilula kakhulu.

Buza itafile -> Jonga idatha -> Gcina umbono -> Thumela umfanekiso

Masenze umsebenzi omnye ukuchaza umsonto ngamnye.

Umbuzo kwi-BigQuery

Okokuqala singenisa ithala leencwadi.

ukusuka kugoogle.cloud yokungenisa enkulu

Senza umsebenzi obizwa ngokuba yi-query_to_bigquery, apho iparameter inombuzo.

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

Lo msebenzi uzakubuyisela isicelo njengesakhelo sedatha.

Ukubona idatha

Ukusombulula le ngxaki, khetha i-matplotlib.

ngenisa i-matplotlib.pyplot njenge-plt

Sifuna iiparamitha ezintlanu, apho ux yidatha ye-axis engu-x, x_ileyibhile sisihloko se-axis, y yidatha ye-axis, y_label sisihloko se-axis, kwaye isihloko sisihloko sokubonwayo ngokupheleleyo.

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

Gcina umfanekiso

Ngoku makhe sisebenzise imisebenzi emibini ukwenza umfanekiso kunye nokuwugcina.

Siza kuthumela inani lezithuba ezipapashwa mihla le. Okokuqala sibhala isicelo.

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

Umbuzo unceda ukuqokelela idatha kwiiveki ezimbini ukuqala nge-2 kaDisemba 2018.

Sisebenzisa lo mhla kuba u-2018-12-02 yidatha yamva nje eshicilelwe kwi-binqury-public-data.stackoverflow.post_history, kwezinye iimeko ungasebenzisa CURRENT_DATE () ukufumana eyona datha intsha.

Fowunela umsebenzi query_to_bigquery ukufumana idatha.

idataframe = query_to_bigquery(umbuzo)

Emva koko sisebenzisa ikholomu yomhla wedatha ye-x-axis, kunye ne-total_posts column ye-y-axis.

x = i-dataframe['umhla'].tolist()
y = idataframe['total_posts'].tolist()

Siyibona ngeso lengqondo sisebenzisa i-visualize_bar_chart umsebenzi kwaye uyigcine njengomfanekiso.

plt = jonga_itshati_yebha (x=x, x_label='Umhla', y=y, y_lebula='IziThuthi zizonke', isihloko='IziThuba zeMihla yonke')
plt.savefig('viz.png')

Siyisonga le khowudi kumsebenzi othi 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')

Thumela umfanekiso

Ukuze uthumele ingxelo kumamkeli, kufuneka ukwazi i parameter chat_id.

Sisebenzisa umsebenzisiinfobot kwaye uchwetheze / qala. I-bot iphendula ngolwazi oluyimfuneko, i-chat_id iqulethwe kwintsimi ye-id.

Ngoku makhe senze umsebenzi we-send_image. Iza kusebenzisa get_and_save_image umsebenzi wokubuyisela nokugcina umfanekiso. Kwaye ke sithumela yonke into kumnxeba ochanekileyo.

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

Inkqubo ephambili

Ekugqibeleni, senza omnye umsebenzi, oyintloko, ukuqalisa isicelo. Ungalibali ukutshintsha i-YOUR_TOKEN ye-bot.

Khumbula: le nkqubo izakuthumela umfanekiso ngokuzenzekelayo ngexesha olichazayo. Ngokomzekelo, siya kuthumela ingxelo ngentsimbi yethoba kusasa yonke imihla.

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

Ngenxa yoko, isicelo sethu siya kujongeka ngolu hlobo:

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

Gcina ifayile kwaye uyibize main.py.

Siqalisa usetyenziso ngokungenisa umyalelo kwi-terminal:

I-python3 engundoqo.py

Zonke zilungile. Ngoku sinerobhothi equkethe imigca ye-50 yekhowudi eyenza iingxelo ngaphandle kokungenelela kwethu.

Makhe sijonge ibhot kusuka aphangokukhetha i/thumela umyalelo.

Indlela yokuhambisa iingxelo ezilula kwirobhothi. Ukubhala i-bot kwiPython kunye neGoogle BigQuery

Ungafumana ikhowudi egqityiweyo apha iGitHub yam.

I-Skillbox iyacebisa:

umthombo: www.habr.com

Yongeza izimvo