Como delegar informes sinxelos nun robot. Escribimos un bot en Python e Google BigQuery

Como delegar informes sinxelos nun robot. Escribimos un bot en Python e Google BigQuery

Tes tarefas que se repiten día tras día, semana tras semana? Por exemplo, escribir informes. Solicitas datos, analizas, visualizas (faces gráficos, gráficos) e despois envías ao teu xefe. Pero e se todo isto está automatizado?

Neste tutorial, crearemos un bot para Telegram que axudará a automatizar os informes. E o máis xenial é que todo o programa constará de só 50 liñas de código. Se estás creando un bot para Telegram por primeira vez, tamén deberías ler este publicación.

Skillbox recomenda: Curso práctico Desenvolvedor Python desde cero.

Recordámolo: para todos os lectores de "Habr" - un desconto de 10 rublos ao inscribirse en calquera curso de Skillbox usando o código promocional "Habr".

Comezando

Instalación de bibliotecas

Usaremos google-cloud-bigquery para obter datos de Google BigQuery. matplotlib, numpy и pandas axudarche a visualizar os datos. python-telegram-bot enviará os datos acabados a Telegram.

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

Conectando a API de Google BigQuery

Se queremos utilizar o servizo, necesitamos conectar a API de Google BigQuery. Para iso imos Consola de Google Developers e crea un novo proxecto (ou selecciona un existente).

No panel de control, selecciona ACTIVAR API E SERVIZOS e busca a API de BigQuery.

Como delegar informes sinxelos nun robot. Escribimos un bot en Python e Google BigQuery

Seleccione Activar para conectar a API.

Como delegar informes sinxelos nun robot. Escribimos un bot en Python e Google BigQuery

Crear unha clave de conta

Imos de novo a Consola de Google Developers, seleccione a pestana Credenciais, Crear credenciais e Chave de conta de servizo.

A continuación - Nova conta de servizo e, no campo Nome da conta de servizo, introduza un nome.

Na lista despregable Rol, seleccione Proxecto > Propietario e despois Crear.

Como delegar informes sinxelos nun robot. Escribimos un bot en Python e Google BigQuery

O ficheiro que se cargará automaticamente chámase creds.json.

Expoñemos GOOGLE_APPLICATION_CREDENTIALS, especificando o camiño a creds.json no terminal.

exportar GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Se todo saíu ben, é hora de comezar a escribir o programa.

Crear unha aplicación

Para o titorial, utilizaremos os datos de bigquery-public-data.stackoverflow, para o noso informe, elixiremos o número de publicacións diarias.

Todo é bastante sinxelo.

Consulta a táboa -> Visualizar os datos -> Gardar a visualización -> Enviar a imaxe

Imos crear unha función para definir cada fío.

Consulta a BigQuery

En primeiro lugar, imos importar a biblioteca.

desde google.cloud importar bigquery

Creamos unha función 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 función devolverá a consulta como marco de datos.

Visualización de datos

Para resolver este problema, escolla matplotlib.

importar matplotlib.pyplot como plt

Necesitamos cinco parámetros, onde x son os datos do eixe x, x_label é o título do eixe, y son os datos do eixe y, y_label é o título do eixe e título é o título de toda a visualización.

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

Gardando a imaxe

Agora imos usar dúas funcións para crear unha visualización e gardala.

Enviaremos o número de publicacións publicadas diariamente. En primeiro lugar, escribimos unha consulta.

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 axuda a recompilar datos durante dúas semanas a partir do 2 de decembro de 2018.

Usamos esta data porque 2018-12-02 son os últimos datos rexistrados en bigquery-public-data.stackoverflow.post_history; se non, podes usar CURRENT_DATE() para obter os datos máis novos.

Chamamos á función query_to_bigquery para obter os datos.

marco de datos = query_to_bigquery (consulta)

Despois usamos a columna de datos de data para o eixe x e a columna total_posts para o eixe y.

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

Visualice usando a función visualize_bar_chart e gárdeo como imaxe.

plt = visualizar_bar_chart(x=x, x_label='Data', y=y, y_label='Total de publicacións', title='Publicacións diarias')
plt.savefig('viz.png')

Envolvemos este código nunha función 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')

Enviando unha imaxe

Para enviar un informe ao destinatario, cómpre coñecer o parámetro chat_id.

Usamos usuario infobot e escriba /start. O bot responde coa información necesaria, o chat_id está contido no campo id.

Agora creamos a función send_image. Usará a función get_and_save_image para obter e gardar a imaxe. E despois enviamos todo ao contacto axeitado.

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

Finalmente, creamos outra función, main, para iniciar a aplicación. Non esquezas cambiar o YOUR_TOKEN para o bot.

Lembra: este programa enviará a imaxe automaticamente no momento que especifiques. Por exemplo, enviaremos un informe ás nove da mañá todos os días.

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, a nosa aplicación terá o seguinte aspecto:

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

Gardamos o ficheiro e chamámoslle main.py.

Inicie a aplicación escribindo o seguinte comando no terminal:

python3 main.py

Todo está listo. Agora temos un robot formado por 50 liñas de código que xera informes sen a nosa intervención.

Imos comprobar o bot por isoseleccionando o comando /send.

Como delegar informes sinxelos nun robot. Escribimos un bot en Python e Google BigQuery

Podes obter o código acabado en meu github.

Skillbox recomenda:

Fonte: www.habr.com

Engadir un comentario