CSVファイルからデータを読み込む
例えば、1日分のデータとして以下のような CSVデータを想定。
一列目(date)が日付なのですが、「yymmdd」形式で出力されています。
date,expected_value,preliminary_value,name,confirmed_value
160301,,,,
160301,0,-100,銀行券要因,
160301,-7200,-10000,財政等要因,
160301,-7200,-10100,資金過不足,
160301,6000,6000, ,
160301,7500,7500, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,-300,-300, ,
160301,-100,-100, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,-200, ,
160301,+13100,+12900, ,
160301,,, ,
160301,,, ,
160301,+0,+0, ,
160301,+13100,+12900,合計,
160301,+5900,+2800,当座預金増減,
160301,,2592700,当座預金残高,
160301,,2336500, ,
160301,,1896900, ,
160301,,1896900, ,
160301,,256200, ,
160301,,,マネタリーベース,
160301,,積み期間(2/16~3/15日)の所要準備額(積数),積み期間(2/16~3/15日)の所要準備額(積数),1917300
160301,,積み期間(2/16~3/15日)の所要準備額(1日平均),積み期間(2/16~3/15日)の所要準備額(1日平均),66100
160301,,3/2日以降の残り要積立額(積数),3/2日以降の残り要積立額(積数),3300
160301,,3/2日以降の残り要積立額(1日平均),3/2日以降の残り要積立額(1日平均),200
まずは、CSVデータの読み込み。
CSV データの一列目の日付文字列を DatetimeIndex オブジェクトに変換して、index 列として読み込んでいます。
(参考)pandasで様々な日付フォーマットを取り扱う - Qiita
date_parser = lambda d: pd.datetime.strptime(d, '%y%m%d')
df = pd.read_csv(
'/Users/akiyoko/PycharmProjects/marketstat/downloads/boj/2016/160301.csv',
index_col='date', parse_dates=True, date_parser=date_parser,
na_values=' ',
)
df
na_values オプションは、CSV 読み込み時に特定の値(今回の場合は半角スペース)を NaN に変換してくれるので便利です。
実践編
次に、一定期間分(2016〜2017年分)の CSVデータを読み込んでみます。
df_boj = pd.DataFrame()
date_parser = lambda d: pd.datetime.strptime(d, '%y%m%d')
paths = glob.glob('/Users/akiyoko/PycharmProjects/marketstat/downloads/boj/201[67]/*.csv')
for path in paths:
df = pd.read_csv(path,
index_col='date', parse_dates=True, date_parser=date_parser,
na_values=' ')
df = df.dropna(subset=['name', 'preliminary_value'])
df = df[df['name'] == '当座預金残高']
df = df.drop(['expected_value', 'confirmed_value', 'name'], axis=1)
df = df.rename(columns={'preliminary_value': u'当座預金残高'})
df.index.names = ['Date']
df[u'当座預金残高'] = df[u'当座預金残高'].astype(int)
df_boj = df_boj.append(df)
df_boj.plot()
df_boj
ここで、2016年の時系列データ(日経平均株価)を読み込んでみます。
df_n225 = pd.read_csv('n225.csv', index_col='Date', parse_dates=True, usecols=['Date', 'Adj Close'])
df_n225 = df_n225.sort_index()
df_n225 = df_n225.rename(columns={'Adj Close': u'日経平均株価(終値)'})
df_n225.plot()
df_n225
単純に、二つのグラフを同じ図上に表示してみます。
日経平均株価の値が相対的に小さすぎて、地を這うようなグラフになってしまいました。
ax = df_boj.plot()
df_n225.plot(ax=ax)
見やすいように倍率を調整してみます。
adj = df_boj[u'当座預金残高'].mean() / df_n225[u'日経平均株価(終値)'].mean()
ax = df_boj.plot()
(df_n225 * adj).plot(ax=ax)
最後に、期間を合わせてみます。
start_date = '2016-01-01'
end_date = '2016-12-31'
span = pd.date_range(start_date, end_date)
df_2016 = pd.DataFrame(index=span)
df_2016 = df_2016.join(df_boj[start_date:end_date])
df_2016 = df_2016.join(df_n225[start_date:end_date] * adj)
df_2016.plot()
df_2016