Uyidlulisela kanjani imibiko elula irobhothi. Sibhala i-bot ku-Python naku-Google BigQuery

Uyidlulisela kanjani imibiko elula irobhothi. Sibhala i-bot ku-Python naku-Google BigQuery

Ingabe unayo imisebenzi ephindaphinda usuku nosuku, isonto nesonto? Isibonelo, ukubhala imibiko. Ucela idatha, uyihlaziye, uyibone ngeso lengqondo (yenza amagrafu, amashadi), bese uyithumela kumphathi wakho. Kodwa kuthiwani uma konke lokhu bekuzenzakalelayo?

Kulesi sifundo sizodala i-bot yeTelegram ezosiza ukubika ngokuzenzakalelayo. Futhi into ebanda kunazo zonke ukuthi lonke uhlelo luzoba nemigqa yekhodi engu-50 kuphela! Uma udala i-bot yeTelegramu okokuqala ngqa, kufanele ufunde nalena okusheshayo.

I-Skillbox iyancoma: Isifundo esiwusizo Umthuthukisi wePython kusukela ekuqaleni.

Siyakukhumbuza: kubo bonke abafundi be-"Habr" - isaphulelo sama-ruble angu-10 lapho ubhalisa kunoma yisiphi isifundo se-Skillbox usebenzisa ikhodi yephromoshini ethi "Habr".

Ake siqale

Ifaka imitapo yolwazi

Sizosebenzisa google-cloud-bigquery ukuze uthole idatha ku-Google BigQuery. umathop, numpy и pandas izokusiza ukuthi ubone ngeso lengqondo idatha yakho. i-python-telegram-bot izothumela idatha eqediwe kuTelegram.

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

Ixhuma i-Google BigQuery API

Uma sifuna ukusebenzisa isevisi, sidinga ukuxhuma i-Google BigQuery API. Ukwenza lokhu siya ku I-Google Developers Console bese udala iphrojekthi entsha (noma khetha ekhona kakade).

Kuphaneli yokulawula, khetha VIKA AMANDLA AMA-API KANYE NEZINKONZO bese ubheka i-BigQuery API.

Uyidlulisela kanjani imibiko elula irobhothi. Sibhala i-bot ku-Python naku-Google BigQuery

Khetha okuthi Vumela ukuxhuma i-API.

Uyidlulisela kanjani imibiko elula irobhothi. Sibhala i-bot ku-Python naku-Google BigQuery

Dala ukhiye we-akhawunti

Asihambe futhi I-Google Developers Console, khetha ithebhu ethi Ukuqinisekisa, Dala imininingwane kanye nokhiye we-akhawunti Yesevisi.

Bese - I-akhawunti yesevisi entsha, bese ufaka igama endaweni yegama le-akhawunti yesevisi.

Kuhlu lokudonsela phansi Indima, khetha Iphrojekthi > Umnikazi, bese Dala.

Uyidlulisela kanjani imibiko elula irobhothi. Sibhala i-bot ku-Python naku-Google BigQuery

Ifayela elizolandwa ngokuzenzakalelayo libizwa ngokuthi creds.json.

Setha i-GOOGLE_APPLICATION_CREDENTIALS, ucacise indlela eya ku-creds.json kutheminali.

thekelisa i-GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Uma konke kuhambe kahle, sekuyisikhathi sokuqala ukubhala uhlelo.

Ukudala uhlelo lokusebenza

Okokufundisa sizosebenzisa idatha evela ku-binqury-public-data.stackoverflow, embikweni wethu sizokhetha inombolo yokushicilelwa kwansuku zonke.

Konke kulula.

Buza ithebula -> Bona ngeso lengqondo idatha -> Gcina ukubonakala -> Thumela isithombe

Ake sakhe umsebenzi owodwa ukuze sichaze umucu ngamunye.

Umbuzo ku-BigQuery

Okokuqala singenisa umtapo wolwazi.

kusuka ku-google.cloud yokungenisa enkulu

Sakha umsebenzi obizwa ngokuthi query_to_bigquery, lapho ipharamitha ingumbuzo.

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 uzobuyisela isicelo njengohlaka lwedatha.

Ukubuka idatha

Ukuxazulula le nkinga, khetha i-matplotlib.

ngenisa i-matplotlib.pyplot njenge-plt

Sidinga amapharamitha amahlanu, lapho u-x kuyidatha ye-eksisi ka-x, i-x_lebula iyisihloko se-eksisi, y idatha ye-eksisi ka-y, i-y_lebula yisihloko se-eksisi, futhi isihloko siyisihloko sakho konke ukubuka.

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

Londoloza isithombe

Manje ake sisebenzise imisebenzi emibili ukuze sakhe ukubonwa futhi sikulondoloze.

Sizothumela inombolo yokuthunyelwe nsuku zonke. 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 usiza ukuqoqa idatha yamaviki amabili kusukela ngomhla ka-2 Disemba 2018.

Sisebenzisa le dethi ngoba u-2018-12-02 idatha yakamuva eqoshwe ku-bigquery-public-data.stackoverflow.post_history, kwezinye izimo ungasebenzisa CURRENT_DATE() ukuze uthole idatha entsha.

Shayela umsebenzi we-query_to_bigquery ukuze uthole idatha.

idathaframe = query_to_bigquery(umbuzo)

Bese sisebenzisa ikholomu yedatha yedethi ku-eksisi ka-x, kanye nekholomu_yokuthunyelwe okuphelele kwe-eksisi ka-y.

x = i-dataframe['idethi'].tolist()
y = uhlaka lwedatha['okuthunyelwe_okuphelele'].tolist()

Siyibona ngeso lengqondo sisebenzisa umsebenzi we-visualize_bar_chart futhi siyilondoloze njengesithombe.

plt = visualize_bar_chart(x=x, x_label='Usuku', y=y, y_lebula='Isamba Sokuthunyelwe', isihloko='Okuthunyelwe Kwansuku zonke')
plt.savefig('viz.png')

Sigoqa le khodi ngomsebenzi 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 isithombe

Ukuze uthumele umbiko kumamukeli, udinga ukwazi ipharamitha ye-chat_id.

Sisebenzisa userinfobot bese uthayipha / qala. I-bot iphendula ngolwazi oludingekayo, i-chat_id iqukethwe kunkambu ye-id.

Manje ake sakhe umsebenzi we-send_image. Izosebenzisa umsebenzi we-get_and_save_image ukuze ithole futhi ilondoloze isithombe. Bese sithumela yonke into koxhumana naye olungile.

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

Uhlelo oluyinhloko

Ekugcineni, sakha omunye umsebenzi, oyinhloko, ukuqalisa uhlelo lokusebenza. Ungakhohlwa ukushintsha i-YOUR_TOKEN ye-bot.

Khumbula: lolu hlelo luzothumela isithombe ngokuzenzakalelayo ngesikhathi osicacisayo. Ngokwesibonelo, sizothumela umbiko ngehora lesishiyagalolunye ekuseni nsuku zonke.

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 yalokho, isicelo sethu sizobukeka kanje:

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

Londoloza ifayela bese ulibiza ngokuthi main.py.

Sethula uhlelo lokusebenza ngokufaka umyalo kutheminali:

python3 main.py

Konke sekulungile. Manje sinerobhothi elihlanganisa imigqa yekhodi engu-50 ekhiqiza imibiko ngaphandle kokungenelela kwethu.

Ake sihlole i-bot kusuka laphangokukhetha umyalo /thumela.

Uyidlulisela kanjani imibiko elula irobhothi. Sibhala i-bot ku-Python naku-Google BigQuery

Ungathola ikhodi eqediwe ku I-GitHub yami.

I-Skillbox iyancoma:

Source: www.habr.com

Engeza amazwana