経済指標の取得その2

経済指標の取得その2

次にpandas のカラムの結合をして新しいカラムを作成してみる

これをdate と time を合わせて
Datetime 形式にして
Datetime インデックスを作成する

https://note.com/kohaku935/n/n18205dcc60fa

を参考にまずは+で結合し

Datetime を追加する

economic_data['Datetime']=economic_data['date']+economic_data['time'].fillna('')

economic_data

で欠損値は削除できたが

Time がAllay のものだとこれになってしまう

あとくっついてるので変換できない

economic_data['Datetime']=economic_data['date']+" "+economic_data['time'].fillna('')

として余白を入れる

https://note.nkmk.me/python-pandas-datetime-timestamp/
を使えばdatetime へ変換できるはず

その前に一度フォーマットを変えないと日付が月扱いになっている

economic_data['Days']=economic_data['date']

economic_data['Days']=pd.to_datetime(economic_data['Days'])

economic_data

で確認したら

これだとだめ

date2 =[]

for i in economic_data['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

economic_data['date']=economic_data['date'].str.replace('/','-')

economic_data['date'] = date2

economic_data.fillna(0)

年月日へ変換

pd.to_datetime(economic_data['Days'], format="%Y%m%d %H:%M")

とすればエラーにならない

このため

あとは時間の部分で

時刻でないものを除外するようにする

正規表現で検索

economic_data['time'].tail(10).str.contains('[a-zA-Z]')

というようにすれば

アルファベットになっているものだけになる

なので

economic_data['time'].tail(10).str.contains('[1-9]')

とすれば時間は数値なので

これで調べることができる

あとはif などで条件をつけて

数値出ない場合には

Datetime には NA を入れるようにする

まずカレンダーで重要なものだけ表示してみて

これでも変わらないのなら、この措置をとる

importanceを hight にすればいけるはず

economic_data[economic_data['importance']=='high']

で前に出しているので

これでできたが日付関連が昨日と今日だと微妙におかしい

今日と明日で試してみる

Datetime index が設定できるようにすること

そして

Event の文字のエスケープをしておいて検索ができるようにしておくこと

date2 =[]

for i in dealing_calender['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

dealing_calender['date']=dealing_calender['date'].str.replace('/','-')

dealing_calender['date'] = date2

dealing_calender.fillna(0)

でdatetime にして

dealing_calender['DateTime']=dealing_calender['date']+" "+dealing_calender['time'].fillna('')

dealing_calender

Datetime index のためのカラムを作成

と思ったが

【Pandas】DataFrameの文字列日付データを比較して、抽出したりする
にあるようにカラムをdatetime にすれば抽出できそう

def convert_date(x):

    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M:%S")

    return date

で変換するメソッドを用意

しかし元のデータは秒までないためエラ〜になるので

def convert_date(x):

    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M")

    return date

とする

dealing_calender['DateTime'] = dealing_calender['DateTime'].apply(convert_date)

で変換できた

pandas.DataFrame, Seriesを時系列データとして処理
を参考に
Datetime index を設定する

今回は
既存データの列をDatetimeIndexとして指定する方法

dealing_calender.dtypes

で確認すると

id                    object

date                  object

time                  object

zone                  object

currency              object

importance            object

event                 object

actual                object

forecast              object

previous              object

DateTime      datetime64[ns]

dtype: object

となり

すでにdatetime には変換済

set_index()メソッドでdatetime64型の列をインデックスに指定する

dealing_calender.set_index('DateTime',inplace=True)

これでできた

あとは時間指定でデータ取り出し

DatetimeIndexがわからんので逆引きでまとめとくの巻
を参考に
時間を指定して取り出す

文字列で時間や日時を指定して行を取り出す, loc
でいけそう

しかしやりたいのは
指定した時間でのevent の取り出し

なので
indexとcolumnを指定してvalueを取り出す

dealing_calender.loc['2022-04-19 05:00']['event']

とすれば

経済指標は英語で

Economic indicators
なので

indicator = dealing_calender.loc['2022-04-19 05:00']['event']

print(indicator)

これで

RBNZ Gov Orr Speaks

となった

次に
この変数で経済指標のグラフの最初の検索処理ができるか試す

過去ログで見ると

economic_data = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')

economic_data.tail(5)

となっている

つまり最初の時点で国などを指定している
これだと日本とアメリカのみになっているので
これを変える必要がある

対象を全ての国にするか
メジャーカレンシーのみに絞る

https://investpy.readthedocs.io/_api/news.html

のリファレンスを見ると

investpy.news.economic_calendar(time_zone=None, time_filter='time_only', countries=None, importances=None, categories=None, from_date=None, to_date=None)

となっている

しかし期間を指定しないとエラ〜になる

economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2021', to_date='31/01/2021')

economic_data2

というように国コードだけ指定外して
期間を指定したらできた

せっかくなので期間を
年始から今日までとしてみる
と思ったけど年間のデータから算出した方が良さそう
そもそも年始にトレードする時
修正が必要になってしまう

[Python]昨日や明日、月末などの日付を取得したい
を参考に

# 1年前# => 2019-04-02

one_year_ago = today + relativedelta(years=-1)

でいけるはず

処理が遅いため

economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)

economic_data2

としてみた

表示されるまで時間がかかる

ネット速度の問題か
それともマシンスペックかはわからない

つまり年ごとで取得するなら
別の時間枠でやらないと間に合わない

とりあえず直近1ヶ月で指定する

economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date=deal_one_month_ago, to_date=deel_today)

economic_data2

でいける

この中から

#重要指標で actual が NULL 以外で importance = high のものを表示

economic_data2[~(economic_data2['actual'].isnull()) & (economic_data2['importance']=='high')]

以前に経済指標グラフを出す時には
取得期間を半年にした

economic_data = investpy.news.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'],importances=None,categories=None,from_date='01/01/2021', to_date='11/06/2021')

で1年にしたら止まった

カレンシーを絞らないとできないと思う
カレンシーの絞り込みはなく国の指定になる

取り扱っている通貨で出すと
ドル united states
ユーロ germany
ポンド united kingdom
豪ドル australia
NZドル new zealand
カナダドル canada
スイスフラン switzerland

これだけに絞る

# economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)

# economic_data2

year_economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=[‘united states','germany','united kingdom','australia','new zealand','canada','switzerland'], from_date=deal_one_month_ago, to_date=deel_today)

year_economic_data2

これで絞り込み

さらに

# economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)

# economic_data2

year_economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=[‘united states','germany','united kingdom','australia','new zealand','canada','switzerland'], from_date=deal_one_year_ago, to_date=deel_today)

year_economic_data2

で年間にしたらできた

あとはグラフの時と同じ処理をやってみる
探す時に
経済指標の検索ワードを
カレンダーの結果で調べてみる

もしエラーならエスケープ後に再度挑戦する

まずはISMを検索

ISM =year_economic_data2[year_economic_data2['event'].str.contains('ISM Non-Manufacturing PMI')]

ISM

で1年間のISMを表示できた

チャートにするには
そのままのsate time ではできないので

date2 =[]

for i in ISM['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

ISM['date']=ISM['date'].str.replace('/','-')

ISM['date'] = date2

ISM.fillna(0)

と変換する

あとはチャート部分

actual =(

    alt.Chart(ISM)

    .mark_line(opacity=0.8,clip=True)

    .encode(

        x="date:T",

        y=alt.Y("actual:Q",stack=None)

    )

)



forecast =(

    alt.Chart(ISM)

    .mark_line(opacity=0.8,clip=True,color='red')

    .encode(

        x="date:T",

        y=alt.Y("forecast:Q",stack=None),      

    )

)



previous =(

    alt.Chart(ISM)

    .mark_line(opacity=0.8,clip=True,color='green')

    .encode(

        x="date:T",

        y=alt.Y("previous:Q",stack=None),      

    )

)

alt.layer(actual,forecast,previous).resolve_scale(

    y = 'independent'

)

で表示できる

なおaltair を使っているので

import altair as alt

が必要

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です