כיצד להאציל דוחות פשוטים לרובוט. כתיבת בוט ב-Python וב-Google BigQuery

כיצד להאציל דוחות פשוטים לרובוט. כתיבת בוט ב-Python וב-Google BigQuery

האם יש לך משימות שחוזרות על עצמן יום אחר יום, שבוע אחר שבוע? למשל, כתיבת דוחות. אתה מבקש נתונים, מנתחים אותם, מדמיינים אותם (יוצרים גרפים, תרשימים), ואז שולחים אותם לבוס שלך. אבל מה אם כל זה היה אוטומטי?

במדריך זה ניצור בוט לטלגרם שיעזור להפוך את הדיווח לאוטומטי. והדבר הכי מגניב הוא שהתוכנית כולה תהיה מורכבת מ-50 שורות קוד בלבד! אם אתה יוצר בוט עבור טלגרם בפעם הראשונה, עליך לקרוא גם את זה להציב.

Skillbox ממליצה: קורס מעשי מפתח Python מאפס.

אנו מזכירים: לכל קוראי Habr - הנחה של 10 רובל בעת הרשמה לכל קורס Skillbox באמצעות קוד ההטבה של Habr.

בואו נתחיל

התקנת ספריות

אנחנו נשתמש google-cloud-bigquery כדי לקבל נתונים מ-Google BigQuery. matplotlib, קהות и דובי פנדה יעזור לך לדמיין את הנתונים שלך. פיתון-טלגרם-בוט ישלח את הנתונים המוגמרים לטלגרם.

pip3 להתקין את google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

חיבור Google BigQuery API

אם אנחנו רוצים להשתמש בשירות, אנחנו צריכים לחבר את Google BigQuery API. כדי לעשות זאת אנחנו הולכים ל Google Developers Console וצור פרויקט חדש (או בחר קיים).

בלוח הבקרה, בחר ENABLE APIS AND SERVICES וחפש את BigQuery API.

כיצד להאציל דוחות פשוטים לרובוט. כתיבת בוט ב-Python וב-Google BigQuery

בחר הפעל כדי לחבר את ה-API.

כיצד להאציל דוחות פשוטים לרובוט. כתיבת בוט ב-Python וב-Google BigQuery

צור מפתח חשבון

בוא נלך שוב Google Developers Console, בחר בכרטיסייה אישורים, צור אישורים ומפתח חשבון שירות.

לאחר מכן - חשבון שירות חדש, והזן את השם בשדה שם חשבון שירות.

מהרשימה הנפתחת תפקיד, בחר פרויקט > בעלים ולאחר מכן צור.

כיצד להאציל דוחות פשוטים לרובוט. כתיבת בוט ב-Python וב-Google BigQuery

הקובץ שיורד אוטומטית נקרא creds.json.

הגדר GOOGLE_APPLICATION_CREDENTIALS, ציון הנתיב אל creds.json בטרמינל.

ייצוא GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

אם הכל הלך כשורה, הגיע הזמן להתחיל בכתיבת התוכנית.

צור אפליקציה

עבור המדריך נשתמש בנתונים מ-bigquery-public-data.stackoverflow, עבור הדוח שלנו נבחר את מספר הפרסומים היומיים.

הכל די פשוט.

שאילתה בטבלה -> הדמיין את הנתונים -> שמור את ההדמיה -> שלח את התמונה

בואו ניצור פונקציה אחת כדי להגדיר כל שרשור.

שאילתה ל-BigQuery

ראשית אנו מייבאים את הספרייה.

מ-google.cloud ייבוא ​​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(query)

לאחר מכן אנו משתמשים בעמודת נתוני התאריך עבור ציר ה-x, ובעמודת total_posts עבור ציר ה-y.

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

אנו מדמיינים אותו באמצעות הפונקציה visualize_bar_chart ושומרים אותו כתמונה.

plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
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. הבוט מגיב עם המידע הדרוש, 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 עבור הבוט.

זכור: תוכנית זו תשלח את התמונה באופן אוטומטי בזמן שתציין. למשל, נשלח דוח כל יום בתשע בבוקר.

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 שורות קוד שמפיק דוחות ללא התערבותנו.

בוא נבדוק את הבוט מכאןעל ידי בחירה בפקודה /send.

כיצד להאציל דוחות פשוטים לרובוט. כתיבת בוט ב-Python וב-Google BigQuery

אתה יכול לקבל את הקוד המוגמר ב GitHub שלי.

Skillbox ממליצה:

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster