経済指標の取得その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
が必要