経済指標の取得その2
次にpandas のカラムの結合をして新しいカラムを作成してみる
これをdate と time を合わせて
Datetime 形式にして
Datetime インデックスを作成する
https://note.com/kohaku935/n/n18205dcc60fa
を参考にまずは+で結合し
Datetime を追加する
1 2 3 | economic_data[ 'Datetime' ] = economic_data[ 'date' ] + economic_data[ 'time' ].fillna('') economic_data |
で欠損値は削除できたが
Time がAllay のものだとこれになってしまう
あとくっついてるので変換できない
1 | economic_data[ 'Datetime' ] = economic_data[ 'date' ] + " " + economic_data[ 'time' ].fillna('') |
として余白を入れる
https://note.nkmk.me/python-pandas-datetime-timestamp/
を使えばdatetime へ変換できるはず
その前に一度フォーマットを変えないと日付が月扱いになっている
1 2 3 4 5 | economic_data[ 'Days' ] = economic_data[ 'date' ] economic_data[ 'Days' ] = pd.to_datetime(economic_data[ 'Days' ]) economic_data |
で確認したら
これだとだめ
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 ) |
で
年月日へ変換
1 | pd.to_datetime(economic_data[ 'Days' ], format = "%Y%m%d %H:%M" ) |
とすればエラーにならない
このため
あとは時間の部分で
時刻でないものを除外するようにする
正規表現で検索
1 | economic_data[ 'time' ].tail( 10 ). str .contains( '[a-zA-Z]' ) |
というようにすれば
アルファベットになっているものだけになる
なので
1 | economic_data[ 'time' ].tail( 10 ). str .contains( '[1-9]' ) |
とすれば時間は数値なので
これで調べることができる
あとはif などで条件をつけて
数値出ない場合には
Datetime には NA を入れるようにする
まずカレンダーで重要なものだけ表示してみて
これでも変わらないのなら、この措置をとる
importanceを hight にすればいけるはず
1 | economic_data[economic_data[ 'importance' ] = = 'high' ] |
で前に出しているので
これでできたが日付関連が昨日と今日だと微妙におかしい
今日と明日で試してみる
Datetime index が設定できるようにすること
そして
Event の文字のエスケープをしておいて検索ができるようにしておくこと
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 にして
1 2 3 | dealing_calender[ 'DateTime' ] = dealing_calender[ 'date' ] + " " + dealing_calender[ 'time' ].fillna('') dealing_calender |
で
Datetime index のためのカラムを作成
と思ったが
【Pandas】DataFrameの文字列日付データを比較して、抽出したりする
にあるようにカラムをdatetime にすれば抽出できそう
1 2 3 4 5 | def convert_date(x): date = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S" ) return date |
で変換するメソッドを用意
しかし元のデータは秒までないためエラ〜になるので
1 2 3 4 5 | def convert_date(x): date = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M" ) return date |
とする
1 | dealing_calender[ 'DateTime' ] = dealing_calender[ 'DateTime' ]. apply (convert_date) |
で変換できた
pandas.DataFrame, Seriesを時系列データとして処理
を参考に
Datetime index を設定する
今回は
既存データの列をDatetimeIndexとして指定する方法
1 | dealing_calender.dtypes |
で確認すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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型の列をインデックスに指定する
1 | dealing_calender.set_index( 'DateTime' ,inplace = True ) |
これでできた
あとは時間指定でデータ取り出し
DatetimeIndexがわからんので逆引きでまとめとくの巻
を参考に
時間を指定して取り出す
文字列で時間や日時を指定して行を取り出す, loc
でいけそう
しかしやりたいのは
指定した時間でのevent の取り出し
なので
indexとcolumnを指定してvalueを取り出す
1 | dealing_calender.loc[ '2022-04-19 05:00' ][ 'event' ] |
とすれば
経済指標は英語で
Economic indicators
なので
1 2 3 | indicator = dealing_calender.loc[ '2022-04-19 05:00' ][ 'event' ] print (indicator) |
これで
1 | RBNZ Gov Orr Speaks |
となった
次に
この変数で経済指標のグラフの最初の検索処理ができるか試す
過去ログで見ると
1 2 3 | 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
のリファレンスを見ると
1 | investpy.news.economic_calendar(time_zone = None , time_filter = 'time_only' , countries = None , importances = None , categories = None , from_date = None , to_date = None ) |
となっている
しかし期間を指定しないとエラ〜になる
1 2 3 | 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 2 3 | # 1年前# => 2019-04-02 one_year_ago = today + relativedelta(years = - 1 ) |
でいけるはず
処理が遅いため
1 2 3 | 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ヶ月で指定する
1 2 3 | 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 |
でいける
この中から
1 2 3 | #重要指標で actual が NULL 以外で importance = high のものを表示 economic_data2[~(economic_data2[ 'actual' ].isnull()) & (economic_data2[ 'importance' ] = = 'high' )] |
以前に経済指標グラフを出す時には
取得期間を半年にした
1 | 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
これだけに絞る
1 2 3 4 5 6 7 | # 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 |
これで絞り込み
さらに
1 2 3 4 5 6 7 | # 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を検索
1 2 3 | ISM = year_economic_data2[year_economic_data2[ 'event' ]. str .contains( 'ISM Non-Manufacturing PMI' )] ISM |
で1年間のISMを表示できた
チャートにするには
そのままのsate time ではできないので
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 ) |
と変換する
あとはチャート部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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 を使っているので
1 | import altair as alt |
が必要