Como delegar relatórios simples a um robô. Escrevemos um bot em Python e Google BigQuery

Como delegar relatórios simples a um robô. Escrevemos um bot em Python e Google BigQuery

Você tem tarefas que se repetem dia após dia, semana após semana? Por exemplo, escrever relatórios. Você solicita dados, analisa, visualiza (faz gráficos, tabelas) e depois envia para seu chefe. Mas e se tudo isso fosse automatizado?

Neste tutorial criaremos um bot para Telegram que ajudará a automatizar os relatórios. E o mais legal é que todo o programa será composto por apenas 50 linhas de código! Se você está criando um bot para o Telegram pela primeira vez, então você também deve ler este postar.

A Skillbox recomenda: curso prático Desenvolvedor Python do zero.

Lembramos: para todos os leitores de "Habr" - um desconto de 10 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

Descer

Instalando bibliotecas

Nós vamos usar google-cloud-bigquery para obter dados do Google BigQuery. matplotlib, numpy и pandas irá ajudá-lo a visualizar seus dados. bot python-telegram enviará os dados finalizados para o Telegram.

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

Conectando a API Google BigQuery

Se quisermos usar o serviço, precisamos conectar a API Google BigQuery. Para fazer isso vamos Google Developers Console e crie um novo projeto (ou selecione um existente).

No painel de controle, selecione ATIVAR APIS E SERVIÇOS e procure API BigQuery.

Como delegar relatórios simples a um robô. Escrevemos um bot em Python e Google BigQuery

Selecione Habilitar para conectar a API.

Como delegar relatórios simples a um robô. Escrevemos um bot em Python e Google BigQuery

Crie uma chave de conta

Vamos de novo Google Developers Console, selecione a guia Credenciais, Criar credenciais e Chave da conta de serviço.

Então - Nova conta de serviço e insira o nome no campo Nome da conta de serviço.

Na lista suspensa Função, selecione Projeto > Proprietário e, em seguida, Criar.

Como delegar relatórios simples a um robô. Escrevemos um bot em Python e Google BigQuery

O arquivo que será baixado automaticamente se chama creds.json.

Defina GOOGLE_APPLICATION_CREDENTIALS, especificando o caminho para creds.json no terminal.

exportar GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Se tudo correu bem, é hora de começar a escrever o programa.

Criando um aplicativo

Para o tutorial usaremos dados de bigquery-public-data.stackoverflow, para nosso relatório selecionaremos o número de publicações diárias.

Tudo é bem simples.

Consultar a tabela -> Visualizar os dados -> Salvar a visualização -> Enviar a imagem

Vamos criar uma função para definir cada thread.

Consultar no BigQuery

Primeiro importamos a biblioteca.

do google.cloud importar bigquery

Criamos uma função chamada query_to_bigquery, onde o parâmetro é query.

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

Esta função retornará a solicitação como um quadro de dados.

Visualizando dados

Para resolver este problema, escolha matplotlib.

importar matplotlib.pyplot como plt

Precisamos de cinco parâmetros, onde x são os dados do eixo x, x_label é o título do eixo, y são os dados do eixo y, y_label é o título do eixo e title é o título de toda a visualização.

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

Salvando a imagem

Agora vamos usar duas funções para criar uma visualização e salvá-la.

Enviaremos a quantidade de postagens publicadas diariamente. Primeiro escrevemos um pedido.

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

A consulta ajuda a coletar dados durante duas semanas a partir de 2 de dezembro de 2018.

Usamos essa data porque 2018/12/02 são os dados mais recentes registrados em bigquery-public-data.stackoverflow.post_history. Em outros casos, você pode usar CURRENT_DATE() para obter os dados mais recentes.

Chame a função query_to_bigquery para obter os dados.

quadro de dados = query_to_bigquery(consulta)

Em seguida, usamos a coluna de dados de data para o eixo x e a coluna total_posts para o eixo y.

x = dataframe['data'].tolist()
y = dataframe['total_posts'].tolist()

Nós o visualizamos usando a função visualize_bar_chart e salvamos como uma imagem.

plt = visualize_bar_chart(x=x, x_label='Data', y=y, y_label='Total de postagens', title='Postagens diárias')
plt.savefig('viz.png')

Envolvemos esse código em uma função chamada 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')

Envie uma imagem

Para enviar um relatório ao destinatário, você precisa conhecer o parâmetro chat_id.

Nós usamos usuárioinfobot e digite /iniciar. O bot responde com as informações necessárias, chat_id está contido no campo id.

Agora vamos criar a função send_image. Ele usará a função get_and_save_image para recuperar e salvar a imagem. E então enviamos tudo para o contato correto.

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

Programa principal

Por fim, criamos outra função, principal, para iniciar a aplicação. Não se esqueça de alterar YOUR_TOKEN para o bot.

Lembre-se: este programa enviará a imagem automaticamente no horário que você especificar. Por exemplo, enviaremos um relatório às nove da manhã todos os dias.

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

Como resultado, nosso aplicativo ficará assim:

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

Salve o arquivo e chame-o de main.py.

Iniciamos o aplicativo digitando o comando no terminal:

python3 principal.py

Tudo está pronto. Agora temos um robô composto por 50 linhas de código que gera relatórios sem a nossa intervenção.

Vamos verificar o bot por issoselecionando o comando /send.

Como delegar relatórios simples a um robô. Escrevemos um bot em Python e Google BigQuery

Você pode obter o código finalizado em meu GitHub.

A Skillbox recomenda:

Fonte: habr.com

Adicionar um comentário