Како да делегирате едноставни извештаи на робот. Пишување бот во Python и Google BigQuery

Како да делегирате едноставни извештаи на робот. Пишување бот во Python и Google BigQuery

Дали имате задачи кои се повторуваат ден по ден, недела по недела? На пример, пишување извештаи. Барате податоци, ги анализирате, визуелизирате (направете графикони, графикони), а потоа ги испраќате до вашиот шеф. Но, што ако сето ова беше автоматизирано?

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

Skillbox препорачува: Практичен курс Развивач на Python од нула.

Потсетуваме: за сите читатели на „Хабр“ - попуст од 10 рубли при запишување на кој било курс Skillbox користејќи го промотивниот код „Хабр“.

Ајде да почнеме

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

Ние ќе користиме google-cloud-bigquery за да добиете податоци од Google BigQuery. матплотлиб, вкочанет и панди ќе ви помогне да ги визуелизирате вашите податоци. питон-телеграма-бот ќе ги испрати готовите податоци на Telegram.

pip3 инсталирај google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Се поврзува Google BigQuery API

Ако сакаме да ја користиме услугата, треба да го поврземе Google BigQuery API. За да го направите ова, одиме на Google Developers Console и креирајте нов проект (или изберете постоечки).

Во контролната табла, изберете ENABLE APIS AND SERVICES и побарајте BigQuery API.

Како да делегирате едноставни извештаи на робот. Пишување бот во Python и Google BigQuery

Изберете Овозможи за да го поврзете API.

Како да делегирате едноставни извештаи на робот. Пишување бот во Python и Google BigQuery

Креирајте клуч за сметка

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

Потоа - Нова сметка за услуга и внесете го името во полето Име на сметката на услугата.

Од паѓачката листа Улоги, изберете Проект > Сопственик, а потоа Креирај.

Како да делегирате едноставни извештаи на робот. Пишување бот во Python и Google BigQuery

Датотеката што автоматски ќе се преземе се нарекува creds.json.

Поставете GOOGLE_APPLICATION_CREDENTIALS, наведувајќи ја патеката до creds.json во терминалот.

извези GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

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

Креирање на апликација

За упатството ќе користиме податоци од bigquery-public-data.stackoverflow, за нашиот извештај ќе го избереме бројот на дневни публикации.

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

Побарајте ја табелата -> Визуелизирајте ги податоците -> Зачувајте ја визуелизацијата -> Испратете ја сликата

Ајде да создадеме една функција за да ја дефинираме секоја нишка.

Барање до BigQuery

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

од google.cloud import bigquery

Ние креираме функција наречена query_to_bigquery, каде параметарот е query.

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

Оваа функција ќе го врати барањето како податочна рамка.

Визуелизирање податоци

За да го решите овој проблем, изберете matplotlib.

увезете matplotlib.pyplot како plt

Ни требаат пет параметри, каде што x е податокот за оската x, x_label е насловот за оската, y е податокот за y-оската, y_label е насловот за оската и насловот е насловот на целата визуелизација.

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 е најновиот податок снимен во bigquery-public-data.stackoverflow.post_history, во други случаи можете да го користите CURRENT_DATE() за да ги добиете најновите податоци.

Повикајте ја функцијата query_to_bigquery за да ги добиете податоците.

податочна рамка = query_to_bigquery (прашање)

Потоа ја користиме колоната со податоци за датум за оската x, а колоната total_posts за y-оската.

x = податочна рамка['датум'].tolist()
y = податочна рамка['total_posts'].tolist()

Ја визуелизираме со помош на функцијата visualize_bar_chart и ја зачувуваме како слика.

plt = visualize_bar_chart(x=x, x_label='Датум', y=y, y_label='Вкупни објави', наслов='Дневни објави')
plt.savefig ('viz.png')

Овој код го завиткаме во функција наречена 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')

Испратете слика

За да испратите извештај до примачот, треба да го знаете параметарот chat_id.

Ние користиме userinfobot и напишете /start. Ботот одговара со потребните информации, chat_id е содржан во полето id.

Сега да ја креираме функцијата send_image. Ќе ја користи функцијата get_and_save_image за да ја преземе и зачува сликата. И тогаш испраќаме сè до правилниот контакт.

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

Главна програма

Конечно, создаваме друга функција, главната, за да ја стартуваме апликацијата. Не заборавајте да го смените YOUR_TOKEN за ботот.

Запомнете: оваа програма автоматски ќе ја испрати сликата во времето што ќе го наведете. На пример, секој ден ќе испраќаме извештај во девет часот наутро.

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

Зачувајте ја датотеката и наречете ја main.py.

Ја стартуваме апликацијата со внесување на командата во терминалот:

python3 main.py

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

Ајде да го провериме ботот оттукасо избирање на командата /send.

Како да делегирате едноставни извештаи на робот. Пишување бот во Python и Google BigQuery

Готовиот код можете да го добиете на мојот GitHub.

Skillbox препорачува:

Извор: www.habr.com

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