pandasによるStackingとUnstacking
「pandasによるpivot 〜 複数行に渡って重複しているデータを、重複しているデータ毎に集計する」の続き。
pandas.DataFrame.stackを使うと列から行へのpivotができる。
unstackはその逆。
前回使用したコードにstack部分を追加する。
#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) # 株価データ取得 aapl = pdd.DataReader('AAPL', "yahoo", date_from, date_to) msft = pdd.DataReader('MSFT', "yahoo", date_from, date_to) # 「Symbol」という名前の列を追加 aapl.insert(0, 'Symbol', 'AAPL') msft.insert(0, 'Symbol', 'MSFT') # 2つのデータフレームを結合 AAPL_MSFT = pd.concat([msft, aapl]).sort_index() # indexをresetしてDateをカラムデータと認識させる AAPL_MSFT = AAPL_MSFT.reset_index() # pivot集計する adjClose = AAPL_MSFT.pivot( index='Date', columns='Symbol', values='Adj Close' ) print "# 元データ" print "print adjClose" print adjClose # stackを実行する stackedAdjClose = adjClose.stack() print "# stackを実行する" print "print stackedAdjClose" print stackedAdjClose # unstackにより元に戻す unStackedAdjClose = stackedAdjClose.unstack() print "# unstackにより元に戻す" print "print unStackedAdjClose" print unStackedAdjClose
実行結果は次。
# 元データ
print adjClose
Symbol AAPL MSFT
Date
2016-09-26 112.303406 56.518189
2016-09-27 112.512333 57.561143
2016-09-28 113.367940 57.640604
2016-09-29 111.606985 57.014834
2016-09-30 112.472544 57.213489
2016-10-03 111.945245 57.034697
2016-10-04 112.422796 56.855908
2016-10-05 112.472544 57.253222
2016-10-06 113.308249 57.352553
# stackを実行する
print stackedAdjClose
Date Symbol
2016-09-26 AAPL 112.303406
MSFT 56.518189
2016-09-27 AAPL 112.512333
MSFT 57.561143
2016-09-28 AAPL 113.367940
MSFT 57.640604
2016-09-29 AAPL 111.606985
MSFT 57.014834
2016-09-30 AAPL 112.472544
MSFT 57.213489
2016-10-03 AAPL 111.945245
MSFT 57.034697
2016-10-04 AAPL 112.422796
MSFT 56.855908
2016-10-05 AAPL 112.472544
MSFT 57.253222
2016-10-06 AAPL 113.308249
MSFT 57.352553
dtype: float64
# unstackにより元に戻す
print unStackedAdjClose
Symbol AAPL MSFT
Date
2016-09-26 112.303406 56.518189
2016-09-27 112.512333 57.561143
2016-09-28 113.367940 57.640604
2016-09-29 111.606985 57.014834
2016-09-30 112.472544 57.213489
2016-10-03 111.945245 57.034697
2016-10-04 112.422796 56.855908
2016-10-05 112.472544 57.253222
2016-10-06 113.308249 57.352553