Како делегирати једноставне извештаје роботу. Писање бота у Питхон-у и Гоогле БигКуери-ју

Како делегирати једноставне извештаје роботу. Писање бота у Питхон-у и Гоогле БигКуери-ју

Да ли имате задатке који се понављају из дана у дан, из недеље у недељу? На пример, писање извештаја. Захтевате податке, анализирате их, визуелизујете (направите графиконе, графиконе), а затим их шаљете свом шефу. Али шта ако је све ово аутоматизовано?

У овом туторијалу направићемо бота за Телеграм који ће помоћи у аутоматизацији извештавања. А најкул ствар је што ће се цео програм састојати од само 50 линија кода! Ако први пут правите бота за Телеграм, онда би требало да прочитате и овај брзо.

Скиллбок препоручује: Практични курс Питхон програмер од нуле.

Подсећамо: за све читаоце „Хабра“ – попуст од 10 рубаља при упису на било који курс Скиллбок користећи промотивни код „Хабр“.

Геттинг стартед

Инсталирање библиотека

Користићемо гоогле-цлоуд-бигкуери да бисте добили податке са Гоогле БигКуери-ја. матплотлиб, отрцан и панде ће вам помоћи да визуелизујете своје податке. питхон-телеграм-бот ће послати готове податке Телеграму.

пип3 инсталирај гоогле-цлоуд-бигкуери матплотлиб нумпи пандас питхон-телеграм-бот

Повезивање Гоогле БигКуери АПИ-ја

Ако желимо да користимо услугу, морамо да повежемо Гоогле БигКуери АПИ. Да бисмо то урадили идемо на Гоогле Девелоперс конзола и креирајте нови пројекат (или изаберите постојећи).

На контролној табли изаберите ОМОГУЋИ АПИ-ЈЕ И УСЛУГЕ и потражите БигКуери АПИ.

Како делегирати једноставне извештаје роботу. Писање бота у Питхон-у и Гоогле БигКуери-ју

Изаберите Омогући да бисте повезали АПИ.

Како делегирати једноставне извештаје роботу. Писање бота у Питхон-у и Гоогле БигКуери-ју

Креирајте кључ налога

Идемо поново на Гоогле Девелоперс конзола, изаберите картицу Акредитиви, Креирај акредитиве и Кључ налога услуге.

Затим - Нови налог услуге и унесите име у поље Назив налога услуге.

Са падајуће листе Улога изаберите Пројекат > Власник, а затим Креирај.

Како делегирати једноставне извештаје роботу. Писање бота у Питхон-у и Гоогле БигКуери-ју

Датотека која ће се аутоматски преузети зове се цредс.јсон.

Поставите ГООГЛЕ_АППЛИЦАТИОН_ЦРЕДЕНТИАЛС, наводећи путању до цредс.јсон у терминалу.

извоз ГООГЛЕ_АППЛИЦАТИОН_ЦРЕДЕНТИАЛС='[ПАТХ_ТО_ЦРЕДС.ЈСОН]'

Ако је све прошло како треба, време је да почнемо са писањем програма.

Креирајте апликацију

За туторијал ћемо користити податке са бигкуери-публиц-дата.стацковерфлов, за наш извештај ћемо изабрати број дневних публикација.

Све је прилично једноставно.

Упитајте табелу -> Визуализујте податке -> Сачувајте визуелизацију -> Пошаљите слику

Хајде да направимо једну функцију да дефинишемо сваку нит.

Упит за БигКуери

Прво увозимо библиотеку.

са гоогле.цлоуд импорт бигкуери

Креирамо функцију под називом куери_то_бигкуери, где је параметар куери.

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

Сачувајте слику

Сада користимо две функције да креирамо визуелизацију и сачувамо је.

Послаћемо број постова објављених дневно. Прво пишемо захтев.

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

Упит помаже у прикупљању података за две недеље почев од 2. децембра 2018.

Користимо овај датум јер су 2018-12-02 најновији подаци забележени у бигкуери-публиц-дата.стацковерфлов.пост_хистори, у другим случајевима можете користити ЦУРРЕНТ_ДАТЕ() да бисте добили најновије податке.

Позовите функцију куери_то_бигкуери да бисте добили податке.

оквир података = куери_то_бигкуери(упит)

Затим користимо колону података о датуму за к-осу и колону тотал_постс за и-осу.

к = оквир података['датум'].толист()
и = датафраме['тотал_постс'].толист()

Ми га визуализујемо помоћу функције висуализе_бар_цхарт и сачувамо га као слику.

плт = висуализе_бар_цхарт(к=к, к_лабел='Датум', и=и, и_лабел='Укупно постова', титле='Дневни постови')
плт.савефиг('виз.пнг')

Овај код умотавамо у функцију која се зове гет_анд_саве_имаге.

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

Као резултат, наша апликација ће изгледати овако:

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

Сачувајте датотеку и назовите је маин.пи.

Покрећемо апликацију уносом команде у терминал:

питхон3 маин.пи

Све је спремно. Сада имамо робота који се састоји од 50 линија кода који генерише извештаје без наше интервенције.

Хајде да проверимо бота стогаизбором команде /сенд.

Како делегирати једноставне извештаје роботу. Писање бота у Питхон-у и Гоогле БигКуери-ју

Готов код можете добити на мој ГитХуб.

Скиллбок препоручује:

Извор: ввв.хабр.цом

Додај коментар