Sut i ddirprwyo adroddiadau syml i robot. Ysgrifennu bot yn Python a Google BigQuery

Sut i ddirprwyo adroddiadau syml i robot. Ysgrifennu bot yn Python a Google BigQuery

A oes gennych chi dasgau sy'n ailadrodd ddydd ar ôl dydd, wythnos ar ôl wythnos? Er enghraifft, ysgrifennu adroddiadau. Rydych chi'n gofyn am ddata, yn ei ddadansoddi, yn ei ddelweddu (gwneud graffiau, siartiau), ac yna'n ei anfon at eich rheolwr. Ond beth os oedd hyn i gyd yn awtomataidd?

Yn y tiwtorial hwn byddwn yn creu bot ar gyfer Telegram a fydd yn helpu i awtomeiddio adrodd. A'r peth cŵl yw y bydd y rhaglen gyfan yn cynnwys dim ond 50 llinell o god! Os ydych chi'n creu bot ar gyfer Telegram am y tro cyntaf, yna dylech chi ddarllen yr un hwn hefyd post.

Mae Skillsbox yn argymell: Cwrs ymarferol Datblygwr Python o'r dechrau.

Rydym yn atgoffa: i holl ddarllenwyr "Habr" - gostyngiad o 10 rubles wrth gofrestru ar unrhyw gwrs Skillbox gan ddefnyddio'r cod hyrwyddo "Habr".

Gadewch i ni ddechrau

Gosod llyfrgelloedd

Byddwn yn defnyddio google-cloud-bigquery i gael data gan Google BigQuery. matplotlib, nympy и pandas yn eich helpu i ddelweddu eich data. python-telegram-bot yn anfon y data gorffenedig i Telegram.

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

Cysylltu Google BigQuery API

Os ydym am ddefnyddio'r gwasanaeth, mae angen i ni gysylltu API BigQuery Google. I wneud hyn awn i Consol Datblygwyr Google a chreu prosiect newydd (neu ddewis un sy'n bodoli eisoes).

Yn y panel rheoli, dewiswch GALLUOGI APIS A GWASANAETHAU ac edrychwch am BigQuery API.

Sut i ddirprwyo adroddiadau syml i robot. Ysgrifennu bot yn Python a Google BigQuery

Dewiswch Galluogi i gysylltu'r API.

Sut i ddirprwyo adroddiadau syml i robot. Ysgrifennu bot yn Python a Google BigQuery

Creu allwedd cyfrif

Gadewch i ni fynd i eto Consol Datblygwyr Google, dewiswch y tab Credentials, Creu tystlythyrau ac allwedd cyfrif Gwasanaeth.

Yna - Cyfrif gwasanaeth newydd, a nodwch yr enw yn y maes enw cyfrif Gwasanaeth.

O'r gwymplen Rôl, dewiswch Prosiect > Perchennog, yna Creu.

Sut i ddirprwyo adroddiadau syml i robot. Ysgrifennu bot yn Python a Google BigQuery

Enw'r ffeil a fydd yn cael ei lawrlwytho'n awtomatig yw creds.json.

Gosod GOOGLE_APPLICATION_CREDENTIALS, gan nodi'r llwybr i creds.json yn y derfynell.

allforio GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Os aeth popeth yn iawn, mae'n bryd dechrau ysgrifennu'r rhaglen.

Creu cais

Ar gyfer y tiwtorial byddwn yn defnyddio data o bigquery-public-data.stackoverflow, ar gyfer ein hadroddiad byddwn yn dewis nifer y cyhoeddiadau dyddiol.

Mae popeth yn eithaf syml.

Cwestiynu'r tabl -> Delweddu'r data -> Cadw'r delweddu -> Anfon y ddelwedd

Gadewch i ni greu un swyddogaeth i ddiffinio pob edefyn.

Ymholiad i BigQuery

Yn gyntaf rydym yn mewnforio'r llyfrgell.

o google.cloud mewnforio bigquery

Rydyn ni'n creu swyddogaeth o'r enw query_to_bigquery, lle mae'r paramedr yn ymholiad.

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

Bydd y swyddogaeth hon yn dychwelyd y cais fel ffrâm ddata.

Delweddu data

I ddatrys y broblem hon, dewiswch matplotlib.

mewnforio matplotlib.pyplot fel plt

Mae angen pum paramedr arnom, lle x yw'r data echelin x, x_label yw'r teitl ar gyfer yr echelin, y yw'r data echelin-y, y_label yw'r teitl ar gyfer yr echelin, a'r teitl yw teitl y delweddu cyfan.

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

Arbedwch y ddelwedd

Nawr, gadewch i ni ddefnyddio dwy swyddogaeth i greu delweddiad a'i gadw.

Byddwn yn anfon nifer y postiadau a gyhoeddir yn ddyddiol. Yn gyntaf rydym yn ysgrifennu cais.

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

Mae'r ymholiad yn helpu i gasglu data am bythefnos gan ddechrau Rhagfyr 2, 2018.

Rydym yn defnyddio'r dyddiad hwn oherwydd 2018-12-02 yw'r data diweddaraf a gofnodwyd yn bigquery-public-data.stackoverflow.post_history, mewn achosion eraill gallwch ddefnyddio CURRENT_DATE() i gael y data diweddaraf.

Ffoniwch y swyddogaeth query_to_bigquery i gael y data.

dataframe = query_to_bigquery(ymholiad)

Yna rydyn ni'n defnyddio'r golofn data dyddiad ar gyfer yr echelin-x, a'r golofn total_posts ar gyfer yr echelin-y.

x = ffrâm data['dyddiad'].tolist()
y = dataframe['total_posts'].tolist()

Rydyn ni'n ei ddelweddu gan ddefnyddio'r swyddogaeth visualize_bar_chart a'i gadw fel delwedd.

plt = visualize_bar_chart(x=x, x_label='Dyddiad', y=y, y_label='Cyfanswm Postiadau', teitl='Postiadau Dyddiol')
plt.savefig('viz.png')

Rydym yn lapio'r cod hwn mewn swyddogaeth o'r enw 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')

Anfon delwedd

Er mwyn anfon adroddiad at y derbynnydd, mae angen i chi wybod y paramedr chat_id.

Rydym yn defnyddio gwybodaeth defnyddiwr a theipio / dechrau. Mae'r bot yn ymateb gyda'r wybodaeth angenrheidiol, mae chat_id wedi'i gynnwys yn y maes id.

Nawr, gadewch i ni greu'r swyddogaeth send_image. Bydd yn defnyddio'r swyddogaeth get_and_save_image i adfer ac arbed y ddelwedd. Ac yna rydym yn anfon popeth at y cyswllt cywir.

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

Prif raglen

Yn olaf, rydym yn creu swyddogaeth arall, prif, i lansio'r cais. Peidiwch ag anghofio newid YOUR_TOKEN ar gyfer y bot.

Cofiwch: bydd y rhaglen hon yn anfon y ddelwedd yn awtomatig ar yr amser a nodir gennych. Er enghraifft, byddwn yn anfon adroddiad am naw y bore bob dydd.

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 ganlyniad, bydd ein cais yn edrych fel hyn:

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

Arbedwch y ffeil a'i alw'n main.py.

Rydym yn lansio'r cais trwy nodi'r gorchymyn yn y derfynell:

python3 prif.py

Mae'r cyfan yn barod. Nawr mae gennym robot sy'n cynnwys 50 llinell o god sy'n cynhyrchu adroddiadau heb ein hymyrraeth.

Gadewch i ni wirio'r bot fellytrwy ddewis y gorchymyn / anfon.

Sut i ddirprwyo adroddiadau syml i robot. Ysgrifennu bot yn Python a Google BigQuery

Gallwch gael y cod gorffenedig yn fy GitHub.

Mae Skillsbox yn argymell:

Ffynhonnell: hab.com

Ychwanegu sylw