pandas.DataFrameの連結
「pandas.DataFrameでのデータ作成・データへのアクセス」の続き。
・株価データの取得
#coding:utf-8 import numpy as np import pandas as pd import datetime import pandas_datareader.data as pdd # 期間設定 date_from = datetime.date(2016, 9, 24) date_to = datetime.date(2016, 10, 6) # 単一銘柄の取得 aapl = pdd.DataReader('AAPL', "yahoo", date_from, date_to) print "AAPL" print aapl msft = pdd.DataReader('MSFT', "yahoo", date_from, date_to) print "MSFT" print msft
以下では、取得したこれらの株価データを扱う。
1.取得した株価データの一部分を取り出す
2016年9月のMSFTと2016年10月のMSFTの株価データを取得。
#### Adjust CloseをDataFrame型として取得する(カラム名をリストとして渡すとDataFrame型として取得される。単に渡すとSeries型となる) msftAdjClose_201609_Df = msft['2016-09'][['Adj Close']] msftAdjClose_201610_Df = msft['2016-10'][['Adj Close']]
2.列方向(縦方向)にDataFrameを連結する
######## 列方向(縦方向)にDataFrameを連結する ######## #### Adjust CloseをDataFrame型として取得する(カラム名をリストとして渡すとDataFrame型として取得される。単に渡すとSeries型となる) msftAdjClose_201609_Df = msft['2016-09'][['Adj Close']] msftAdjClose_201610_Df = msft['2016-10'][['Adj Close']] ## 列方向に2つのDataFrameを連結する(2つのDataFrameをリストにして渡す) msftAdjCloseConcatDf = pd.concat( [ msftAdjClose_201609_Df, msftAdjClose_201610_Df ] ) print msftAdjCloseConcatDf
実行結果は次。
Adj Close
Date
2016-09-26 56.518189
2016-09-27 57.561143
2016-09-28 57.640604
2016-09-29 57.014834
2016-09-30 57.213489
2016-10-03 57.034697
2016-10-04 56.855908
2016-10-05 57.253222
2016-10-06 57.352553
3.銘柄名をキーに指定して連結する
## 銘柄名をキーに指定して連結する tickerList = ['AAPL', 'MSFT'] aaplAdjClose_201609_Df = aapl['2016-09'][['Adj Close']] msftAndApplAdjCloseConcatDf = pd.concat( [ msftAdjClose_201609_Df, aaplAdjClose_201609_Df ], keys=tickerList ) print msftAndApplAdjCloseConcatDf
実行結果は次。
Adj Close
Date
AAPL 2016-09-26 56.518189
2016-09-27 57.561143
2016-09-28 57.640604
2016-09-29 57.014834
2016-09-30 57.213489
MSFT 2016-09-26 112.303406
2016-09-27 112.512333
2016-09-28 113.367940
2016-09-29 111.606985
2016-09-30 112.472544
4.連結したDataFrameから、逆にキー(銘柄名)を指定してデータ(DataFrame型)を取得する
## 逆にキー(銘柄名)を指定してデータ(DataFrame型)を取得する print msftAndApplAdjCloseConcatDf.ix['AAPL']
実行結果は次。
Adj Close
Date
2016-09-26 56.518189
2016-09-27 57.561143
2016-09-28 57.640604
2016-09-29 57.014834
2016-09-30 57.213489
今度は、Adjust Closeだけではなく、Volumeもカラムに持つデータを扱ってみる。
#### Adjust Closeだけでなく、Volumeもカラムとして持つDataFrame型として取得する。 ## 連結対象の2つのDataFrameが同じカラムを持つ場合 aaplAdjCloseVol_201609_Df = aapl['2016-09'][['Adj Close', 'Volume']] msftAdjCloseVol_201609_Df = msft['2016-09'][['Adj Close', 'Volume']] print "print aaplAdjCloseVol_201609_Df" print aaplAdjCloseVol_201609_Df print "" print "print msftAdjCloseVol_201609_Df" print msftAdjCloseVol_201609_Df aaplMsftAdjCloseVol_201609_Df = pd.concat([ aaplAdjCloseVol_201609_Df, msftAdjCloseVol_201609_Df ]) print "" print "print aaplMsftAdjCloseVol_201609_Df" print aaplMsftAdjCloseVol_201609_Df
実行結果は次。
print aaplAdjCloseVol_201609_Df
Adj Close Volume
Date
2016-09-26 112.303406 29869400
2016-09-27 112.512333 24607400
2016-09-28 113.367940 29641100
2016-09-29 111.606985 35887000
2016-09-30 112.472544 36379100print msftAdjCloseVol_201609_Df
Adj Close Volume
Date
2016-09-26 56.518189 21688700
2016-09-27 57.561143 28065100
2016-09-28 57.640604 20536400
2016-09-29 57.014834 25463500
2016-09-30 57.213489 29910800print aaplMsftAdjCloseVol_201609_Df
Adj Close Volume
Date
2016-09-26 112.303406 29869400
2016-09-27 112.512333 24607400
2016-09-28 113.367940 29641100
2016-09-29 111.606985 35887000
2016-09-30 112.472544 36379100
2016-09-26 56.518189 21688700
2016-09-27 57.561143 28065100
2016-09-28 57.640604 20536400
2016-09-29 57.014834 25463500
2016-09-30 57.213489 29910800
5.異なるカラムを持つDataFrameの連結
ところで、これまでは同じカラムを持つDataFrameの連結だったが、異なるカラムを持つ場合も可能。
不足分はNaNで補足される。
## 連結対象の2つのDataFrameが同じカラムを持たない場合(足りないカラムのデータはNaNで補完される) aaplAdjCloseVol_201609_Df = aapl['2016-09'][['Adj Close', 'Volume']] msftAdjCloseVol_201609_Df = msft['2016-09'][['Adj Close' ]] print "print aaplAdjCloseVol_201609_Df" print aaplAdjCloseVol_201609_Df print "" print "print msftAdjCloseVol_201609_Df" print msftAdjCloseVol_201609_Df aaplMsftAdjCloseVol_201609_Df = pd.concat([ aaplAdjCloseVol_201609_Df, msftAdjCloseVol_201609_Df ]) print "" print "print aaplMsftAdjCloseVol_201609_Df" print aaplMsftAdjCloseVol_201609_Df
実行結果は次。
print aaplAdjCloseVol_201609_Df
Adj Close Volume
Date
2016-09-26 112.303406 29869400
2016-09-27 112.512333 24607400
2016-09-28 113.367940 29641100
2016-09-29 111.606985 35887000
2016-09-30 112.472544 36379100print msftAdjCloseVol_201609_Df
Adj Close
Date
2016-09-26 56.518189
2016-09-27 57.561143
2016-09-28 57.640604
2016-09-29 57.014834
2016-09-30 57.213489print aaplMsftAdjCloseVol_201609_Df
Adj Close Volume
Date
2016-09-26 112.303406 29869400.0
2016-09-27 112.512333 24607400.0
2016-09-28 113.367940 29641100.0
2016-09-29 111.606985 35887000.0
2016-09-30 112.472544 36379100.0
2016-09-26 56.518189 NaN
2016-09-27 57.561143 NaN
2016-09-28 57.640604 NaN
2016-09-29 57.014834 NaN
2016-09-30 57.213489 NaN
6.「join='inner'」による共通部分の連結
共通するカラムだけ連結したい場合は、「join='inner'」を指定する。
## 共通するカラムだけ連結する aaplMsftAdjCloseVol_201609_Df = pd.concat( [ aaplAdjCloseVol_201609_Df, msftAdjCloseVol_201609_Df ], join='inner' ) print "" print "print aaplMsftAdjCloseVol_201609_Df" print aaplMsftAdjCloseVol_201609_Df
実行すると次のように、Volume列は連結されない。
print aaplMsftAdjCloseVol_201609_Df
Adj Close
Date
2016-09-26 112.303406
2016-09-27 112.512333
2016-09-28 113.367940
2016-09-29 111.606985
2016-09-30 112.472544
2016-09-26 56.518189
2016-09-27 57.561143
2016-09-28 57.640604
2016-09-29 57.014834
2016-09-30 57.213489
7.横方向の連結
さて、これまでは縦方向の連結だったが、次は横方向の連結を行う。
横方向の連結を行うには「axis=1」を指定する。
######## 行方向(横方向)にDataFrameを連結する ######## aaplAdjCloseVol_201609_Df = aapl['2016-09'][['Adj Close', 'Volume']] msftAdjCloseVol_201609_Df = msft['2016-09'][['Adj Close', 'Volume']] print "" print "print aaplAdjCloseVol_201609_Df" print aaplAdjCloseVol_201609_Df print "" print "print msftAdjCloseVol_201609_Df" print msftAdjCloseVol_201609_Df aaplMsftAdjCloseVol_201609_Df = pd.concat( [ aaplAdjCloseVol_201609_Df, msftAdjCloseVol_201609_Df ], axis=1 ) print "" print "print aaplMsftAdjCloseVol_201609_Df" print aaplMsftAdjCloseVol_201609_Df
次のようになる。
print aaplAdjCloseVol_201609_Df
Adj Close Volume
Date
2016-09-26 112.303406 29869400
2016-09-27 112.512333 24607400
2016-09-28 113.367940 29641100
2016-09-29 111.606985 35887000
2016-09-30 112.472544 36379100print msftAdjCloseVol_201609_Df
Adj Close Volume
Date
2016-09-26 56.518189 21688700
2016-09-27 57.561143 28065100
2016-09-28 57.640604 20536400
2016-09-29 57.014834 25463500
2016-09-30 57.213489 29910800print aaplMsftAdjCloseVol_201609_Df
Adj Close Volume Adj Close Volume
Date
2016-09-26 112.303406 29869400 56.518189 21688700
2016-09-27 112.512333 24607400 57.561143 28065100
2016-09-28 113.367940 29641100 57.640604 20536400
2016-09-29 111.606985 35887000 57.014834 25463500
2016-09-30 112.472544 36379100 57.213489 29910800
連結した要素にそれぞれラベル(キー)を付けるには「keys」を使用する。
aaplMsftAdjCloseVol_201609_Df = pd.concat( [ aaplAdjCloseVol_201609_Df, msftAdjCloseVol_201609_Df ], axis=1, keys=['AAPL','MSFT'] ) print "" print "print aaplMsftAdjCloseVol_201609_Df" print aaplMsftAdjCloseVol_201609_Df
実行結果は次のようになる。
print aaplMsftAdjCloseVol_201609_Df
AAPL MSFT
Adj Close Volume Adj Close Volume
Date
2016-09-26 112.303406 29869400 56.518189 21688700
2016-09-27 112.512333 24607400 57.561143 28065100
2016-09-28 113.367940 29641100 57.640604 20536400
2016-09-29 111.606985 35887000 57.014834 25463500
2016-09-30 112.472544 36379100 57.213489 29910800