pandas_datareader.dataのDataReaderを使用して株価を取得する 〜 pandas.Panel型で取得したデータ構造からpandas.Panel.minor_xsを使用して特定の銘柄のDataFrameを取得する

これ、以前に「Pythonでの時系列データの扱い7 〜 まとめ(WEBからの株価データ取得、プロット、移動平均の作成)」で同様のことを実施して、yahoo financeやgoogleから株価データを取得した。

実は1つだけ分からないことがあったけど、そのまま放置していた。それは次のこと。

pandas_datareader.data.DataReader()で単一銘柄を取得すると、戻り値がpandas.DataFrameとなる。
しかし、複数銘柄を取得すると、戻り値がpandas.Panelとなる。この時、銘柄名(ticker)を指定して、特定の銘柄データを取得する方法が分からなかった。

今回分かったのでメモしておく。

まずは復習。

◎tickerを1つ指定し、特定の銘柄を1つ取得する
次のように書くと、アップルの株価が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, 1)
date_to = datetime.date(2016, 9, 6)

# 単一銘柄の取得
aapl = pdd.DataReader('AAPL', "yahoo", date_from, date_to)
print "AAPL"
print aapl

実行結果は次のようになる。
※)改行されていることに注意。

AAPL
Open High Low Close Volume \
Date
2016-09-01 106.139999 106.800003 105.620003 106.730003 26701500
2016-09-02 107.699997 108.000000 106.820000 107.730003 26802500
2016-09-06 107.900002 108.300003 107.510002 107.699997 26880400

Adj Close
Date
2016-09-01 106.184827
2016-09-02 107.179719
2016-09-06 107.149865

◎tickerをリストで複数指定し、複数の銘柄を取得する
次のように書くと、アップルとマイクロソフトの株価がpandas.Panel型として取得される。

#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, 1)
date_to = datetime.date(2016, 9, 6)

# 複数銘柄の取得
tickerList = ['AAPL', 'MSFT']
stocksPanel = pdd.DataReader(
    tickerList,
    data_source='yahoo',
    start=date_from,
    end=date_to
)

ここで、取得した複数の銘柄のうち、特定の銘柄(例えば、AAPL)の株価データを取得する方法が分からなかった。
試しに、「stocksPanel['AAPL']」として見るものの、これはキーが存在しないというエラーとなる。

次に、「stocksPanel['Close']」としてみると、これは複数の銘柄の終値が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, 1)
date_to = datetime.date(2016, 9, 6)

# 複数銘柄の取得
tickerList = ['AAPL', 'MSFT']
stocksPanel = pdd.DataReader(
    tickerList,
    data_source='yahoo',
    start=date_from,
    end=date_to
)

# printデバッグ
print stocksPanel['Close']

実行結果は次。

AAPL MSFT
Date
2016-09-01 106.730003 57.590000
2016-09-02 107.730003 57.669998
2016-09-06 107.699997 57.610001

それでは特定の銘柄の株価を取得するにはどうすればよいのか
結論は「pandas.Panel.minor_xs」を使用する。

コードは次の様にする。

#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, 1)
date_to = datetime.date(2016, 9, 6)

# 複数銘柄の取得
tickerList = ['AAPL', 'MSFT']
stocksPanel = pdd.DataReader(
    tickerList,
    data_source='yahoo',
    start=date_from,
    end=date_to
)

# pandas.Panelから単一銘柄の株価を取得する
aaplFromPanel = stocksPanel.minor_xs('AAPL')
print "aaplFromPanel"
print aaplFromPanel

msftFromPanel = stocksPanel.minor_xs('MSFT')
print "msftFromPanel"
print msftFromPanel

実行結果は次の通り。

aaplFromPanel
Open High Low Close Volume \
Date
2016-09-01 106.139999 106.800003 105.620003 106.730003 26701500.0
2016-09-02 107.699997 108.000000 106.820000 107.730003 26802500.0
2016-09-06 107.900002 108.300003 107.510002 107.699997 26880400.0

Adj Close
Date
2016-09-01 106.184827
2016-09-02 107.179719
2016-09-06 107.149865
msftFromPanel
Open High Low Close Volume Adj Close
Date
2016-09-01 57.009998 57.820000 57.009998 57.590000 26075400.0 57.203558
2016-09-02 57.669998 58.189999 57.419998 57.669998 18900500.0 57.283019
2016-09-06 57.779999 57.799999 57.209999 57.610001 16278400.0 57.223424