Yuav ua li cas xa cov ntawv qhia yooj yim rau tus neeg hlau. Sau bot hauv Python thiab Google BigQuery

Yuav ua li cas xa cov ntawv qhia yooj yim rau tus neeg hlau. Sau bot hauv Python thiab Google BigQuery

Koj puas muaj cov haujlwm uas rov ua haujlwm ib hnub dhau ib hnub, ib lim piam tom qab lub lim tiam? Piv txwv li, sau ntawv ceeb toom. Koj thov cov ntaub ntawv, tshuaj xyuas nws, pom nws (ua cov duab, kab kos), thiab xa mus rau koj tus thawj coj. Tab sis yuav ua li cas yog tias tag nrho cov no yog automated?

Hauv no nyeem peb yuav tsim ib tug bot rau Telegram uas yuav pab automate qhia. Thiab qhov txias tshaj plaws yog tias tag nrho cov kev pab cuam yuav muaj tsuas yog 50 kab code! Yog tias koj tab tom tsim bot rau Telegram thawj zaug, ces koj yuav tsum tau nyeem qhov no tswg.

Skillbox pom zoo: Cov chav kawm siv tau Python developer los ntawm kos.

Peb nco qab: rau txhua tus neeg nyeem Habr - 10 ruble luv nqi thaum tso npe rau hauv ib chav kawm Skillbox siv Habr promo code.

Cia peb pib

Txhim kho cov tsev qiv ntawv

Peb yuav siv google-cloud-bigquery kom tau txais cov ntaub ntawv los ntawm Google BigQuery. matplotlib, suav и panda yuav pab koj pom koj cov ntaub ntawv. python-telegram-bot yuav xa cov ntaub ntawv tiav rau Telegram.

pip3 nruab google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Txuas Google BigQuery API

Yog tias peb xav siv qhov kev pabcuam, peb yuav tsum txuas Google BigQuery API. Ua li no peb mus rau Google Developers Console thiab tsim ib qhov project tshiab (los yog xaiv ib qho uas twb muaj lawm).

Hauv kev tswj vaj huam sib luag, xaiv ENABLE APIS THIAB SERVICES thiab nrhiav BigQuery API.

Yuav ua li cas xa cov ntawv qhia yooj yim rau tus neeg hlau. Sau bot hauv Python thiab Google BigQuery

Xaiv Qhib kom txuas rau API.

Yuav ua li cas xa cov ntawv qhia yooj yim rau tus neeg hlau. Sau bot hauv Python thiab Google BigQuery

Tsim tus lej account

Wb rov mus dua Google Developers Console, xaiv qhov Credentials tab, Tsim cov ntawv pov thawj thiab Kev Pabcuam tus lej yuam sij.

Tom qab ntawd - Kev pabcuam tshiab, thiab nkag mus rau lub npe hauv Kev Pabcuam account lub npe teb.

Los ntawm lub luag haujlwm nco-down daim ntawv teev npe, xaiv Project> Tus Tswv, tom qab ntawd Tsim.

Yuav ua li cas xa cov ntawv qhia yooj yim rau tus neeg hlau. Sau bot hauv Python thiab Google BigQuery

Cov ntaub ntawv uas yuav cia li rub tawm yog hu ua creds.json.

Teem GOOGLE_APPLICATION_CREDENTIALS, qhia txog txoj hauv kev mus rau creds.json hauv lub davhlau ya nyob twg.

export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Yog tias txhua yam mus zoo, nws yog lub sijhawm los pib sau qhov program.

Tsim ib daim ntawv thov

Rau qhov kev qhia peb yuav siv cov ntaub ntawv los ntawm bigquery-public-data.stackoverflow, rau peb daim ntawv tshaj tawm peb yuav xaiv tus naj npawb ntawm cov ntawv tshaj tawm txhua hnub.

Nws yooj yim zoo nkauj.

Nug lub rooj -> Pom cov ntaub ntawv -> Txuag qhov kev pom -> Xa cov duab

Cia peb tsim ib txoj haujlwm los txhais txhua txoj xov.

Lus nug rau BigQuery

Ua ntej peb import lub tsev qiv ntawv.

los ntawm google.cloud import bigquery

Peb tsim ib txoj haujlwm hu ua query_to_bigquery, qhov twg qhov parameter yog query.

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

Txoj haujlwm no yuav rov qab qhov kev thov raws li cov ntaub ntawv thav duab.

Kev pom cov ntaub ntawv

Txhawm rau daws qhov teeb meem no, xaiv matplotlib.

import matplotlib.pyplot as plt

Peb xav tau tsib yam, qhov twg x yog x-axis cov ntaub ntawv, x_label yog lub npe rau lub axis, y yog cov ntaub ntawv y-axis, y_label yog lub npe rau lub axis, thiab lub npe yog lub npe ntawm tag nrho cov kev pom.

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

Txuag daim duab

Tam sim no cia peb siv ob txoj haujlwm los tsim kev pom thiab txuag nws.

Peb yuav xa tus naj npawb ntawm cov ntawv tshaj tawm txhua hnub. Ua ntej peb sau ntawv thov.

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

Cov lus nug pab sau cov ntaub ntawv rau ob lub lis piam pib txij lub Kaum Ob Hlis 2, 2018.

Peb siv hnub no vim 2018-12-02 yog cov ntaub ntawv tshiab tshaj plaws uas tau sau tseg hauv bigquery-public-data.stackoverflow.post_history, lwm qhov koj tuaj yeem siv CURRENT_DATE() kom tau txais cov ntaub ntawv tshiab tshaj plaws.

Hu rau query_to_bigquery muaj nuj nqi kom tau txais cov ntaub ntawv.

dataframe = query_to_bigquery(query)

Tom qab ntawd peb siv cov hnub cov ntaub ntawv kab rau x-axis, thiab tag nrho_posts kem rau y-axis.

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

Peb pom nws siv qhov visualize_bar_chart muaj nuj nqi thiab txuag nws ua duab.

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

Peb qhwv cov lej no hauv qhov haujlwm hu ua 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')

Xa ib daim duab

Txhawm rau xa daim ntawv tshaj tawm mus rau tus neeg txais, koj yuav tsum paub qhov chat_id parameter.

Peb siv userinfobot thiab ntaus / pib. Lub bot teb nrog cov ntaub ntawv tsim nyog, chat_id muaj nyob hauv daim teb id.

Tam sim no cia peb tsim qhov send_image muaj nuj nqi. Nws yuav siv get_and_save_image muaj nuj nqi los muab thiab khaws cov duab. Thiab tom qab ntawd peb xa txhua yam mus rau qhov tseeb kev sib cuag.

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

Txoj haujlwm tseem ceeb

Thaum kawg, peb tsim lwm txoj haujlwm, lub ntsiab, los tso tawm daim ntawv thov. Tsis txhob hnov ​​​​qab hloov YOUR_TOKEN rau bot.

Nco ntsoov: qhov kev pab cuam no yuav xa cov duab tau txais thaum lub sij hawm koj teev. Piv txwv li, peb yuav xa ib tsab ntawv ceeb toom thaum cuaj sawv ntxov txhua hnub.

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

Yog li ntawd, peb daim ntawv thov yuav zoo li no:

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

Txuag cov ntaub ntawv thiab hu nws main.py.

Peb tso daim ntawv thov los ntawm kev nkag mus rau cov lus txib hauv lub davhlau ya nyob twg:

python 3 main.py

Txhua yam yog npaj txhij. Tam sim no peb muaj cov neeg hlau uas muaj 50 kab ntawm cov lej uas tsim cov ntawv ceeb toom yam tsis muaj kev cuam tshuam.

Cia peb kuaj lub bot ntawm nolos ntawm kev xaiv / xa cov lus txib.

Yuav ua li cas xa cov ntawv qhia yooj yim rau tus neeg hlau. Sau bot hauv Python thiab Google BigQuery

Koj tuaj yeem tau txais cov lej tiav ntawm kuv GitHub.

Skillbox pom zoo:

Tau qhov twg los: www.hab.com

Ntxiv ib saib