您是否有日復一日、週復一週重複的任務? 例如,寫報告。 您請求數據,對其進行分析,將其視覺化(製作圖表),然後將其發送給您的老闆。 但如果這一切都是自動化的呢?
在本教程中,我們將為 Telegram 建立一個機器人,以協助自動化報告。 最酷的是整個程式僅由 50 行程式碼組成! 如果您是第一次為 Telegram 創建機器人,那麼您也應該閱讀這篇文章
技能箱推薦: 實踐課程
從零開始的Python開發者 .提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。
入門
安裝庫
我們將使用
pip3 安裝 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
連接 Google BigQuery API
如果我們想使用該服務,我們需要連接Google BigQuery API。 為此,我們前往
在控制台中,選擇啟用 API 和服務並尋找 BigQuery API。
選擇啟用以連接 API。
建立帳戶金鑰
我們再去一次
然後 - 新建服務帳戶,並在服務帳戶名稱欄位中輸入名稱。
從角色下拉清單中,選擇項目 > 擁有者,然後選擇建立。
將自動下載的檔案稱為 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 參數。
我們用
現在讓我們建立 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 行程式碼組成的機器人,可以在無需我們幹預的情況下產生報告。
讓我們檢查一下機器人
您可以在以下位置取得完成的程式碼
技能箱推薦:
- 兩年實踐課程
“我是專業網頁開發人員” .- 在線課程
《C#開發從0開始》 .- 實踐年課程
《PHP 開發者從 0 到 PRO》 .
來源: www.habr.com