pandas-datareaderで株価や人口のデータを取得

概要

pandas-datareaderを使うと、Web上の様々なソースに簡単にアクセスし、pandasDataFrameの形でデータを取得できる。

以前はpandas.ioという名前でpandasの一部として提供されていたが、今はpandas-datareaderとして独立している。

インストール

pipでインストールできる。

1
$ pip install pandas-datareader

データソース

以下のソースがサポートされている。

  • Yahoo! Finance
  • Google Finance
  • FRED
  • Fama/French
  • World Bank
  • OECD
  • Eurostat
  • EDGAR Index

株価(Yahoo! Finance)

Yahoo! Financeからソニー(SNE)の株価情報を取得してみる。なお、米Yahooからのデータなので、ニューヨーク証券取引所(NYSE)での株価で単位はドルとなる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2015, 12, 31)
f = web.DataReader('SNE', 'yahoo', start, end)
print(f)
'''
Open High Low Close Volume Adj Close
Date
2010-01-04 29.520000 30.180000 29.500000 30.020000 988800 30.020000
2010-01-05 29.719999 29.930000 29.500000 29.879999 567800 29.879999
2010-01-06 29.879999 29.950001 29.660000 29.850000 468200 29.850000
2010-01-07 29.740000 29.870001 29.590000 29.799999 645300 29.799999
2010-01-08 30.040001 30.469999 29.930000 30.410000 574100 30.410000
... ... ... ... ... ... ...
2015-12-24 24.580000 24.780001 24.570000 24.700001 467400 24.700001
2015-12-28 24.709999 24.790001 24.530001 24.670000 590100 24.670000
2015-12-29 24.860001 24.900000 24.680000 24.830000 657600 24.830000
2015-12-30 24.780001 24.900000 24.700001 24.719999 344900 24.719999
2015-12-31 24.670000 24.770000 24.510000 24.610001 649100 24.610001
[1510 rows x 6 columns]
'''

web.DataReader(name, data_source, start, end)の引数は以下のとおり。

  • name : データセットの名前。ティッカーシンボルを指定。strまたはlist
    • GOOG, AAPL, MSFTなど。
    • 日経平均(^N225)やダウ平均(^DJI)も。
  • data_source : データソースの名前。
    • Google Financeからデータを取得したい場合は'google'とする。
  • start : 取得したい期間の開始日時、datetime型で指定。
  • end : 取得したい期間の終了日時、datetime型で指定。

Yahoo! Financeの場合、取得できるデータは6項目。

複数のデータを同時に取得

ティッカーシンボルを指定するnameはリストも可能。ソニーとアップルの値を同時に取得してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
f = web.DataReader(['SNE', 'AAPL'], 'yahoo', start, end)
print(f['Adj Close'])
'''
AAPL SNE
Date
2010-01-04 28.313195 30.020000
2010-01-05 28.362145 29.879999
2010-01-06 27.911008 29.850000
2010-01-07 27.859412 29.799999
2010-01-08 28.044630 30.410000
... ... ...
2015-12-24 107.446965 24.700001
2015-12-28 106.243496 24.670000
2015-12-29 108.153132 24.830000
2015-12-30 106.740798 24.719999
2015-12-31 104.691918 24.610001
'''

なお、nameをリストにすると、取得できるのはpandas.DataFrameではなく、三次元構造のpandas.Panel。ここでは'Adj Close'の値を表示させている。

1
2
3
4
5
6
7
8
9
print(f)
'''
<class 'pandas.core.panel.Panel'>
Dimensions: 6 (items) x 1510 (major_axis) x 2 (minor_axis)
Items axis: Open to Adj Close
Major_axis axis: 2010-01-04 00:00:00 to 2015-12-31 00:00:00
Minor_axis axis: AAPL to SNE
'''

プロット

プロットするのも簡単。比較のため最初の値で規格化している。

1
2
3
4
5
6
7
8
9
10
11
12
import pandas_datareader.data as web
import datetime
import matplotlib.pyplot as plt
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2015, 12, 31)
f = web.DataReader(['SNE', 'AAPL'], 'yahoo', start, end)
f['Adj Close']['SNE'] /= f['Adj Close']['SNE'][0]
f['Adj Close']['AAPL'] /= f['Adj Close']['AAPL'][0]
f['Adj Close'].plot(title='SNE vs AAPL', grid=True)
plt.show()

datareader-yahoo

人口、GDPなど(World Bank)

世界銀行が公開している人口、GDP、出生率などのマクロデータにアクセスできる。

日本とアメリカの人口を取得してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pandas_datareader import wb
f = wb.download(indicator='SP.POP.TOTL', country=['JP', 'US'],
start=1960, end=2014)
print(f)
'''
SP.POP.TOTL
country year
Japan 2014 127131800
2013 127338621
2012 127561489
2011 127817277
2010 128070000
... ...
United States 2014 318857056
2013 316497531
2012 314112078
2011 311721632
2010 309347057
... ...
'''

wb.download(indicator, country, start, end)の引数は以下のとおり。

  • indicator : データのID。後述。
  • country : 国名。strまたはlist
    • ISO 3166-1で定められた、2文字または3文字の国名コード。
  • start : 取得したい期間の開始年。int
  • end : 取得したい期間の終了年。int

indicator

indicatorで指定するIDは世界銀行のサイトで検索するか、wb.search()を使う。はじめのうちは世界銀行のサイトで検索するほうが取っ付きやすいと思う。

世界銀行のサイトで検索

世界銀行のサイトで検索する場合、

で検索できる。検索窓から飛んだ先の個別ページURLの末尾がIDとなる。

例えば、CO2排出量の場合、検索窓に「CO2」と入力するといくつか候補が挙げられるので、「CO2 emissions (kt)」を選んで「Go」をクリックすると、個別ページが表示される。IDは個別ページのURL(http://data.worldbank.org/indicator/EN.ATM.CO2E.KT)の末尾、’EN.ATM.CO2E.KT’となる。

主要な指標は「Indicators | Data」の下の方に列挙されているので、そこから選んでもよい。

wb.search()

wb.search()を使うとPython上でIDを検索できる。

例えば、per capita(一人あたり)、constant dollarsのGDPのIDを知りたい場合、引数に正規表現の文字列'gdp.*capita.*const'を入れる。

idと名前(簡単な説明)が表示されるので、所望のIDを選ぶ。

1
2
3
4
5
6
7
8
9
10
11
from pandas_datareader import wb
print(wb.search('gdp.*capita.*const').iloc[:,:2])
'''
id name
686 6.0.GDPpc_constant GDP per capita, PPP (constant 2011 internation...
7461 NY.GDP.PCAP.KD GDP per capita (constant 2005 US$)
7463 NY.GDP.PCAP.KN GDP per capita (constant LCU)
7465 NY.GDP.PCAP.PP.KD GDP per capita, PPP (constant 2011 internation...
'''

慣れないうちはちょっと難しい。

階層型インデックスの取り扱い

上の例で挙げたように、wb.download()で取得できるデータは階層型のインデックスとなっている。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'''
SP.POP.TOTL
country year
Japan 2014 127131800
2013 127338621
2012 127561489
2011 127817277
2010 128070000
... ...
United States 2014 318857056
2013 316497531
2012 314112078
2011 311721632
2010 309347057
... ...
'''

グラフにプロットしたい場合などはこのままだと使いにくいので、unstack()を使い行から列へピボットする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from pandas_datareader import wb
import matplotlib.pyplot as plt
f = wb.download(indicator='SP.POP.TOTL', country=['JP', 'US'],
start=1960, end=2014)
f2 = f.unstack(level=0)
print(f2)
'''
SP.POP.TOTL
country Japan United States
year
1960 92500572 180671000
1961 94943000 183691000
1962 95832000 186538000
1963 96812000 189242000
1964 97826000 191889000
1965 98883000 194303000
... ...
2010 128070000 309347057
2011 127817277 311721632
2012 127561489 314112078
2013 127338621 316497531
2014 127131800 318857056
'''

'SP.POP.TOTL'が邪魔なので、columnsをリネームしてプロットする。

1
2
3
f2.columns = ['Japan', 'United States']
f2.plot(grid=True)
plt.show()

datareader-wb

スポンサーリンク

関連記事