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.
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".
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.
Seleccione Activar para conectar a API.
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.
O ficheiro que se cargará automaticamente chámase creds.json.
Expoñemos GOOGLE_APPLICATION_CREDENTIALS, especificando o camiño a creds.json no terminal.
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.
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.