Jinsi ya kukabidhi ripoti rahisi kwa roboti. Kuandika bot katika Python na Google BigQuery

Jinsi ya kukabidhi ripoti rahisi kwa roboti. Kuandika bot katika Python na Google BigQuery

Je, una kazi zinazojirudia siku baada ya siku, wiki baada ya wiki? Kwa mfano, kuandika ripoti. Unaomba data, kuchambua, kuibua (tengeneza grafu, chati), na kisha utume kwa bosi wako. Lakini vipi ikiwa yote haya yamejiendesha?

Katika somo hili tutaunda bot kwa Telegraph ambayo itasaidia kuripoti otomatiki. Na jambo la kupendeza zaidi ni kwamba programu nzima itakuwa na mistari 50 tu ya nambari! Ikiwa unaunda bot kwa Telegraph kwa mara ya kwanza, basi unapaswa pia kusoma hii chapisho.

Skillbox inapendekeza: Kozi ya vitendo Msanidi wa Python kutoka mwanzo.

Tunakukumbusha: kwa wasomaji wote wa "Habr" - punguzo la rubles 10 wakati wa kujiandikisha katika kozi yoyote ya Skillbox kwa kutumia msimbo wa uendelezaji wa "Habr".

Tuanze

Inasakinisha maktaba

Tutatumia google-cloud-bigquery ili kupata data kutoka Google BigQuery. matplotlib, numpy ΠΈ pandas itakusaidia kuibua data yako. python-telegram-bot itatuma data iliyokamilishwa kwa Telegraph.

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

Inaunganisha API ya Google BigQuery

Ikiwa tunataka kutumia huduma, tunahitaji kuunganisha API ya Google BigQuery. Ili kufanya hivyo, tunaenda Google Developers Console na unda mradi mpya (au chagua uliopo).

Katika paneli dhibiti, chagua WASHA API NA HUDUMA na utafute API ya BigQuery.

Jinsi ya kukabidhi ripoti rahisi kwa roboti. Kuandika bot katika Python na Google BigQuery

Chagua Wezesha kuunganisha API.

Jinsi ya kukabidhi ripoti rahisi kwa roboti. Kuandika bot katika Python na Google BigQuery

Unda ufunguo wa akaunti

Twende tena Google Developers Console, chagua kichupo cha Vitambulisho, Unda kitambulisho na ufunguo wa akaunti ya Huduma.

Kisha - Akaunti mpya ya huduma, na ingiza jina kwenye uwanja wa jina la akaunti ya Huduma.

Kutoka kwa orodha kunjuzi ya Jukumu, chagua Mradi > Mmiliki, kisha Unda.

Jinsi ya kukabidhi ripoti rahisi kwa roboti. Kuandika bot katika Python na Google BigQuery

Faili ambayo itapakuliwa kiotomatiki inaitwa creds.json.

Weka GOOGLE_APPLICATION_CREDENTIALS, ukibainisha njia ya creds.json kwenye terminal.

hamisha GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ikiwa kila kitu kilikwenda vizuri, ni wakati wa kuanza kuandika programu.

Kuunda programu

Kwa mafunzo tutatumia data kutoka bigquery-public-data.stackoverflow, kwa ripoti yetu tutachagua idadi ya machapisho ya kila siku.

Kila kitu ni rahisi sana.

Swali kwenye jedwali -> Tazama data -> Hifadhi taswira -> Tuma picha

Wacha tuunde kitendakazi kimoja kufafanua kila uzi.

Swali kwa BigQuery

Kwanza tunaingiza maktaba.

kutoka kwa google.cloud import bigquery

Tunaunda chaguo la kukokotoa liitwalo query_to_bigquery, ambapo kigezo ni hoja.

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

Chaguo hili la kukokotoa litarudisha ombi kama fremu ya data.

Kuona data

Ili kutatua tatizo hili, chagua matplotlib.

agiza matplotlib.pyplot kama plt

Tunahitaji vigezo vitano, ambapo x ni data ya mhimili wa x, x_lebo ni kichwa cha mhimili, y ni data ya mhimili y, y_lebo ni kichwa cha mhimili, na kichwa ni kichwa cha taswira nzima.

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

Hifadhi picha

Sasa hebu tutumie vitendaji viwili kuunda taswira na kuihifadhi.

Tutatuma idadi ya machapisho yanayochapishwa kila siku. Kwanza tunaandika ombi.

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

Hoja husaidia kukusanya data kwa wiki mbili kuanzia tarehe 2 Desemba 2018.

Tunatumia tarehe hii kwa sababu 2018-12-02 ndiyo data ya hivi punde iliyorekodiwa katika bigquery-public-data.stackoverflow.post_history, katika hali nyingine unaweza kutumia CURRENT_DATE() kupata data mpya zaidi.

Piga simu query_to_bigquery ili kupata data.

dataframe = query_to_bigquery(hoja)

Kisha tunatumia safu wima ya data ya tarehe kwa mhimili wa x, na safu wima ya jumla_ya mhimili wa y.

x = mfumo wa data['tarehe'].tolist()
y = mfumo wa data['total_posts'].tolist()

Tunaiona taswira kwa kutumia kitendakazi cha visualize_bar_chart na kuihifadhi kama picha.

plt = taswira_bar_chati(x=x, x_label='Tarehe', y=y, y_lebo='Jumla ya Machapisho', title='Machapisho ya Kila Siku')
plt.savefig('viz.png')

Tunafunga msimbo huu katika fomula iitwayo 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')

Tuma picha

Ili kutuma ripoti kwa mpokeaji, unahitaji kujua kigezo cha_chat_id.

Tunatumia userinfobot na chapa /anza. Kijibu hujibu kwa taarifa muhimu, chat_id iko kwenye sehemu ya kitambulisho.

Sasa hebu tuunde send_image kitendakazi. Itatumia kitendakazi cha get_and_save_image kupata na kuhifadhi picha. Na kisha tunatuma kila kitu kwa mawasiliano sahihi.

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

Programu kuu

Hatimaye, tunaunda kazi nyingine, kuu, kuzindua programu. Usisahau kubadilisha YOUR_TOKEN kwa roboti.

Kumbuka: programu hii itatuma picha kiotomatiki wakati unapobainisha. Kwa mfano, tutatuma ripoti saa tisa asubuhi kila siku.

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

Kama matokeo, maombi yetu yataonekana kama hii:

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

Hifadhi faili na uiite main.py.

Tunazindua programu kwa kuingiza amri kwenye terminal:

python3 main.py

Yote ni tayari. Sasa tuna roboti inayojumuisha mistari 50 ya msimbo ambayo hutoa ripoti bila kuingilia kati kwetu.

Hebu tuangalie bot hivyokwa kuchagua /tuma amri.

Jinsi ya kukabidhi ripoti rahisi kwa roboti. Kuandika bot katika Python na Google BigQuery

Unaweza kupata nambari iliyokamilishwa kwa GitHub yangu.

Skillbox inapendekeza:

Chanzo: mapenzi.com

Kuongeza maoni