ProHoster > Blog > actualités internet > 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.
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".
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.
Sélectionnez Activer pour connecter l'API.
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.
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.
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.
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.
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.
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.