Πώς να αναθέσετε απλές αναφορές σε ένα ρομπότ. Γράφουμε ένα bot σε Python και Google BigQuery

Πώς να αναθέσετε απλές αναφορές σε ένα ρομπότ. Γράφουμε ένα bot σε Python και Google BigQuery

Έχετε εργασίες που επαναλαμβάνονται μέρα με τη μέρα, εβδομάδα με την εβδομάδα; Για παράδειγμα, η σύνταξη αναφορών. Ζητάτε δεδομένα, τα αναλύετε, τα οπτικοποιείτε (κάνετε γραφήματα, γραφήματα) και μετά τα στέλνετε στο αφεντικό σας. Τι θα γινόταν όμως αν όλα αυτά ήταν αυτοματοποιημένα;

Σε αυτό το σεμινάριο θα δημιουργήσουμε ένα bot για το Telegram που θα βοηθήσει στην αυτοματοποίηση των αναφορών. Και το πιο ωραίο είναι ότι ολόκληρο το πρόγραμμα θα αποτελείται από μόνο 50 γραμμές κώδικα! Εάν δημιουργείτε ένα bot για το Telegram για πρώτη φορά, τότε θα πρέπει να διαβάσετε και αυτό post.

Το Skillbox προτείνει: Πρακτικό μάθημα Προγραμματιστής Python από την αρχή.

Υπενθύμιση: για όλους τους αναγνώστες του "Habr" - έκπτωση 10 ρούβλια κατά την εγγραφή σε οποιοδήποτε μάθημα Skillbox χρησιμοποιώντας τον κωδικό προσφοράς "Habr".

Ας αρχίσουμε

Εγκατάσταση βιβλιοθηκών

Θα το χρησιμοποιησουμε google-cloud-bigquery για λήψη δεδομένων από το Google BigQuery. matplotlib, πολλοί и Πάντα θα σας βοηθήσει να οπτικοποιήσετε τα δεδομένα σας. python-telegram-bot θα στείλει τα τελικά δεδομένα στο Telegram.

pip3 εγκατάσταση google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Σύνδεση Google BigQuery API

Αν θέλουμε να χρησιμοποιήσουμε την υπηρεσία, πρέπει να συνδέσουμε το Google BigQuery API. Για να το κάνουμε αυτό πηγαίνουμε στο Κονσόλα προγραμματιστών Google και δημιουργήστε ένα νέο έργο (ή επιλέξτε ένα υπάρχον).

Στον πίνακα ελέγχου, επιλέξτε ENABLE APIS AND SERVICES και αναζητήστε το BigQuery API.

Πώς να αναθέσετε απλές αναφορές σε ένα ρομπότ. Γράφουμε ένα bot σε Python και Google BigQuery

Επιλέξτε Ενεργοποίηση για να συνδέσετε το API.

Πώς να αναθέσετε απλές αναφορές σε ένα ρομπότ. Γράφουμε ένα bot σε Python και Google BigQuery

Δημιουργήστε ένα κλειδί λογαριασμού

Πάμε πάλι στο Κονσόλα προγραμματιστών Google, επιλέξτε την καρτέλα Διαπιστευτήρια, Δημιουργία διαπιστευτηρίων και Κλειδί λογαριασμού υπηρεσίας.

Στη συνέχεια - Νέος λογαριασμός υπηρεσίας και εισαγάγετε το όνομα στο πεδίο Όνομα λογαριασμού υπηρεσίας.

Από την αναπτυσσόμενη λίστα Ρόλος, επιλέξτε Έργο > Κάτοχος και μετά Δημιουργία.

Πώς να αναθέσετε απλές αναφορές σε ένα ρομπότ. Γράφουμε ένα bot σε Python και Google BigQuery

Το αρχείο που θα ληφθεί αυτόματα ονομάζεται creds.json.

Ορίστε το GOOGLE_APPLICATION_CREDENTIALS, προσδιορίζοντας τη διαδρομή για το creds.json στο τερματικό.

εξαγωγή GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Αν όλα πήγαν καλά, ήρθε η ώρα να αρχίσετε να γράφετε το πρόγραμμα.

Δημιουργήστε μια εφαρμογή

Για το σεμινάριο θα χρησιμοποιήσουμε δεδομένα από το bigquery-public-data.stackoverflow, για την αναφορά μας θα επιλέξουμε τον αριθμό των ημερήσιων δημοσιεύσεων.

Όλα είναι αρκετά απλά.

Ερώτημα στον πίνακα -> Οπτικοποίηση των δεδομένων -> Αποθήκευση της οπτικοποίησης -> Αποστολή της εικόνας

Ας δημιουργήσουμε μια συνάρτηση για να ορίσουμε κάθε νήμα.

Ερώτημα στο BigQuery

Πρώτα εισάγουμε τη βιβλιοθήκη.

από το google.cloud import bigquery

Δημιουργούμε μια συνάρτηση που ονομάζεται query_to_bigquery, όπου η παράμετρος είναι query.

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

Αυτή η συνάρτηση θα επιστρέψει το αίτημα ως πλαίσιο δεδομένων.

Οπτικοποίηση δεδομένων

Για να λύσετε αυτό το πρόβλημα, επιλέξτε matplotlib.

εισαγωγή matplotlib.pyplot ως plt

Χρειαζόμαστε πέντε παραμέτρους, όπου x είναι τα δεδομένα του άξονα x, x_label είναι ο τίτλος για τον άξονα, y είναι τα δεδομένα του άξονα y, y_label είναι ο τίτλος για τον άξονα και ο τίτλος είναι ο τίτλος ολόκληρης της οπτικοποίησης.

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

Αποθηκεύστε την εικόνα

Τώρα ας χρησιμοποιήσουμε δύο λειτουργίες για να δημιουργήσουμε μια οπτικοποίηση και να την αποθηκεύσουμε.

Θα στέλνουμε τον αριθμό των αναρτήσεων που δημοσιεύονται καθημερινά. Πρώτα γράφουμε ένα αίτημα.

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

Το ερώτημα βοηθά στη συλλογή δεδομένων για δύο εβδομάδες από τις 2 Δεκεμβρίου 2018.

Χρησιμοποιούμε αυτήν την ημερομηνία επειδή το 2018-12-02 είναι τα πιο πρόσφατα δεδομένα που έχουν καταγραφεί στο bigquery-public-data.stackoverflow.post_history, σε άλλες περιπτώσεις μπορείτε να χρησιμοποιήσετε CURRENT_DATE() για να λάβετε τα νεότερα δεδομένα.

Καλέστε τη συνάρτηση query_to_bigquery για να λάβετε τα δεδομένα.

dataframe = query_to_bigquery(ερώτημα)

Στη συνέχεια χρησιμοποιούμε τη στήλη δεδομένων ημερομηνίας για τον άξονα x και τη στήλη total_posts για τον άξονα y.

x = πλαίσιο δεδομένων['date'].tolist()
y = πλαίσιο δεδομένων['total_posts'].tolist()

Το οπτικοποιούμε χρησιμοποιώντας τη συνάρτηση visualize_bar_chart και το αποθηκεύουμε ως εικόνα.

plt = visualize_bar_chart(x=x, x_label='Ημερομηνία', y=y, y_label='Σύνολο αναρτήσεων', title='Ημερήσιες αναρτήσεις')
plt.savefig('viz.png')

Τυλίγουμε αυτόν τον κώδικα σε μια συνάρτηση που ονομάζεται 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')

Στείλτε μια εικόνα

Για να στείλετε μια αναφορά στον παραλήπτη, πρέπει να γνωρίζετε την παράμετρο chat_id.

Χρησιμοποιούμε userinfobot και πληκτρολογήστε /start. Το bot απαντά με τις απαραίτητες πληροφορίες, το chat_id περιέχεται στο πεδίο id.

Τώρα ας δημιουργήσουμε τη συνάρτηση send_image. Θα χρησιμοποιήσει τη συνάρτηση get_and_save_image για να ανακτήσει και να αποθηκεύσει την εικόνα. Και μετά στέλνουμε τα πάντα στη σωστή επαφή.

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

Κύριο πρόγραμμα

Τέλος, δημιουργούμε μια άλλη λειτουργία, κύρια, για την εκκίνηση της εφαρμογής. Μην ξεχάσετε να αλλάξετε το YOUR_TOKEN για το bot.

Θυμηθείτε: αυτό το πρόγραμμα θα στείλει την εικόνα αυτόματα τη στιγμή που θα καθορίσετε. Για παράδειγμα, θα στέλνουμε μια αναφορά στις εννέα το πρωί κάθε μέρα.

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

Ως αποτέλεσμα, η εφαρμογή μας θα μοιάζει με αυτό:

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

Αποθηκεύστε το αρχείο και ονομάστε το main.py.

Εκκινούμε την εφαρμογή εισάγοντας την εντολή στο τερματικό:

python3 main.py

Όλα είναι έτοιμα. Τώρα έχουμε ένα ρομπότ που αποτελείται από 50 γραμμές κώδικα που δημιουργεί αναφορές χωρίς την παρέμβασή μας.

Ας ελέγξουμε το bot ως εκ τούτου,επιλέγοντας την εντολή /send.

Πώς να αναθέσετε απλές αναφορές σε ένα ρομπότ. Γράφουμε ένα bot σε Python και Google BigQuery

Μπορείτε να λάβετε τον τελικό κωδικό στο το GitHub μου.

Το Skillbox προτείνει:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο