見出し画像

経済指標をGoogleカレンダーに自動プロットしてくれるプログラムを作ってみよう()

お疲れ様です。De:Lです。久々に書くnoteがプログラムの話で恐縮なんですがw。。。今回はGoogleカレンダーに経済指標を自動で入れてくれるプログラムを作成したので、共有がてらnoteに書き記しておきます。

なお

  1. Googleカレンダーを既に利用している。もしくはアカウントを持っている。

  2. Pythonの開発環境が整っている。(このnoteではColabで作っています。)

の2点は既に完了しているものとして話を進めます。

GoogleカレンダーのAPI連携

このoogleカレンダーのAPI連携に関しては下のQiitaとブログのものをそのまま参考にします。

0.プロジェクトの作成

まずは準備を行います。Google Cloud Platform(以下GCP)と検索し、Googleアカウントでログインしてください。GCPでは基本的にプロジェクトごとにサービスを管理することができるので、まずはプロジェクトを作成します。

ダッシュボードから新しいプロジェクトを選択し、適当な名前を付けてプロジェクトを作成してください。場所やらなんやらはフル無視で結構です。

プロジェクトを作成できたら、ポップアップがでるので、そこからプロジェクトを選択をクリックしたら、プロジェクトの作成は完了です

GoogleカレンダーのAPI有効化

次にAPIを有効化します。作成したプロジェクトの画面で、左上の三本線のやつ(伝われ)にカーソルを合わせると、メニューが出てきます。そのなかの「APIとサービス」にカーソルを合わせ、「ライブラリ」をクリックります。

ライブラリの画面で、Calenderと検索すると、GoogleカレンダーのAPIが出てくると思います。そのまま選択し、”APIを有効にする”をクリックしてください。

これで API の有効化は完了です。

認証情報作成(OAuth同意、サービスアカウント)

認証情報を作成します。認証情報とは、プログラムがカレンダーを操作することを許可されていることを確認するための情報です。 認証無しで Google カレンダーにアクセスできてしまうと知らない人のデータまで見れてしまうので、設定は必須になります。
先ほどと同様にプロジェクトのホーム画面から、メニューの「APIとサービス」から「認証情報」を選択します。

次に認証情報の画面の左にあるメニューの「OAuth同意画面」をクリックします。OAuth では、ユーザーの Google アカウントの権限をアプリに移譲することで、アプリがユーザーの代理でカレンダーを操作します。 そのために、アプリを使う際に Google アカウントでログインして、アプリに権限を承認させる必要があります。 不特定多数のユーザーが使うアプリで、それぞれのユーザのカレンダーを連携させたいときに使う方法です。

画面に沿って、設定していきます。User Typeは「外部」を選択してください。

次にアプリ情報ですが、アプリ名は好きに名付けてください。ユーザーサポートメールには自分のGoogleアカウントのGmailを入力してください。同じようにデベロッパーの連絡先情報もGmailを入力しておいてください。

その他、SCOPEやテストユーザーなどは設定しなくても、いけました。個別に設定が必要な場合がありますが、その場合は以下のGoogleのサポートサイトを見てみてください。

サービスアカウント作成

次にサービスアカウントを作成していきます。

プロジェクトのホーム画面のメニューから「IAMと管理」からサービスアカウントを選択すると、以下のような画面が出てきます。画面中央にあるサービスアカウントの作成を選択します。

説明に沿って、サービスアカウント名を入力します。省略可と書いている部分は省略して大丈夫だと思いますwたぶんw

適切に作成が完了すると、「IAMと管理」の画面のメールの部分にメールが出てきます。

そのメールをクリックすると、メールアドレス固有のページの飛びます。
そこから鍵を作成します。「鍵を追加」です。

クリックすると下のような画面に遷移します。そこでJSONをチェックして作成をします。すると、JSONファイルがダウンロードされます。

Googleカレンダーの設定

ではAPIの連携とJSONファイルのダウンロードが終わったら、Googleカレンダーの設定に移ります。

Googleカレンダーの設定画面で、好きなマイカレンダーを選んで、その中の「特定のユーザーとの共有」から、「+ユーザーを追加」を選択し、先ほどのサービスアカウントのメールアドレスを入力し送信をクリックします。そのとき、「変更及び共有の管理権限」を与えてください。

サービスアカウントのメールアドレスは下の画面にあります。

次に「カレンダーの統合」からカレンダーIDを控えておいてください。

これで諸々の準備はOKです。

Pythonでの作業

前述の通り、作業はColabで行います。
まず諸々のインストールから。

!pip install google-api-python-client google-auth
!pip install google-auth-httplib2
!pip install google-auth-oauthlib
!pip install investpy

4つ目の「investpy」ってのは経済指標を取ってくるライブラリです。便利すぎて禿げました()

経済指標の取得

まず経済指標を取得します。

import investpy
import pandas as pd
economic_data = investpy.economic_calendar(time_zone= "GMT +9:00", time_filter='time_only', countries=None,importances=["high"],from_date='01/11/2022', to_date='31/12/2022')
economic_data = economic_data[economic_data['importance']=='high']
euro_data = economic_data[economic_data["zone"] == "euro zone"]
japan_data = economic_data[economic_data["zone"] == "japan"]
usa_data = economic_data[economic_data["zone"] == "united states"]

今回は

  • タイムゾーンは日本。

  • 重要度が最も高い経済指標群のみ取得する。

  • 取得する経済指標は「日本」「アメリカ」「ユーロ圏」とする。

  • 取得する範囲は2022/11/1から2022/12/31とする。

上記の条件で取得します。ここら辺は好きにいじれます。以下のinvestpyの説明を読んでみたら色々いじれると思います。(英語ですがw)

Googleカレンダーへのプロット

では最後にGoogleカレンダーへ予定としてプロットします。まずはプログラムから。

import datetime
import googleapiclient.discovery
import google.auth

SCOPES = ['https://www.googleapis.com/auth/calendar']
calendar_id = '先ほど控えたカレンダーID'
gapi_creds = google.auth.load_credentials_from_file('ダウンロードしたJSONファイル名', SCOPES)[0]
service = googleapiclient.discovery.build('calendar', 'v3', credentials=gapi_creds)

#euroデータセット
euro_date_list = list()
euro_time_list = list()
euro_currency_list = list()
euro_event_list = list()

for i in euro_data["date"]:
  euro_date_list.append(i.split("/"))
for i in euro_data["time"]:
  euro_time_list.append(i.split(":"))
for i in euro_data["currency"]:
  euro_currency_list.append(i)
for i in euro_data["event"]:
  euro_event_list.append(i)

#japanデータセット
japan_date_list = list()
japan_time_list = list()
japan_currency_list = list()
japan_event_list = list()

for i in japan_data["date"]:
  japan_date_list.append(i.split("/"))
for i in japan_data["time"]:
  japan_time_list.append(i.split(":"))
for i in japan_data["currency"]:
  japan_currency_list.append(i)
for i in japan_data["event"]:
  japan_event_list.append(i)

#usaデータセット
usa_date_list = list()
usa_time_list = list()
usa_currency_list = list()
usa_event_list = list()

for i in usa_data["date"]:
  usa_date_list.append(i.split("/"))
for i in usa_data["time"]:
  usa_time_list.append(i.split(":"))
for i in usa_data["currency"]:
  usa_currency_list.append(i)
for i in usa_data["event"]:
  usa_event_list.append(i)

#euro予定作り
for (date,time,currency,event) in zip(euro_date_list,euro_time_list,euro_currency_list,euro_event_list):
  body = {
    'summary': "("+currency+")"+event,
    'start': {
        'dateTime': datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time[0]), int(time[1])).isoformat(),
        'timeZone': 'Japan'
    },
    'end': {
        'dateTime': datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time[0]), int(time[1])+1).isoformat(),
        'timeZone': 'Japan'
    },
  }
  event = service.events().insert(calendarId=calendar_id, body=body).execute()

#japan予定作り
for (date,time,currency,event) in zip(japan_date_list,japan_time_list,japan_currency_list,japan_event_list):
  body = {
    'summary': "("+currency+")"+event,
    'start': {
        'dateTime': datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time[0]), int(time[1])).isoformat(),
        'timeZone': 'Japan'
    },
    'end': {
        'dateTime': datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time[0]), int(time[1])+1).isoformat(),
        'timeZone': 'Japan'
    },
  }
  event = service.events().insert(calendarId=calendar_id, body=body).execute()

#usa予定作り
for (date,time,currency,event) in zip(usa_date_list,usa_time_list,usa_currency_list,usa_event_list):
  body = {
    'summary': "("+currency+")"+event,
    'start': {
        'dateTime': datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time[0]), int(time[1])).isoformat(),
        'timeZone': 'Japan'
    },
    'end': {
        'dateTime': datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time[0]), int(time[1])+1).isoformat(),
        'timeZone': 'Japan'
    },
  }
  event = service.events().insert(calendarId=calendar_id, body=body).execute()

やってることとしては初学者でも十分理解できる範疇だと思います。なので、もっとうまく書ける人は多いかと。修正してください()

なお、カレンダーIDとJSONファイルの名前は個々人で違いますので、上の準備で用意したものを入力してください。

もちろん、ダウンロードしたJSONファイルはColab内のディレクトリに入れておいてください。下に参考サイトを貼っておきます。

実際に動かした結果のカレンダーがこちら。

予定としては「(国名)event名」でプロットされています。一応英語でのプロットになってしまいますが、それくらい許してください()
日本語でプロットする手段はいくつかありそうですが、これで十分わかるかなと。

終わりに

久々の投稿がこんな感じで笑ってしまうんですが、毎回いつにどんな経済指標があるのか、その都度サイトを見に行っていましたが、これで重要指標がある日は予定に入っているので、「あ、今日は大事な指標あるわ。見とこ。」となるので、その日その日に指標内容を調べればいいので、わざわざルーティン化しなくてよくて楽です。ぜひ試してみてください。


この記事が気に入ったらサポートをしてみませんか?