python で経済指標の取得とグラフ化その2

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
として認識して変換している

コメントを残す

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