Cómo delegar informes sencillos a un robot. Escribir un bot en Python y Google BigQuery

Cómo delegar informes sencillos a un robot. Escribir un bot en Python y Google BigQuery

¿Tiene tareas que se repiten día tras día, semana tras semana? Por ejemplo, redactar informes. Solicitas datos, los analizas, los visualizas (haces gráficos, cuadros) y luego se los envías a tu jefe. Pero ¿y si todo esto estuviera automatizado?

En este tutorial crearemos un bot para Telegram que ayudará a automatizar los informes. ¡Y lo mejor es que todo el programa constará de sólo 50 líneas de código! Si estás creando un bot para Telegram por primera vez, también deberías leer este enviar.

Skillbox recomienda: Curso práctico Desarrollador de Python desde cero.

Recordamos: para todos los lectores de "Habr": un descuento de 10 rublos al inscribirse en cualquier curso de Skillbox utilizando el código promocional "Habr".

Bajando

Instalación de bibliotecas

Usaremos google-nube-bigquery para obtener datos de Google BigQuery. matplotlib, numpy и Los pandas le ayudará a visualizar sus datos. Python-telegram-bot enviará los datos terminados a Telegram.

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

Conexión de la API de Google BigQuery

Si queremos utilizar el servicio, necesitamos conectar la API de Google BigQuery. Para ello vamos a Consola de desarrolladores de Google y cree un nuevo proyecto (o seleccione uno existente).

En el panel de control, seleccione HABILITAR APIS Y SERVICIOS y busque la API de BigQuery.

Cómo delegar informes sencillos a un robot. Escribir un bot en Python y Google BigQuery

Seleccione Habilitar para conectar la API.

Cómo delegar informes sencillos a un robot. Escribir un bot en Python y Google BigQuery

Crear una clave de cuenta

vamos de nuevo Consola de desarrolladores de Google, seleccione la pestaña Credenciales, Crear credenciales y Clave de cuenta de servicio.

Luego: Nueva cuenta de servicio e ingrese el nombre en el campo Nombre de la cuenta de servicio.

En la lista desplegable Función, seleccione Proyecto > Propietario y luego Crear.

Cómo delegar informes sencillos a un robot. Escribir un bot en Python y Google BigQuery

El archivo que se descargará automáticamente se llama creds.json.

Configure GOOGLE_APPLICATION_CREDENTIALS, especificando la ruta a creds.json en la terminal.

exportar GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Si todo salió bien, es hora de empezar a escribir el programa.

Creando una aplicación

Para el tutorial usaremos datos de bigquery-public-data.stackoverflow, para nuestro informe seleccionaremos la cantidad de publicaciones diarias.

Todo es bastante simple.

Consultar la tabla -> Visualizar los datos -> Guardar la visualización -> Enviar la imagen

Creemos una función para definir cada hilo.

Consulta a BigQuery

Primero importamos la biblioteca.

desde google.cloud importar bigquery

Creamos una función llamada query_to_bigquery, donde el parámetro es consulta.

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á la solicitud como un marco de datos.

Visualizando datos

Para resolver este problema, elija matplotlib.

importar matplotlib.pyplot como plt

Necesitamos cinco parámetros, donde x son los datos del eje x, x_label es el título del eje, y son los datos del eje y, y_label es el título del eje y title es el título de toda la 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

Guardando la imagen

Ahora usemos dos funciones para crear una visualización y guardarla.

Enviaremos el número de posts publicados diariamente. Primero escribimos una solicitud.

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

La consulta ayuda a recopilar datos durante dos semanas a partir del 2 de diciembre de 2018.

Usamos esta fecha porque 2018-12-02 son los datos más recientes registrados en bigquery-public-data.stackoverflow.post_history; en otros casos, puedes usar CURRENT_DATE() para obtener los datos más recientes.

Llame a la función query_to_bigquery para obtener los datos.

marco de datos = consulta_a_bigquery(consulta)

Luego usamos la columna de datos de fecha para el eje x y la columna total_posts para el eje y.

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

Lo visualizamos usando la función visualize_bar_chart y lo guardamos como imagen.

plt = visualize_bar_chart(x=x, x_label='Fecha', y=y, y_label='Total de publicaciones', título='Publicaciones diarias')
plt.savefig('viz.png')

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

enviar una imagen

Para enviar un informe al destinatario, necesita conocer el parámetro chat_id.

Uso usuarioinfobot y escriba /iniciar. El bot responde con la información necesaria, chat_id está contenido en el campo id.

Ahora creemos la función send_image. Utilizará la función get_and_save_image para recuperar y guardar la imagen. Y luego enviamos todo al contacto correcto.

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 otra función, main, para lanzar la aplicación. No olvides cambiar YOUR_TOKEN para el bot.

Recuerda: este programa enviará la imagen automáticamente a la hora que especifiques. Por ejemplo, enviaremos un informe a las nueve de la mañana todos los 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, nuestra aplicación se verá así:

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

Guarde el archivo y llámelo main.py.

Lanzamos la aplicación introduciendo el comando en la terminal:

python3 principal.py

Todo está listo. Ahora tenemos un robot formado por 50 líneas de código que genera informes sin nuestra intervención.

Revisemos el bot por lo tantoseleccionando el comando /enviar.

Cómo delegar informes sencillos a un robot. Escribir un bot en Python y Google BigQuery

Puede obtener el código terminado en mi GitHub.

Skillbox recomienda:

Fuente: habr.com

Añadir un comentario