Mar a bheir thu aithisgean sìmplidh gu robot. A’ sgrìobhadh bot ann am Python agus Google BigQuery

Mar a bheir thu aithisgean sìmplidh gu robot. A’ sgrìobhadh bot ann am Python agus Google BigQuery

A bheil gnìomhan agad a bhios ag ath-aithris latha às deidh latha, seachdain às deidh seachdain? Mar eisimpleir, a 'sgrìobhadh aithisgean. Bidh thu ag iarraidh dàta, ga sgrùdadh, ga fhaicinn (dèan grafaichean, clàran), agus an uairsin ga chuir chun cheannard agad. Ach dè nam biodh seo uile fèin-ghluasadach?

San oideachadh seo cruthaichidh sinn bot airson Telegram a chuidicheas le bhith ag aithris gu fèin-ghluasadach. Agus is e an rud as fhuaire nach bi anns a’ phrògram gu lèir ach 50 loidhne de chòd! Ma tha thu a’ cruthachadh bot airson Telegram airson a’ chiad uair, bu chòir dhut am fear seo a leughadh cuideachd dreuchd.

Tha Skillbox a’ moladh: Cùrsa practaigeach Python leasaiche bho thùs.

Tha sinn a ’cur nar cuimhne: airson a h-uile leughadair de "Habr" - lasachadh de 10 rubles nuair a chlàraicheas tu ann an cùrsa sam bith Skillbox a 'cleachdadh a' chòd adhartachaidh "Habr".

Feuch an tòisich sinn

Stàladh leabharlannan

Cleachdaidh sinn google-cloud-bigquery gus dàta fhaighinn bho Google BigQuery. matplotlib, cnapach и pandathan cuidichidh e thu gus an dàta agad fhaicinn. python-teileagram-bot cuiridh e an dàta crìochnaichte gu Telegram.

pip3 stàlaich google-cloud-bigquery matplotlib pandathan numpy python-telegram-bot

A' ceangal Google BigQuery API

Ma tha sinn airson an t-seirbheis a chleachdadh, feumaidh sinn an API Google BigQuery a cheangal. Gus seo a dhèanamh thèid sinn gu Console Developers Google agus cruthaich pròiseact ùr (no tagh fear a tha ann mu thràth).

Anns a 'phannal smachd, tagh ENABLE APIS AND SERVICES agus coimhead airson BigQuery API.

Mar a bheir thu aithisgean sìmplidh gu robot. A’ sgrìobhadh bot ann am Python agus Google BigQuery

Tagh Dèan comas gus an API a cheangal.

Mar a bheir thu aithisgean sìmplidh gu robot. A’ sgrìobhadh bot ann am Python agus Google BigQuery

Cruthaich iuchair cunntais

Rachamaid a-rithist Console Developers Google, tagh an taba Teisteanasan, Cruthaich teisteanasan agus iuchair cunntas seirbheis.

An uairsin - Cunntas seirbheis ùr, agus cuir a-steach an t-ainm anns an raon ainm cunntas seirbheis.

Bho liosta tuiteam-sìos Role, tagh Pròiseact > Sealbhadair, an uairsin Cruthaich.

Mar a bheir thu aithisgean sìmplidh gu robot. A’ sgrìobhadh bot ann am Python agus Google BigQuery

Canar creds.json ris an fhaidhle a thèid a luchdachadh sìos gu fèin-ghluasadach.

Suidhich GOOGLE_APPLICATION_CREDENTIALS, a' sònrachadh na slighe gu creds.json sa cheann-uidhe.

às-mhalairt GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ma chaidh a h-uile càil gu math, tha an t-àm ann tòiseachadh air a’ phrògram a sgrìobhadh.

A 'cruthachadh tagradh

Airson an oideachadh cleachdaidh sinn dàta bho bigquery-public-data.stackoverflow, airson ar n-aithisg taghaidh sinn an àireamh de fhoillseachaidhean làitheil.

Tha a h-uile dad gu math sìmplidh.

Ceasnachadh a’ bhòrd -> Seall an dàta -> Sàbhail an sealladh -> Cuir an ìomhaigh

Cruthaichidh sinn aon ghnìomh airson gach snàithlean a mhìneachadh.

Ceist gu BigQuery

An toiseach bheir sinn a-steach an leabharlann.

bho google.cloud in-mhalairt bigquery

Cruthaichidh sinn gnìomh ris an canar query_to_bigquery, far a bheil am paramadair ceist.

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

Tillidh an gnìomh seo an t-iarrtas mar fhrèam dàta.

A 'sealltainn dàta

Gus an duilgheadas seo fhuasgladh, tagh matplotlib.

toirt a-steach matplotlib.pyplot mar plt

Feumaidh sinn còig paramadairean, far a bheil x mar an dàta x-axis, is e x_label an tiotal airson an axis, is e y an dàta y-axis, is e y_label an tiotal airson an axis, agus is e tiotal tiotal an t-seallaidh gu lèir.

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àbhail an dealbh

A-nis cleachdamaid dà ghnìomh gus sealladh a chruthachadh agus a shàbhaladh.

Cuiridh sinn an àireamh de phuist a thèid fhoillseachadh gach latha. An toiseach bidh sinn a’ sgrìobhadh iarrtas.

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

Bidh a’ cheist a’ cuideachadh le bhith a’ tional dàta airson dà sheachdain a’ tòiseachadh air 2 Dùbhlachd, 2018.

Cleachdaidh sinn an ceann-latha seo oir is e 2018-12-02 an dàta as ùire a chaidh a chlàradh ann am bigquery-public-data.stackoverflow.post_history, ann an cùisean eile faodaidh tu CURRENT_DATE() a chleachdadh gus an dàta as ùire fhaighinn.

Cuir fòn gu gnìomh query_to_bigquery gus an dàta fhaighinn.

dataframe = ceist_to_bigquery(ceist)

An uairsin cleachdaidh sinn an colbh dàta ceann-latha airson an x-axis, agus an colbh total_posts airson an y-axis.

x = frèam dàta['ceann-latha'].tolist()
y = frèam dàta['total_posts'].tolist()

Bidh sinn ga fhaicinn leis a’ ghnìomh visualize_bar_chart agus ga shàbhaladh mar ìomhaigh.

plt = visualize_bar_chart(x=x, x_label= 'Ceann-latha', y=y, y_label= 'Postaidhean iomlan', tiotal= 'Postaidhean Làitheil')
plt.savefig ('viz.png')

Bidh sinn a’ pasgadh a’ chòd seo ann an gnìomh ris an canar 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')

Cuir dealbh

Gus aithisg a chuir chun neach a gheibh e, feumaidh fios a bhith agad air paramadair chat_id.

Cleachd fiosrachadh cleachdaiche agus seòrsa / tòiseachadh. Bidh am bot a’ freagairt leis an fhiosrachadh riatanach, tha chat_id anns an raon id.

A-nis cruthaichidh sinn an gnìomh send_image. Cleachdaidh e an gnìomh get_and_save_image gus an dealbh fhaighinn air ais agus a shàbhaladh. Agus an uairsin cuiridh sinn a h-uile càil chun neach-conaltraidh ceart.

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ìomh phrògram

Mu dheireadh, cruthaichidh sinn gnìomh eile, prìomh, gus an tagradh a chuir air bhog. Na dìochuimhnich YOUR_TOKEN atharrachadh airson a’ bhot.

Cuimhnich: cuiridh am prògram seo an ìomhaigh gu fèin-ghluasadach aig an àm a shònraicheas tu. Mar eisimpleir, cuiridh sinn aithisg aig naoi sa mhadainn a h-uile latha.

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 an sin, seallaidh an tagradh againn mar seo:

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àbhail am faidhle agus cuir fòn thuige main.py.

Bidh sinn a’ cur air bhog an tagradh le bhith a’ dol a-steach don àithne anns a’ chrìoch:

python3 prìomh.py

Tha a h-uile dad deiseil. A-nis tha inneal-fuadain againn anns a bheil 50 loidhne de chòd a ghineas aithisgean às aonais ar n-eadar-theachd.

Feuch an toir sinn sùil air a’ bot bho seole bhith a’ taghadh an àithne / cuir.

Mar a bheir thu aithisgean sìmplidh gu robot. A’ sgrìobhadh bot ann am Python agus Google BigQuery

Gheibh thu an còd crìochnaichte aig mo GitHub.

Tha Skillbox a’ moladh:

Source: www.habr.com

Cuir beachd ann