pandasのパネルのお勉強

2015-10-04

旧ブログ

t f B! P L

前の関連記事:numpyの多次元配列の「軸を入れ換える」ということについての学習


Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理のp176「5.6.2パネル」がよくわからなかったのでJupyter Notebookで確認したメモ。

pandasのパネルは3次元のデータフレームに相当するらしい


pandasのデータフレームのp169「5.5階層型インデックス」(MultiIndex)を使うと2次元の表だけでなんとかなるそうですが、p176「5.6.2パネル」(pandas.Panel)という3次元のデータフレームに相当するものの例が紹介されていました。
まずpandas.io.dataGoogle Financeからサンプルデータを得てそれをパネルに収納します。
In [44]:
import pandas as pd
import pandas.io.data as web
In [45]:
pdata=pd.Panel(dict((stk, web.get_data_google(stk, '2015/1/1','2015/6/1')) for stk in ['AAPL','GOOG','MSFT']))
これでアメリカ(ニューヨーク?)証券市場のアップル社、GooGle社、マイクロソフト社の証券コードを使って2015年1月1日から2015年6月1日までの株価のデータを取得できます。
本にある例のget_data_yahooをget_data_googleに変更しています。
Google Financeでは「TYO:証券コード」で検索するとSony Corpという感じで東京証券市場の株価の履歴も得られるので、東証の株価が取得できると期待したのですが期待はずれでした。
アメリカ市場のGoogle Incと違ってcsvファイルが提供されておらず、output=csvオプションでエラーが出るので東京市場の株価の取得はできません。
これははきっと東証が有料で株価データを提供している関係でcsvの公開ができないのだと推測します。
pandas.Panelクラスの引数で証券コードをキーとしてCSVデータを値にした辞書を引数にしてパネルをインスタンス化しています。
In [46]:
pdata
Out[46]:
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 103 (major_axis) x 5 (minor_axis)
Items axis: AAPL to MSFT
Major_axis axis: 2015-01-02 00:00:00 to 2015-06-01 00:00:00
Minor_axis axis: Open to Volume
3x103x5の形状のパネルpdataができました。
itemの3つはpandas.Panelクラスの引数の辞書のキーにした証券コードの'AAPL','GOOG','MSFT'です。
103個あるmajor軸はCSVの2行目以降の2列目から「日付」が入っていました。
5個のminor軸はCSの2列目以降の2行目から「始値」「高値」「安値」「終値」「出来高」が入っていました。
pdataに取得したアップル社の株価の履歴をみてみましょう。
In [47]:
pdata['AAPL']
Out[47]:
Open High Low Close Volume
Date
2015-01-02 111.39 111.44 107.35 109.33 53204626
2015-01-05 108.29 108.65 105.41 106.25 64285491
... ... ... ... ... ...
2015-05-28 131.86 131.95 131.10 131.78 30733309
2015-05-29 131.23 131.45 129.90 130.28 50884452
2015-06-01 130.28 131.39 130.05 130.54 32112797
103 rows × 5 columns
In [48]:
pdata=pdata.swapaxes('items','minor')
本の例ではここで軸交換しています。
軸交換は視覚的に表現が難しいですがnumpyの多次元配列の「軸を入れ換える」ということについての学習と同様に${value}_{(items,major,minor)}$が${value}_{(minor,major,items)}$と$value$(ここでは株価と出来高)の添字が変わるだけ、と考えればよいと思います。
添字が変わるとどうのようなデータ構成になるかはpandasが考えてくれます。
In [49]:
pdata
Out[49]:
<class 'pandas.core.panel.Panel'>
Dimensions: 5 (items) x 103 (major_axis) x 3 (minor_axis)
Items axis: Open to Volume
Major_axis axis: 2015-01-02 00:00:00 to 2015-06-01 00:00:00
Minor_axis axis: AAPL to MSFT
itemsとminor_axisが入れ替わったので3x103x5の形状だったパネルが、5x103x3に変化しています。
itemsのClose(終値)でpdataをみると各社の終値の時系列が得られます。
In [50]:
pdata['Close']
Out[50]:
AAPL GOOG MSFT
Date
2015-01-02 109.33 524.81 46.76
2015-01-05 106.25 513.87 46.32
... ... ... ...
2015-05-28 131.78 539.78 47.45
2015-05-29 130.28 532.11 46.86
2015-06-01 130.54 533.99 47.23
103 rows × 3 columns
ix属性で一部のインデックスのデータを指定して他のデータを抽出できます。
この機能を使えばさっきの軸交換をしなくてもpdata.ix[:,:,"Close"]で同じ結果を得られます。
In [51]:
pdata.ix[:,'2015/5/28',:]
Out[51]:
Open High Low Close Volume
AAPL 131.86 131.95 131.10 131.78 30733309
GOOG 538.01 540.61 536.25 539.78 1029849
MSFT 47.50 48.02 47.39 47.45 19283666
これでmajor_axisが'2015/5/28'であるデータが抽出されそれに合わせてインデックスが表示されています。
連続したデータを取り出して表示するにはto_frame()メソッドでデータフレームに変換して表示します。
In [52]:
pdata.ix[:,'2015/5/28':,:].to_frame()
Out[52]:
Open High Low Close Volume
Date minor
2015-05-28 AAPL 131.86 131.95 131.10 131.78 30733309
GOOG 538.01 540.61 536.25 539.78 1029849
MSFT 47.50 48.02 47.39 47.45 19283666
2015-05-29 AAPL 131.23 131.45 129.90 130.28 50884452
GOOG 537.37 538.63 531.45 532.11 2597407
MSFT 47.43 47.57 46.59 46.86 36519594
2015-06-01 AAPL 130.28 131.39 130.05 130.54 32112797
GOOG 536.79 536.79 529.76 533.99 1904332
MSFT 47.06 47.77 46.62 47.23 28837332
'2015/5/28'から最後の'2015/6/1'までのデータが表示されました。

Outセル中の表は長いため削ってあります。

Google Financeからダウンロードしたcsvファイルの日付は「29-May-15」という形式になっていて、Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理の例の日付の形式は「5/28/2015」で、出力セルの日付は「2015-05-29」というバラバラでしたが問題なく動きました。

わかりにくいので「2015/5/28」で統一しました。

参考にしたサイト


pandas: powerful Python data analysis toolkit — pandas 0.16.2 documentation
pandasの公式マニュアル。詳細すぎるせいなのかなかなかほしい情報にたどりつけません。

Google Finance: Stock market quotes, news, currency conversions & more
東京証券市場の株価もみれますがcsvファイルの提供はされていませんでした。

次の関連記事:numpyの配列のブロードキャスト

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ