簡単なレポートをロボットに委任する方法。 Python と Google BigQuery でボットを作成する

簡単なレポートをロボットに委任する方法。 Python と Google BigQuery でボットを作成する

毎日、毎週繰り返されるタスクはありますか? たとえば、レポートを書くことです。 データを要求し、分析し、視覚化(グラフやチャートの作成)して、上司に送信します。 しかし、これがすべて自動化されたらどうなるでしょうか?

このチュートリアルでは、レポートの自動化に役立つ Telegram 用のボットを作成します。 そして最も素晴らしいのは、プログラム全体がわずか 50 行のコードで構成されていることです。 Telegram のボットを初めて作成する場合は、こちらもお読みください。 投稿する.

スキルボックスは次のことを推奨します。 実践コース ゼロからのPython開発者.

リマインダー: 「Habr」のすべての読者が対象 - 「Habr」プロモーション コードを使用してスキルボックス コースに登録すると 10 ルーブルの割引。

降ります

ライブラリのインストール

我々は使用するだろう グーグルクラウドビッグクエリ Google BigQuery からデータを取得します。 matplotlib, numpy и パンダ データを視覚化するのに役立ちます。 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 へのパスを指定します。

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 パラメーターを知っている必要があります。

を使用しております ユーザー情報ボット /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'))

メインプログラム

最後に、アプリケーションを起動するための別の関数 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 行のコードで構成されるロボットが完成しました。

ボットを確認してみよう 故に/send コマンドを選択します。

簡単なレポートをロボットに委任する方法。 Python と Google BigQuery でボットを作成する

完成したコードは次の場所から入手できます。 私のGitHub.

スキルボックスは次のことを推奨します。

出所: habr.com

コメントを追加します