毎日、毎週繰り返されるタスクはありますか? たとえば、レポートを書くことです。 データを要求し、分析し、視覚化(グラフやチャートの作成)して、上司に送信します。 しかし、これがすべて自動化されたらどうなるでしょうか?
このチュートリアルでは、レポートの自動化に役立つ Telegram 用のボットを作成します。 そして最も素晴らしいのは、プログラム全体がわずか 50 行のコードで構成されていることです。 Telegram のボットを初めて作成する場合は、こちらもお読みください。
スキルボックスは次のことを推奨します。 実践コース
ゼロからのPython開発者 .リマインダー: 「Habr」のすべての読者が対象 - 「Habr」プロモーション コードを使用してスキルボックス コースに登録すると 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 へのパスを指定します。
import GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
すべてがうまくいった場合は、プログラムの作成を開始します。
アプリケーションを作成する
チュートリアルでは bigquery-public-data.stackoverflow のデータを使用し、レポートでは毎日のパブリケーションの数を選択します。
すべてが非常に簡単です。
テーブルのクエリ -> データの視覚化 -> 視覚化の保存 -> 画像の送信
各スレッドを定義する関数を XNUMX つ作成しましょう。
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としてインポートする
XNUMX つのパラメーターが必要です。ここで、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
画像を保存する
次に、XNUMX つの関数を使用してビジュアライゼーションを作成し、保存しましょう。
毎日の投稿数をお送りします。 まずリクエストを書きます。
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 日から XNUMX 週間のデータを収集するのに役立ちます。
2018-12-02 が bigquery-public-data.stackoverflow.post_history に記録されている最新のデータであるため、この日付を使用します。その他の場合は、CURRENT_DATE() を使用して最新のデータを取得できます。
query_to_bigquery 関数を呼び出してデータを取得します。
データフレーム = query_to_bigquery(クエリ)
次に、X 軸に日付データ列を使用し、Y 軸に total_posts 列を使用します。
x = データフレーム['日付'].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 パラメーターを知っている必要があります。
を使用しております
次に、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 を変更することを忘れないでください。
覚えておいてください: このプログラムは指定した時間に画像を自動的に送信します。 たとえば、毎日朝XNUMX時にレポートを送信します。
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 行のコードで構成されるロボットが完成しました。
ボットを確認してみよう
完成したコードは次の場所から入手できます。
スキルボックスは次のことを推奨します。
- XNUMX年間の実践コース
「私はプロのウェブ開発者です」 .- オンラインコース
「0からのC#開発者」 .- 実践一年コース
「0からPROまでのPHP開発者」 .
出所: habr.com