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 36379100

print 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 29910800

print 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 36379100

print 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.213489

print 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 36379100

print 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 29910800

print 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