Πώς να αναθέσετε απλές αναφορές σε ένα ρομπότ. Γράφουμε ένα bot σε Python και Google BigQuery
Έχετε εργασίες που επαναλαμβάνονται μέρα με τη μέρα, εβδομάδα με την εβδομάδα; Για παράδειγμα, η σύνταξη αναφορών. Ζητάτε δεδομένα, τα αναλύετε, τα οπτικοποιείτε (κάνετε γραφήματα, γραφήματα) και μετά τα στέλνετε στο αφεντικό σας. Τι θα γινόταν όμως αν όλα αυτά ήταν αυτοματοποιημένα;
Σε αυτό το σεμινάριο θα δημιουργήσουμε ένα bot για το Telegram που θα βοηθήσει στην αυτοματοποίηση των αναφορών. Και το πιο ωραίο είναι ότι ολόκληρο το πρόγραμμα θα αποτελείται από μόνο 50 γραμμές κώδικα! Εάν δημιουργείτε ένα bot για το Telegram για πρώτη φορά, τότε θα πρέπει να διαβάσετε και αυτό post.
Υπενθύμιση:για όλους τους αναγνώστες του "Habr" - έκπτωση 10 ρούβλια κατά την εγγραφή σε οποιοδήποτε μάθημα Skillbox χρησιμοποιώντας τον κωδικό προσφοράς "Habr".
Αν θέλουμε να χρησιμοποιήσουμε την υπηρεσία, πρέπει να συνδέσουμε το Google BigQuery API. Για να το κάνουμε αυτό πηγαίνουμε στο Κονσόλα προγραμματιστών Google και δημιουργήστε ένα νέο έργο (ή επιλέξτε ένα υπάρχον).
Στον πίνακα ελέγχου, επιλέξτε ENABLE APIS AND SERVICES και αναζητήστε το BigQuery API.
Επιλέξτε Ενεργοποίηση για να συνδέσετε το API.
Δημιουργήστε ένα κλειδί λογαριασμού
Πάμε πάλι στο Κονσόλα προγραμματιστών Google, επιλέξτε την καρτέλα Διαπιστευτήρια, Δημιουργία διαπιστευτηρίων και Κλειδί λογαριασμού υπηρεσίας.
Στη συνέχεια - Νέος λογαριασμός υπηρεσίας και εισαγάγετε το όνομα στο πεδίο Όνομα λογαριασμού υπηρεσίας.
Από την αναπτυσσόμενη λίστα Ρόλος, επιλέξτε Έργο > Κάτοχος και μετά Δημιουργία.
Το αρχείο που θα ληφθεί αυτόματα ονομάζεται creds.json.
Ορίστε το GOOGLE_APPLICATION_CREDENTIALS, προσδιορίζοντας τη διαδρομή για το creds.json στο τερματικό.
Αν όλα πήγαν καλά, ήρθε η ώρα να αρχίσετε να γράφετε το πρόγραμμα.
Δημιουργήστε μια εφαρμογή
Για το σεμινάριο θα χρησιμοποιήσουμε δεδομένα από το bigquery-public-data.stackoverflow, για την αναφορά μας θα επιλέξουμε τον αριθμό των ημερήσιων δημοσιεύσεων.
Όλα είναι αρκετά απλά.
Ερώτημα στον πίνακα -> Οπτικοποίηση των δεδομένων -> Αποθήκευση της οπτικοποίησης -> Αποστολή της εικόνας
Ας δημιουργήσουμε μια συνάρτηση για να ορίσουμε κάθε νήμα.
Ερώτημα στο BigQuery
Πρώτα εισάγουμε τη βιβλιοθήκη.
από το google.cloud import bigquery
Δημιουργούμε μια συνάρτηση που ονομάζεται query_to_bigquery, όπου η παράμετρος είναι query.
Αυτή η συνάρτηση θα επιστρέψει το αίτημα ως πλαίσιο δεδομένων.
Οπτικοποίηση δεδομένων
Για να λύσετε αυτό το πρόβλημα, επιλέξτε 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 και το αποθηκεύουμε ως εικόνα.
Τυλίγουμε αυτόν τον κώδικα σε μια συνάρτηση που ονομάζεται 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 για να ανακτήσει και να αποθηκεύσει την εικόνα. Και μετά στέλνουμε τα πάντα στη σωστή επαφή.
Τέλος, δημιουργούμε μια άλλη λειτουργία, κύρια, για την εκκίνηση της εφαρμογής. Μην ξεχάσετε να αλλάξετε το YOUR_TOKEN για το bot.
Θυμηθείτε: αυτό το πρόγραμμα θα στείλει την εικόνα αυτόματα τη στιγμή που θα καθορίσετε. Για παράδειγμα, θα στέλνουμε μια αναφορά στις εννέα το πρωί κάθε μέρα.