Pehea e hāʻawi ai i nā hōʻike maʻalahi i kahi robot. Ke kākau ʻana i kahi bot ma Python a me Google BigQuery

Pehea e hāʻawi ai i nā hōʻike maʻalahi i kahi robot. Ke kākau ʻana i kahi bot ma Python a me Google BigQuery

Loaʻa iā ʻoe nā hana e hana hou i kēlā me kēia lā, kēlā me kēia pule? Eia kekahi laʻana, kākau moʻolelo. Noi ʻoe i ka ʻikepili, kānana, nānā iā ia (e hana i nā kiʻi, nā pakuhi), a laila e hoʻouna i kou haku. Akā, pehea inā ua hoʻohana ʻia kēia mau mea a pau?

Ma kēia kumu aʻo e hana mākou i kahi bot no Telegram e kōkua i ka hoʻokaʻawale ʻana i ka hōʻike. A ʻo ka mea ʻoluʻolu loa, ʻo ka papahana holoʻokoʻa he 50 mau laina code wale nō! Inā ʻoe e hana ana i kahi bot no Telegram no ka manawa mua, a laila pono ʻoe e heluhelu i kēia leka.

Manaʻo ʻo Skillbox: Papa hana ʻO ka mea hoʻomohala Python mai ka wā kahiko.

Hoʻomaopopo mākou iā ʻoe: no ka poʻe heluhelu a pau o "Habr" - kahi ho'ēmi o 10 rubles i ka wā e kākau inoa ai i kekahi papa Skillbox e hoʻohana ana i ka code promotional "Habr".

E hoʻomaka kākou

Ke hoʻokomo nei i nā hale waihona puke

E hoʻohana mākou google-cloud-bigquery e kiʻi i ka ʻikepili mai Google BigQuery. matplotlib, hoʻoky и ʻapoʻapo e kōkua iā ʻoe e nānā i kāu ʻikepili. python-telegram-bot e hoʻouna i ka ʻikepili i hoʻopau ʻia i Telegram.

pip3 hoʻokomo i ka google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Hoʻohui ʻia ʻo Google BigQuery API

Inā makemake mākou e hoʻohana i ka lawelawe, pono mākou e hoʻopili i ka Google BigQuery API. No ka hana ʻana i kēia, hele mākou i Kākoʻo Paena Google a hana i kahi papahana hou (a i ʻole e koho i kahi mea i loaʻa).

Ma ka papa hoʻomalu, koho ENABLE APIS AND SERVICES a huli i BigQuery API.

Pehea e hāʻawi ai i nā hōʻike maʻalahi i kahi robot. Ke kākau ʻana i kahi bot ma Python a me Google BigQuery

E koho iā Enable to connect the API.

Pehea e hāʻawi ai i nā hōʻike maʻalahi i kahi robot. Ke kākau ʻana i kahi bot ma Python a me Google BigQuery

E hana i kahi kī moʻokāki

E hele hou kāua Kākoʻo Paena Google, koho i ka Credentials tab, Create credentials and Service account key.

A laila - New lawelawe mooolelo, a komo i ka inoa ma ka Service mooolelo inoa kahua.

Mai ka papa hāʻule iho i lalo Role, koho i Project > Owner, a laila Hana.

Pehea e hāʻawi ai i nā hōʻike maʻalahi i kahi robot. Ke kākau ʻana i kahi bot ma Python a me Google BigQuery

Ua kapa ʻia ka faila e hoʻoiho ʻia ʻo creds.json.

E hoʻonoho iā GOOGLE_APPLICATION_CREDENTIALS, e kuhikuhi ana i ke ala i creds.json ma ka pahu.

hoʻokuʻu aku iā GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Inā maikaʻi nā mea a pau, ʻo ia ka manawa e hoʻomaka ai e kākau i ka papahana.

Ke hana ʻana i kahi noi

No ke kumu aʻo e hoʻohana mākou i ka ʻikepili mai bigquery-public-data.stackoverflow, no kā mākou hōʻike e koho mākou i ka helu o nā paʻi i kēlā me kēia lā.

Maʻaneʻi ka maʻalahi.

E nīnau i ka papaʻaina -> E nānā i ka ʻikepili -> E mālama i ka nānā ʻana -> E hoʻouna i ke kiʻi

E hana mākou i hoʻokahi hana e wehewehe i kēlā me kēia pae.

Nīnau iā BigQuery

Hoʻokomo mua mākou i ka waihona.

mai google.cloud hoʻokomo i ka bigquery

Hoʻokumu mākou i kahi hana i kapa ʻia query_to_bigquery, kahi i nīnau ʻia ai ka parameter.

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

Na kēia hana e hoʻihoʻi i ka noi ma ke ʻano he kiʻi ʻikepili.

Ke nānā nei i ka ʻikepili

No ka hoʻoponopono i kēia pilikia, koho matplotlib.

lawe mai i ka matplotlib.pyplot as plt

Pono mākou i ʻelima mau ʻāpana, kahi ʻo x ka ʻikepili axis x, ʻo x_label ke poʻo inoa no ke axis, ʻo y ka ʻikepili axis-y, ʻo y_label ke poʻo inoa no ke axis, a ʻo ke poʻo inoa ke poʻo o ka hiʻohiʻona holoʻokoʻa.

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

E mālama i ke kiʻi

I kēia manawa, e hoʻohana kāua i ʻelua hana e hana i kahi hiʻohiʻona a mālama iā ia.

E hoʻouna mākou i ka helu o nā pou i paʻi ʻia i kēlā me kēia lā. E kākau mua mākou i kahi noi.

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

Kōkua ka hulina e hōʻiliʻili i ka ʻikepili no ʻelua pule e hoʻomaka ana i ka lā 2 Dekemaba 2018.

Hoʻohana mākou i kēia lā no ka mea ʻo 2018-12-02 ka ʻikepili hou loa i hoʻopaʻa ʻia ma bigquery-public-data.stackoverflow.post_history, ma nā hihia ʻē aʻe hiki iā ʻoe ke hoʻohana iā CURRENT_DATE() e kiʻi i ka ʻikepili hou.

Kāhea i ka hana query_to_bigquery no ka loaʻa ʻana o ka ʻikepili.

ʻikepili = query_to_bigquery(query)

A laila, hoʻohana mākou i ke kolamu ʻikepili lā no ka axis x, a me ke kolamu total_posts no ka axis y.

x = pūʻulu ʻikepili['lā'].tolist()
y = ka ʻikepili['total_posts'].tolist()

Nānā mākou iā ia me ka hoʻohana ʻana i ka hana visualize_bar_chart a mālama iā ia ma ke ʻano he kiʻi.

plt = visualize_bar_chart(x=x, x_label='La', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')

Hoʻopili mākou i kēia code i kahi hana i kapa ʻia 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')

Hoʻouna i kahi kiʻi

No ka hoʻouna ʻana i kahi hōʻike i ka mea i loaʻa, pono ʻoe e ʻike i ka ʻāpana chat_id.

Hoʻohana mākou userinfobot a ʻano / hoʻomaka. Pane ka bot me ka ʻike e pono ai, aia ka chat_id i loko o ke kahua id.

E hana kākou i ka hana send_image. E hoʻohana ia i ka hana get_and_save_image e kiʻi a mālama i ke kiʻi. A laila hoʻouna mākou i nā mea a pau i ka pilina kūpono.

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

Papahana nui

ʻO ka hope, hana mākou i kahi hana ʻē aʻe, nui, e hoʻomaka i ka noi. Mai poina e hoʻololi i YOUR_TOKEN no ka bot.

E hoʻomanaʻo: e hoʻouna maʻalahi kēia polokalamu i ke kiʻi i ka manawa āu e kuhikuhi ai. No ka laʻana, e hoʻouna mākou i kahi hōʻike i ka ʻeiwa o ke kakahiaka i kēlā me kēia 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()

ʻO ka hopena, e like kā mākou noi:

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

E mālama i ka faila a kapa iā ia main.py.

Hoʻomaka mākou i ka noi ma ke komo ʻana i ke kauoha i ka terminal:

python3 main.py

Ua mākaukau nā mea a pau. I kēia manawa, loaʻa iā mākou kahi robot me 50 mau laina code e hoʻopuka i nā hōʻike me ka ʻole o kā mākou hana.

E nānā kāua i ka bot mai kēia wahima ke koho ʻana i ke kauoha /send.

Pehea e hāʻawi ai i nā hōʻike maʻalahi i kahi robot. Ke kākau ʻana i kahi bot ma Python a me Google BigQuery

Hiki iā ʻoe ke loaʻa ke code i hoʻopau ʻia ma koʻu GitHub.

Manaʻo ʻo Skillbox:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka