
Vous avez des tâches qui se répètent jour après jour, de semaine en semaine? Par exemple, rédiger des rapports. Vous demandez des données, effectuez une analyse, visualisez (créez des graphiques, des graphiques), puis envoyez-les au patron. Mais que faire si tout cela est automatisé?
Dans ce tutoriel, nous allons créer un bot pour Telegram qui aidera à automatiser les rapports. Et le plus cool est que le programme entier ne comprendra que 50 lignes de code! Si vous créez un bot pour Telegram pour la première fois, alors vous devriez lire ce
post ici .
Skillbox recommande: Un développeur de cours pratique Python à partir de zéro .
Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».
Descendre
Installer des bibliothèquesNous utiliserons
google-cloud-bigquery pour récupérer les données de Google BigQuery.
matplotlib ,
numpy et
pandas aideront à visualiser les données.
python-telegram-bot enverra les données finales à Telegram.
pip3 installer google-cloud-bigquery matplotlib numpy pandas python-telegram-botConnectez l'API Google BigQuerySi nous voulons utiliser le service, nous devons connecter l'API Google BigQuery. Pour ce faire, accédez à la
Google Developers Console et créez un nouveau projet (ou sélectionnez-en un déjà existant).
Dans le panneau de configuration, sélectionnez ACTIVER APIS ET SERVICES et recherchez l'API BigQuery.

Sélectionnez Activer pour connecter l'API.
Créer une clé de compteNous allons à nouveau dans la
Google Developers Console , 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 dans le champ Nom du compte de service, entrez le nom.
Dans la liste déroulante Rôle, sélectionnez Projet> Propriétaire, puis Créer.

Un fichier qui se chargera automatiquement s'appelle creds.json.
Nous exposons GOOGLE_APPLICATION_CREDENTIALS, indiquant 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 un programme.
Création d'application
Pour le tutoriel, nous utiliserons les données de bigquery-public-data.stackoverflow, pour notre rapport, nous choisirons le nombre de publications quotidiennes.
Tout est assez simple.
Recherchez le tableau -> Visualisez les données -> Enregistrez la visualisation -> Envoyez l'image
Créons une fonction pour définir chaque thread.
Requête vers BigQueryTout d'abord, importez la bibliothèque.
depuis google.cloud, importez bigqueryCréez 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.
Visualisez les donnéesPour résoudre ce problème, sélectionnez matplotlib.
import matplotlib.pyplot as pltNous avons besoin de cinq paramètres, où x est les données sur l'axe x, x_label est le nom de l'axe, y est les données de l'axe y, y_label est le nom de l'axe et title est le titre de la visualisation entière.
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'imageUtilisons maintenant deux fonctions pour créer une visualisation et l'enregistrer.
Nous enverrons le nombre de publications quotidiennes. Nous écrivons 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 2018-12-02 sont les 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 dernières données.
Appelez la fonction query_to_bigquery pour obtenir les données.
dataframe = query_to_bigquery (requête)Utilisez ensuite la colonne de date pour l'axe x et la colonne total_posts pour l'axe y.
x = dataframe ['date']. tolist ()
y = dataframe ['total_posts']. tolist ()Nous visualisons en utilisant la fonction visualize_bar_chart et l'enregistrons en tant qu'image.
plt = visualize_bar_chart (x = x, x_label = 'Date', y = y, y_label = 'Total Posts', title = 'Daily Posts')
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 l'imagePour envoyer un rapport au destinataire, vous devez connaître le paramètre chat_id.
Nous utilisons
userinfobot et tapez / start. Le bot répond avec les informations nécessaires, chat_id est contenu dans le champ id.
Créez 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 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 principalEnfin, créez une autre fonction, principale, pour lancer l'application. N'oubliez pas de changer YOUR_TOKEN pour le bot.
N'oubliez pas: ce programme enverra automatiquement l'image à l'heure que vous avez spécifiée. Par exemple, nous enverrons un rapport à neuf heures du matin chaque jour.
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 nommez-le main.py.
Nous lançons l'application en entrant la commande dans le terminal:
python3 main.pyTout est prêt. Nous avons maintenant un robot composé de 50 lignes de code qui génère des rapports sans notre intervention.
Vérifions le bot
d'ici en sélectionnant la commande / send.

Vous pouvez obtenir le code fini dans
mon GitHub .
Skillbox recommande: