データフレーム作成
pythonを用いたポートフォリオ分析だったり為替分析をググったところ、まずは自分でデータフレームとやらを作れるようになってみようと思った。
参考にしたサイト
使用データ
基準価額
レオス-ひふみプラス: モーニングスターより
対象期間は、20190101-20191231
為替
このサイトを参考に、ドル円についてデータ取得。
実際のコード
ここからは参考のコードを写しながら、調べたことをメモしていく。
pandasでのデータ読み込みに関しては、こちら。
昨日ざきに教えてもらったwithも活用して、とりあえず下のコード実行。
import pandas as pd import numpy as np with pd.read_csv("rowdata/usd_jpy.csv",index_col=0,parse_dates=True) as ex: print (ex)
そしたらこんなエラー返ってきた
AttributeError: __enter__
よくわからんかったから、結局、参考サイトの通りにファイルを開いた。
import pandas as pd import numpy as np #with pd.read_csv("rowdata/usd_jpy.csv",index_col=0,parse_dates=True) as ex: # print (type(ex)) exchange=pd.read_csv("rowdata/usd_jpy.csv",index_col=0,parse_dates=True) print (exchange) exchange=exchange[["Close"]] hifumi=pd.read_csv("rowdata/hifumi.csv",index_col=0,parse_dates=True) #print (hifumi) hifumi.columns=["hifumi"] index=pd.read_csv("rowdata/index.csv",index_col=0,parse_dates=True) index.columns=["index"]
そしたら、こんなエラーが。KeyError: "['Close'] not in index
9行目がエラー起こしていたけど、なんのことか全くわからんかった。。
結局、この9行目はcloseとか書いてあるから、開いたファイル閉じることを指示してるんだと思い込んでたのが間違いだった。これは、読み込んだファイルのheaderからCloseってところを参照するってことだった。
今回は、参考記事と為替データのソースが違うから、Close
じゃなくてJPY/USD
としたらうまくいった。Close
は閉じる、じゃなくて終値のことだったんすね。
import pandas as pd import numpy as np #with pd.read_csv("rowdata/usd_jpy.csv",index_col=0,parse_dates=True) as ex: # print (type(ex)) exchange=pd.read_csv("rowdata/usd_jpy.csv",index_col=0,parse_dates=True) #print (exchange) exchange=exchange[["JPY/USD"]] hifumi=pd.read_csv("rowdata/hifumi.csv",index_col=0,parse_dates=True) #print (hifumi) hifumi.columns=["hifumi"] index=pd.read_csv("rowdata/index.csv",index_col=0,parse_dates=True) index.columns=["index"] vti=pd.read_csv("rowdata/VTI.csv",index_col=0,parse_dates=True) #print (vti) vti=vti[["Adj Close"]] #print (vti) vti.columns=["vti"] #print (vti) vti=pd.DataFrame(vti["vti"]*exchange["JPY/USD"],columns=["vti"]) print (vti) vti=vti.dropna() print (vti)
ここまで進めたので、メモを残しておく。 特に最後のVTIのところについて。
vti=vti[["Adj Close"]]
:indexの中からAdj Close調整後終値の値を選択vti.columns=["vt"]
:index名をAdj Closeからvtivti=pd.DataFrame(vti["vti"]*exchange["JPY/USD"],columns=["vti"])
:為替データと掛け算vti=vti.dropna()
:NaNを消去
為替データとの掛け算は、掛け算するものをどのように対応させているんだろう
読み込むときにindex_col=0
としているから、indexを参照して対応させてくれているのかなあ
df=pd.DataFrame([]) df=df.join([hifumi,index,vti],how="outer") #print (df) date=pd.DataFrame(index=pd.date_range(start=df.index[0],end="2019-12-30")) #print (date) df=df.join(date,how="outer") #print (df) order=["hifumi","index","vti"] df=df[order] #print (df) #print (df["hifumi"])
そしてDataFrameを作成。joinはリスト同士を結合しているんだろうな、多分。how="outer"
ってやつは、いわゆる外部結合みたいな名前のやつだろう、多分。途中でDataFrameがどうなってるのかprintしながら進めたらなんとなーくはわかった、気がする。
とりあえず最後に記念にDataFrameとして出力されたやつを載せてみる。
hifumi index vti 2019-01-02 NaN NaN 13689.478329 2019-01-03 NaN NaN 13189.845590 2019-01-04 32448.0 9708.0 13709.905650 2019-01-05 NaN NaN NaN 2019-01-06 NaN NaN NaN 2019-01-07 33669.0 9982.0 13859.672169 2019-01-08 33862.0 10020.0 14026.834588 2019-01-09 34048.0 10130.0 14051.457936 2019-01-10 33630.0 10044.0 14111.445705 2019-01-11 33845.0 10095.0 14128.969600 2019-01-12 NaN NaN NaN 2019-01-13 NaN NaN NaN 2019-01-14 NaN NaN 14016.315111 2019-01-15 34160.0 10180.0 14212.421604 2019-01-16 34192.0 10147.0 14292.283503 2019-01-17 34422.0 10182.0 14422.188436 2019-01-18 34869.0 10278.0 14704.467024 2019-01-19 NaN NaN NaN 2019-01-20 NaN NaN NaN 2019-01-21 35044.0 10336.0 NaN 2019-01-22 34772.0 10270.0 14458.284712 2019-01-23 34488.0 10208.0 14518.310890 2019-01-24 34639.0 10245.0 14539.152026 2019-01-25 35029.0 10334.0 14693.133703 2019-01-26 NaN NaN NaN 2019-01-27 NaN NaN NaN 2019-01-28 34962.0 10264.0 14529.648174 2019-01-29 34974.0 10275.0 14515.903573 2019-01-30 34664.0 10234.0 14749.620196 2019-01-31 35448.0 10343.0 14788.526942 ... ... ... ... 2019-12-01 NaN NaN NaN 2019-12-02 40375.0 11568.0 17217.731157 2019-12-03 40175.0 11514.0 17024.731730 2019-12-04 40034.0 11491.0 17172.764878 2019-12-05 40142.0 11546.0 17191.341535 2019-12-06 40298.0 11560.0 17321.587963 2019-12-07 NaN NaN NaN 2019-12-08 NaN NaN NaN 2019-12-09 40376.0 11618.0 17253.762002 2019-12-10 40471.0 11609.0 17264.048064 2019-12-11 40279.0 11569.0 17292.411092 2019-12-12 40305.0 11555.0 17509.390944 2019-12-13 40589.0 11739.0 17539.878337 2019-12-14 NaN NaN NaN 2019-12-15 NaN NaN NaN 2019-12-16 40626.0 11717.0 17702.110886 2019-12-17 40832.0 11787.0 17702.180623 2019-12-18 40637.0 11727.0 17729.213182 2019-12-19 40647.0 11712.0 17751.370588 2019-12-20 40822.0 11691.0 17870.415265 2019-12-21 NaN NaN NaN 2019-12-22 NaN NaN NaN 2019-12-23 40687.0 11667.0 17874.762685 2019-12-24 40827.0 11658.0 17875.433019 2019-12-25 40759.0 11612.0 NaN 2019-12-26 40979.0 11678.0 NaN 2019-12-27 41160.0 11709.0 17956.915419 2019-12-28 NaN NaN NaN 2019-12-29 NaN NaN NaN 2019-12-30 40951.0 11629.0 17774.655018 [363 rows x 3 columns]