Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery

Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery

Karên we hene ku roj bi roj, hefte bi hefte dubare dikin? Ji bo nimûne, nivîsandina raporan. Hûn daneyan daxwaz dikin, wê analîz bikin, wê xuyang bikin (grafîkan, nexşeyan çêbikin), û dûv re wê ji serokê xwe re bişînin. Lê eger ev hemî bixweber bû?

Di vê tutoriyê de em ê botekek ji bo Telegram-ê biafirînin ku dê alîkariya raporkirina otomatîk bike. Û ya herî xweş ev e ku hemî bername dê tenê ji 50 rêzikên kodê pêk were! Ger hûn cara yekem botekek ji bo Telegram diafirînin, wê hingê divê hûn vê yekê jî bixwînin post.

Skillbox pêşniyar dike: Kursa pratîk Pêşdebirê Python ji sifirê.

Em bînin bîra xwe: ji bo hemî xwendevanên "Habr" - dema ku hûn beşdarî qursek Skillbox-ê bi karanîna koda danasînê ya "Habr" têne qeyd kirin 10 rubleyan dakêşin.

Werin em dest pê bikin

Sazkirina pirtûkxaneyan

Em ê bikar bînin google-cloud-bigquery da ku daneyên ji Google BigQuery bistînin. matplotlib, numpy и pandas dê ji we re bibe alîkar ku hûn daneyên xwe xuyang bikin. python-telegram-bot dê daneyên qedandî ji Telegram re bişîne.

pip3 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot saz bike

Girêdana Google BigQuery API

Ger em dixwazin karûbarê bikar bînin, divê em API-ya Google BigQuery ve girêbidin. Ji bo vê yekê em diçin Console Developers of Google û projeyek nû biafirînin (an jî yek heyî hilbijêrin).

Di panela kontrolê de, APIS Û XIZMETÊN ENABLE hilbijêrin û li API-a BigQuery bigerin.

Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery

Ji bo girêdana API-ê çalak bike hilbijêrin.

Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery

Mifteyek hesabek çêbikin

Ka em dîsa herin Console Developers of Google, tabloya pêbaweriyê hilbijêrin, pêbaweriyê biafirînin û mifteya hesabê karûbarê.

Dûv re - Hesabê karûbarê nû, û navê di qada navê hesabê karûbarê de binivîsin.

Ji navnîşa dakêşana Rolê, Proje> Xwedî hilbijêrin, paşê Biafirînin.

Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery

Pela ku dê bixweber were daxistin jê re creds.json tê gotin.

GOOGLE_APPLICATION_CREDENTIALS saz bike, di termînalê de riya creds.json diyar bike.

hinardekirina GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ger her tişt baş bû, wextê dest bi nivîsandina bernameyê ye.

Afirandina serîlêdanê

Ji bo dersê em ê daneyên ji bigquery-public-data.stackoverflow bikar bînin, ji bo rapora xwe em ê hejmara weşanên rojane hilbijêrin.

Her tişt pir hêsan e.

Li ser tabloyê bipirsin -> Daneyên dîtbar -> Dîmenê hilînin -> Wêne bişînin

Werin em yek fonksiyonê biafirînin ku her mijarek diyar bike.

Ji BigQuery re pirs bikin

Pêşî em pirtûkxaneyê îthal dikin.

ji google.cloud import bigquery

Em fonksiyonek bi navê query_to_bigquery diafirînin, ku parametre query e.

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

Ev fonksiyon dê daxwazê ​​wekî çarçoveyek daneyê vegerîne.

Visualizing data

Ji bo çareserkirina vê pirsgirêkê, matplotlib hilbijêrin.

matplotlib.pyplot wekî plt têxe

Pêdiviya me bi pênc pîvanan heye, ku x daneya eksê ye, x_label sernavê eksê ye, y daneya y-ê ye, y_label sernavê eksê ye, û sernav sernavê tevahiya dîtbariyê ye.

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

Wêne tomar bike

Naha em du fonksiyonan bikar bînin da ku dîmenek çêbikin û wê hilînin.

Em ê hejmara postên ku rojane têne weşandin bişînin. Pêşî em daxwazek dinivîsin.

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

Lêpirsîn ji 2-ê Kanûna Pêşîn, 2018-an pê ve du hefte ji berhevkirina daneyan re dibe alîkar.

Em vê tarîxê bikar tînin ji ber ku 2018-12-02 daneya herî dawî ye ku di bigquery-public-data.stackoverflow.post_history de hatî tomar kirin, di rewşên din de hûn dikarin CURRENT_DATE() bikar bînin da ku daneya herî nû bistînin.

Ji bo wergirtina daneyê bangî fonksiyona query_to_bigquery bikin.

dataframe = query_to_bigquery (pirsîn)

Dûv re em stûna daneya tarîxê ji bo eksê x-ê, û stûna total_posts ji bo y-xebatê bikar tînin.

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

Em wê bi karanîna fonksiyona visualize_bar_chart xuya dikin û wekî wêneyek hilînin.

plt = visualize_bar_chart(x=x, x_label='Dîroka', y=y, y_label='Tevahiya Mesaj', sernav='Mesajên Rojane')
plt.savefig('viz.png')

Em vê kodê di fonksiyonek bi navê get_and_save_image de dipêçin.

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

Wêneyek bişînin

Ji bo ku hûn raporek ji wergir re bişînin, hûn hewce ne ku pîvana chat_id zanibin.

Em bikar tînin userinfobot û binivîsin / dest pê bikin. Bot bi agahdariya pêwîst bersiv dide, chat_id di qada id de heye.

Naha em fonksiyona send_image biafirînin. Ew ê fonksiyona get_and_save_image bikar bîne da ku wêneyê bigire û hilîne. Û paşê em her tiştî bi têkiliya rast re bişînin.

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

Bernameya sereke

Di dawiyê de, em fonksiyonek din, sereke, ji bo destpêkirina serîlêdanê diafirînin. Ji bîr neke ku YOUR_TOKEN ji bo botê biguherîne.

Bînin bîra xwe: ev bername dê di dema ku hûn diyar dikin de wêneyê bixweber bişîne. Mînak em ê her roj saet di nehê sibehê de raporekê bişînin.

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

Wekî encamek, serîlêdana me dê bi vî rengî xuya bike:

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

Pelê hilînin û jê re dibêjin main.py.

Em bi ketina fermana di termînalê de serîlêdanê dest pê dikin:

python3 main.py

Hemî amade ye. Naha robotek me heye ku ji 50 rêzikên kodê pêk tê ku bêyî destwerdana me raporan çêdike.

Ka em botê kontrol bikin ji virbi hilbijartina fermana / şandinê.

Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery

Hûn dikarin koda qedandî li vir bistînin GitHub min.

Skillbox pêşniyar dike:

Source: www.habr.com

Add a comment