Conas tuairiscí simplí a tharmligean chuig róbat. Scríobhaimid bot i Python agus Google BigQuery

Conas tuairiscí simplí a tharmligean chuig róbat. Scríobhaimid bot i Python agus Google BigQuery

An bhfuil tascanna agat a athdhéantar lá i ndiaidh lae, seachtain i ndiaidh seachtaine? Mar shampla, tuairiscí a scríobh. Iarrann tú sonraí, déanann tú anailís orthu, déan iad a shamhlú (déan graif, cairteacha), agus ansin seolann tú chuig do bhainisteoir iad. Ach cad a tharlaíonn má bhí sé seo go léir uathoibrithe?

Sa rang teagaisc seo cruthóimid bot do Telegram a chabhróidh le tuairisciú a uathoibriú. Agus is é an rud is fuaire ná nach mbeidh sa chlár iomlán ach 50 líne de chód! Má tá bot á chruthú agat do Telegram den chéad uair, ba cheart duit an ceann seo a léamh freisin post.

Molann Skillbox: Cúrsa praiticiúil Python forbróir ó scratch.

Meabhraímid: do léitheoirí uile "Habr" - lascaine de 10 rúbal nuair a chláraíonn siad in aon chúrsa Scilbox ag baint úsáide as an gcód bolscaireachta "Habr".

Ar aghaidh linn

Suiteáil leabharlanna

Úsáidfimid google-scamall-bigquery chun sonraí a fháil ó Google BigQuery. matplotlib, numpy и pandas cabhróidh sé leat do shonraí a shamhlú. python-teileagram-bot seolfaidh sé na sonraí críochnaithe chuig Telegram.

suiteáil pip3 google-cloud-bigquery matplotlib pandas numpy python-telegram-bot

API Google BigQuery á nascadh

Más mian linn an tseirbhís a úsáid, ní mór dúinn an API Google BigQuery a nascadh. Chun seo a dhéanamh téann muid go dtí Google Forbróirí Console agus cruthaigh tionscadal nua (nó roghnaigh ceann atá ann cheana).

Sa phainéal rialaithe, roghnaigh ENABLE APIS AND SERVICES agus breathnaigh ar BigQuery API.

Conas tuairiscí simplí a tharmligean chuig róbat. Scríobhaimid bot i Python agus Google BigQuery

Roghnaigh Cumasaigh chun an API a nascadh.

Conas tuairiscí simplí a tharmligean chuig róbat. Scríobhaimid bot i Python agus Google BigQuery

Cruthaigh eochair chuntais

A ligean ar dul go dtí arís Google Forbróirí Console, roghnaigh an táb Dintiúir, Cruthaigh dintiúir agus eochair chuntais Seirbhíse.

Ansin - Cuntas seirbhíse nua, agus cuir isteach an t-ainm sa réimse ainm cuntas Seirbhíse.

Ón liosta anuas Ról, roghnaigh Tionscadal > Úinéir, ansin Cruthaigh.

Conas tuairiscí simplí a tharmligean chuig róbat. Scríobhaimid bot i Python agus Google BigQuery

Tugtar creds.json ar an gcomhad a íoslódálfar go huathoibríoch.

Socraigh GOOGLE_APPLICATION_CREDENTIALS, ag sonrú an chonair go creds.json sa teirminéal.

easpórtáil GOOGLE_APPLICATION_CREDENTIALS= '[PATH_TO_CREDS.JSON]'

Má chuaigh gach rud go maith, tá sé in am tosú ag scríobh an chláir.

Feidhmchlár a chruthú

Le haghaidh an teagaisc úsáidfimid sonraí ó bigquery-public-data.stackoverflow, roghnóimid líon na bhfoilseachán laethúil dár dtuarascáil.

Tá sé simplí go leor.

Ceist an tábla -> Amharc ar na sonraí -> Sábháil an léirshamhlú -> Seol an íomhá

Cruthaímid feidhm amháin chun gach snáithe a shainiú.

Iarratas chuig BigQuery

Ar dtús déanaimid an leabharlann a allmhairiú.

ó google.cloud allmhairiú bigquery

Cruthaímid feidhm ar a dtugtar query_to_bigquery, áit a bhfuil an paraiméadar ceist.

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

Tabharfaidh an fheidhm seo an t-iarratas ar ais mar fhráma sonraí.

Amharcléiriú sonraí

Chun an fhadhb seo a réiteach, roghnaigh matplotlib.

allmhairiú matplotlib.pyplot mar plt

Ní mór dúinn cúig pharaiméadair, áit a bhfuil x na sonraí x-ais, is é x_label an teideal don ais, is é y na sonraí y-ais, is é y_label an teideal don ais, agus is é an teideal teideal an léirshamhlaithe ar fad.

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

Sábháil an íomhá

Anois bainimis úsáid as dhá fheidhm chun léirshamhlú a chruthú agus é a shábháil.

Seolfaimid líon na bpost a fhoilsítear go laethúil. Ar dtús scríobhaimid iarratas.

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

Cuidíonn an fiosrúchán le sonraí a bhailiú le haghaidh coicíse ón 2 Nollaig 2018.

Bainimid úsáid as an dáta seo toisc gurb é 2018-12-02 na sonraí is déanaí a taifeadadh i bigquery-public-data.stackoverflow.post_history, i gcásanna eile is féidir leat CURRENT_DATE() a úsáid chun na sonraí is nuaí a fháil.

Glaoigh ar an bhfeidhm query_to_bigquery chun na sonraí a fháil.

dataframe = query_to_bigquery(iarratas)

Ansin úsáidimid an colún sonraí dáta don x-ais, agus an colún total_posts don y-ais.

x = fráma sonraí['dáta'].tolist()
y = dataframe['total_posts'].tolist()

Déanaimid é a shamhlú ag baint úsáide as an bhfeidhm visualize_bar_chart agus é a shábháil mar íomhá.

plt = visualize_bar_chart(x=x, x_label='Dáta', y=y, y_label= 'Postálacha Iomlána', teideal= 'Postálacha Laethúla')
plt.savefig('viz.png')

Fillteaimid an cód seo in fheidhm ar a dtugtar 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')

Seol íomhá

Chun tuairisc a sheoladh chuig an bhfaighteoir, ní mór duit an paraiméadar chat_id a bheith ar eolas agat.

úsáidimid faisnéis úsáideora agus clóscríobh / tús. Freagraíonn an bot leis an bhfaisnéis riachtanach, tá chat_id sa réimse ID.

Anois cruthaimis an fheidhm send_image. Úsáidfidh sé an fheidhm get_and_save_image chun an íomhá a aisghabháil agus a shábháil. Agus ansin cuirimid gach rud chuig an teagmháil cheart.

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

Príomhchlár

Ar deireadh, cruthaímid feidhm eile, go príomha, chun an feidhmchlár a sheoladh. Ná déan dearmad YOUR_TOKEN don bhota a athrú.

Cuimhnigh: seolfaidh an clár seo an íomhá go huathoibríoch ag an am a shonróidh tú. Mar shampla, seolfaimid tuairisc ag a naoi ar maidin gach lá.

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

Mar thoradh air sin, beidh cuma mar seo ar ár n-iarratas:

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

Sábháil an comhad agus glaoigh air main.py.

Seolaimid an feidhmchlár tríd an ordú a chur isteach sa teirminéal:

python3 príomh.py

Tá gach réidh. Anois tá róbat againn ina bhfuil 50 líne de chód a ghineann tuairiscí gan ár n-idirghabháil.

Déanaimis an bot a sheiceáil dá bhrí sintríd an ordú /seol a roghnú.

Conas tuairiscí simplí a tharmligean chuig róbat. Scríobhaimid bot i Python agus Google BigQuery

Is féidir leat an cód críochnaithe a fháil ag mo GitHub.

Molann Skillbox:

Foinse: will.com

Add a comment