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