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.
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.
Selecione Habilitar para conectar a API.
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.
O arquivo que será baixado automaticamente se chama creds.json.
Defina GOOGLE_APPLICATION_CREDENTIALS, especificando o caminho para creds.json no terminal.
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.
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.
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.