如何將簡單的報告委託給機器人。 我們用 Python 和 Google BigQuery 編寫一個機器人

如何將簡單的報告委託給機器人。 我們用 Python 和 Google BigQuery 編寫一個機器人

您是否有日復一日、週復一週重複的任務? 例如,寫報告。 您請求數據,對其進行分析,將其視覺化(製作圖表),然後將其發送給您的老闆。 但如果這一切都是自動化的呢?

在本教程中,我們將為 Telegram 建立一個機器人,以協助自動化報告。 最酷的是整個程式僅由 50 行程式碼組成! 如果您是第一次為 Telegram 創建機器人,那麼您也應該閱讀這篇文章 郵寄.

技能箱推薦: 實踐課程 從零開始的Python開發者.

提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。

入門

安裝庫

我們將使用 Google雲bigquery 從 Google BigQuery 取得資料。 繪圖庫, 麻木 и 大熊貓 將幫助您可視化您的數據。 python 電報機器人 將完成的資料傳送到 Telegram。

pip3 安裝 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

連接 Google BigQuery API

如果我們想使用該服務,我們需要連接Google BigQuery API。 為此,我們前往 Google Developers Console 並建立一個新項目(或選擇現有項目)。

在控制台中,選擇啟用 API 和服務並尋找 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是軸的標題,title是整個視覺化的標題。

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 月 XNUMX 日起兩週的資料。

我們使用這個日期是因為 2018-12-02 是 bigquery-public-data.stackoverflow.post_history 中記錄的最新數據,在其他情況下,您可以使用 CURRENT_DATE() 來獲取最新數據。

呼叫query_to_bigquery函數以取得資料。

資料框 = query_to_bigquery(查詢)

然後我們使用日期資料列作為 x 軸,使用total_posts 列作為 y 軸。

x = dataframe['日期'].tolist()
y = dataframe['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 參數。

我們用 使用者資訊機器人 並輸入/開始。 機器人會回應必要的訊息,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'))

主機程式

最後,我們建立另一個函數 main 來啟動應用程式。 不要忘記更改機器人的 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.

技能箱推薦:

來源: www.habr.com

添加評論