Comment déléguer des rapports simples à un robot. Écrire un bot en Python et Google BigQuery

Comment déléguer des rapports simples à un robot. Écrire un bot en Python et Google BigQuery

Avez-vous des tâches qui se répètent jour après jour, semaine après semaine ? Par exemple, rédiger des rapports. Vous demandez des données, les analysez, les visualisez (faites des graphiques, des tableaux), puis les envoyez à votre patron. Et si tout cela était automatisé ?

Dans ce tutoriel, nous allons créer un bot pour Telegram qui aidera à automatiser les rapports. Et le plus cool, c'est que l'ensemble du programme ne comportera que 50 lignes de code ! Si vous créez un bot pour Telegram pour la première fois, vous devriez également lire celui-ci poster.

Skillbox vous recommande : Cours pratique Développeur Python à partir de zéro.

Nous rappelons: pour tous les lecteurs de "Habr" - une remise de 10 000 roubles lors de l'inscription à n'importe quel cours Skillbox en utilisant le code promotionnel "Habr".

Commençons

Installation des bibliothèques

Nous utiliserons google-cloud-bigquery pour obtenir des données de Google BigQuery. matplotlib, numpy и pandas vous aidera à visualiser vos données. python-télégramme-bot enverra les données terminées à Telegram.

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

Connexion de l'API Google BigQuery

Si nous voulons utiliser le service, nous devons connecter l'API Google BigQuery. Pour ce faire, nous allons à Console Google Developers et créez un nouveau projet (ou sélectionnez-en un existant).

Dans le panneau de configuration, sélectionnez ACTIVER LES APIS ET LES SERVICES et recherchez l'API BigQuery.

Comment déléguer des rapports simples à un robot. Écrire un bot en Python et Google BigQuery

Sélectionnez Activer pour connecter l'API.

Comment déléguer des rapports simples à un robot. Écrire un bot en Python et Google BigQuery

Créer une clé de compte

Allons-y à nouveau Console Google Developers, sélectionnez l'onglet Informations d'identification, Créer des informations d'identification et Clé de compte de service.

Ensuite - Nouveau compte de service et saisissez le nom dans le champ Nom du compte de service.

Dans la liste déroulante Rôle, sélectionnez Projet > Propriétaire, puis Créer.

Comment déléguer des rapports simples à un robot. Écrire un bot en Python et Google BigQuery

Le fichier qui sera automatiquement téléchargé s'appelle creds.json.

Définissez GOOGLE_APPLICATION_CREDENTIALS, en spécifiant le chemin d'accès à creds.json dans le terminal.

export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Si tout s'est bien passé, il est temps de commencer à écrire le programme.

Créer une application

Pour le tutoriel nous utiliserons les données de bigquery-public-data.stackoverflow, pour notre rapport nous sélectionnerons le nombre de publications quotidiennes.

Tout est assez simple.

Interroger la table -> Visualiser les données -> Enregistrer la visualisation -> Envoyer l'image

Créons une fonction pour définir chaque thread.

Requête vers BigQuery

Nous importons d’abord la bibliothèque.

depuis google.cloud importer bigquery

Nous créons une fonction appelée query_to_bigquery, où le paramètre est query.

def query_to_bigquery(query):
    client = bigquery.Client()
    query_job = client.query(query)
    result = query_job.result()
    dataframe = result.to_dataframe()
    return dataframe

Cette fonction renverra la demande sous forme de trame de données.

Visualiser les données

Pour résoudre ce problème, choisissez matplotlib.

importer matplotlib.pyplot en tant que plt

Nous avons besoin de cinq paramètres, où x est les données de l'axe x, x_label est le titre de l'axe, y est les données de l'axe y, y_label est le titre de l'axe et title est le titre de l'ensemble de la visualisation.

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

Enregistrer l'image

Utilisons maintenant deux fonctions pour créer une visualisation et l'enregistrer.

Nous enverrons quotidiennement le nombre de messages publiés. Nous rédigeons d’abord une demande.

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 requête permet de collecter des données pendant deux semaines à compter du 2 décembre 2018.

Nous utilisons cette date car le 2018/12/02 correspond aux dernières données enregistrées dans bigquery-public-data.stackoverflow.post_history, dans d'autres cas, vous pouvez utiliser CURRENT_DATE() pour obtenir les données les plus récentes.

Appelez la fonction query_to_bigquery pour obtenir les données.

dataframe = query_to_bigquery (requête)

Ensuite, nous utilisons la colonne de données de date pour l'axe des x et la colonne total_posts pour l'axe des y.

x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()

Nous le visualisons à l'aide de la fonction visualize_bar_chart et l'enregistrons sous forme d'image.

plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total des publications', title='Messages quotidiens')
plt.savefig('viz.png')

Nous enveloppons ce code dans une fonction appelée 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')

Envoyer une image

Afin d'envoyer un rapport au destinataire, vous devez connaître le paramètre chat_id.

Nous utilisons utilisateurinfobot et tapez /start. Le bot répond avec les informations nécessaires, chat_id est contenu dans le champ id.

Créons maintenant la fonction send_image. Il utilisera la fonction get_and_save_image pour récupérer et enregistrer l'image. Et puis nous envoyons le tout au bon contact.

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

Programme principal

Enfin, on crée une autre fonction, main, pour lancer l'application. N'oubliez pas de changer YOUR_TOKEN pour le bot.

N'oubliez pas : ce programme enverra l'image automatiquement à l'heure que vous spécifiez. Par exemple, nous enverrons un rapport chaque jour à neuf heures du matin.

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

En conséquence, notre application ressemblera à ceci :

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

Enregistrez le fichier et appelez-le main.py.

On lance l'application en entrant la commande dans le terminal :

python3 main.py

Tout est prêt. Nous disposons désormais d'un robot composé de 50 lignes de code qui génère des rapports sans notre intervention.

Vérifions le bot par conséquent,en sélectionnant la commande /send.

Comment déléguer des rapports simples à un robot. Écrire un bot en Python et Google BigQuery

Vous pouvez obtenir le code terminé sur mon GitHub.

Skillbox vous recommande :

Source: habr.com

Ajouter un commentaire