python で経済指標の取得とグラフ化その2
ISM Manufacturing PMI
ISM製造業PMI
を
altair でグラフにする
1 | economic_data[economic_data[ 'event' ]. str .contains( 'ISM Non-Manufacturing PMI' )] |
で結果の取得はできた
以前
apple の情報を取得し
そこから特定のカラムの Close だけ取り出したことがあるので
1 | economic_data[economic_data[ 'event' ]. str .contains( 'ISM Non-Manufacturing PMI' )][ 'actual' ] |
とすると
1 2 3 4 5 6 7 | 99 57.2 535 58.7 1016 55.3 1566 63.7 2027 62.7 2540 64.0 Name: actual, dtype: object |
となり
ID と actual の数値がでる
ただし
1 2 3 4 5 6 7 8 9 10 | chart = ( alt.Chart(ISM) .mark_line(opacity = 0.8 ,clip = True ) .encode( x = "Date:T" , y = alt.Y( "Stock Prices(USD):Q" ,stack = None ), color = 'Name:N' ) ) chart |
としてもエラーになる
1 | ISM.dtype |
を実行すると
1 | dtype( 'O' ) |
となる
検索して調べてみた
dtype( ‘O’)とは何ですか?
によれば
python object
とのこと
なので数値にしないとダメ
おそらくやり方が違っているので
株価可視化アプリでやったことを思い出す
1 | economic_data.columns |
でカラムを調べると
1 2 3 | Index([ 'id' , 'date' , 'time' , 'zone' , 'currency' , 'importance' , 'event' , 'actual' , 'forecast' , 'previous' ], dtype = 'object' ) |
となる
過去に apple の株価取得したときには
1 | Index([ 'Open' , 'High' , 'Low' , 'Close' , 'Volume' , 'Dividends' , 'Stock Splits' ], dtype = 'object' ) |
だった
今回は指標を絞ってみる
1 2 | ISM = economic_data[economic_data[ 'event' ]. str .contains( 'ISM Non-Manufacturing PMI' )] ISM.columns |
とすると
1 2 3 | Index([ 'id' , 'date' , 'time' , 'zone' , 'currency' , 'importance' , 'event' , 'actual' , 'forecast' , 'previous' ], dtype = 'object' ) |
となる
あまり変わっていない
1 | ISM.reset_index() |
でインデックスを振りなおしてみる
1 2 | ism_act = ISM[[ 'actual' ]] ism_act |
で
actual へ絞り込みができた
ただし、そのまま
1 2 3 4 5 6 7 8 | chart = ( alt.Chart(ism_act) .mark_line(opacity = 0.8 ,clip = True ) .encode( x = "Date:T" , y = alt.Y( "Stock Prices(USD):Q" ,stack = None ) ) ) |
としても日付がないので表示できない
pandas.DataFrameから条件を満たす行名・列名の行・列を抽出(選択)
を参考に
1 2 | ism_act = ISM. filter (items = [ 'date' , 'actual' ]) ism_act |
とすれば日付も取得できる
1 2 3 4 5 6 7 8 | chart = ( alt.Chart(ism_act) .mark_line(opacity = 0.8 ,clip = True ) .encode( x = "date:T" , y = alt.Y( "actual:Q" ,stack = None ) ) ) |
ででたけど
表示がおかしい
原因は日付表示
1 2 3 4 5 6 | 99 08 / 01 / 2021 57.2 535 04 / 02 / 2021 58.7 1016 04 / 03 / 2021 55.3 1566 05 / 04 / 2021 63.7 2027 05 / 05 / 2021 62.7 2540 03 / 06 / 2021 64.0 |
の場合日付を月と認識されるので
表記を変える必要がある
1 | ism_act.index = ism_act.index.strftime( '%d %B %Y' ) |
としたが
1 | AttributeError: 'Int64Index' object has no attribute 'strftime' |
となる
[Python]pandasの日付データから年、月、日、曜日への変換方法
を参考に
1 | ism_act[ 'date' ] = pd.to_datetime(ism_act[ 'date' ], format = '%Y-%m-%d' ) |
としたがエラー
Pandasデータフレームを日付で並べ替え
を参考に
1 2 | ism_act[ 'date' ] = pd.to_datetime(ism_act.date) ism_act.sort_values(by = 'date' ) |
とすれば
ソートはできるが日付フォーマットを修正しないとバグる
1 | df_ism_act = pd.DataFrame(ism_act) |
で
Dataframe にしてみたが
おそらく株価アプリのときみたいに
DatetimeIndex を作成したほうがいいかもしれない
1 2 | ism_act[ 'date' ] = pd.to_datetime(ism_act[ 'date' ], format = '%Y%m%d' ) ism_act.sort_values(by = 'date' ) |
だと
08/01/2021
を8/1
として認識して変換している