2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PanelからMultiIndexに変換する(時系列データ)

Last updated at Posted at 2019-07-21

なんでやるの

Pandas Ver0.24.2の時点でPanelにFutureWarningで

/Users/.../IPython/core/interactiveshell.py:3296: FutureWarning: 
Panel is deprecated and will be removed in a future version.
The recommended way to represent these types of 3-dimensional data are with a MultiIndex on a DataFrame, via the Panel.to_frame() method
Alternatively, you can use the xarray package http://xarray.pydata.org/en/stable/.
Pandas provides a `.to_xarray()` method to help automate this conversion.

  exec(code_obj, self.user_global_ns, self.user_ns)

Panelが廃止?される様なので時系列データのPanelのKeyから推奨のMultiIndexに変換するのを試してみました。
もっとうまいやり方がありそうな気がしなくもないのであれば教えていただけると喜びます。

.to_frame() でやってみる

因みにWariningの中に
.to_xarray()とか.to_frame()で変換しな。」
って書いてあるんでやってみた結果。

スクリーンショット 2019-07-21 21.16.30.png

なんか思ってたのと違う。

こっから色々やれば行けそうな気もするけど面倒なのでPanelのItemsとIndexのDateをMuliti-Indexとして持つDataFrameを作ってくれる関数を自作します。

今回変換するもの

株のデータになります。(別に株のデータじゃなくてもindexが時系列のPanelなら何でも使える筈。)
始値・終値・高値・低値・出来高の5個のItems、時系列のMajor_axis、銘柄のMinor_axisといった形です。
具体的には以下の画像のよう
スクリーンショット 2019-07-21 20.18.51.png
このPanelを

convert_to_multi.py
def convert_to_multi(panel_or_dict):
    """convert_to_multi:dictやpanelをPandasのMultiIndexにKeyを元に変換する

  詳細な説明:dictやpanelのkeyを元にPandasのMultiIndexを作成する、panel_or_dictはPanel型かdict型である必要があります。

  Parameters
  ----------
  panel_or_dict : Panel
    MultiIndexに変換したいPanelもしくはDict
  
  Returns
  ----------
  mi_res: MultiIndex
    よくよく考えたらDictはそのままpdでやればいい
    
    
    """
    for num, key in enumerate(panel_or_dict.keys()):
        panel_or_dict[key]['val'] = key
        panel_or_dict[key]['date'] = panel_or_dict[key].index
        if num == 0: # ここいつも納得行かない、forの最初だけ何か行うみたいなのあったら教えてください、、、後述のelseみたいな。
            df_tmp = panel_or_dict[key]
        else:
            df_tmp = pd.concat([df_tmp, panel_or_dict[key]])
    else:
        mi_res = df_tmp.set_index(['val', 'date'])
    return mi_res

この関数にPanelを渡すことで以下の様なMultiIndexに変換します。
(ご自由に改造したり、お使い下さい)
スクリーンショット 2019-07-21 20.24.31.png

(中略...)
スクリーンショット 2019-07-21 20.24.43.png
実際の中身は権利関係上伏せています。
廃止される前にpickle等にしているPanelデータは変換しておきましょう。ではでは。

データの抽出(おまけ)

終値close_price_adjのDataFrameだけ抽出したい場合

.py
df_cp = mi_all.xs('close_price_adj', level = 'val')

具体的に2013-01-07close_price_adjを抽出したい場合

.py
mi_all.xs(['close_price_adj', '2013-01-07'], level = ['val', 'date'])

指定期間のclose_price_adjclose_price_adjを抽出したい場合

.py
mi_all.loc[(['close_price_adj', 'open_price_adj'], ['{指定期間のlist}']), :]
# Sliceでもうちょい上手くかけそう。。。

これに関してはどなたか教えていただけると。。。

追記:辞書から直接作成する

そもそもvaluesがDataframeの辞書が準備できているのであれば

.py
 multi_index = pd.concat(dict.values(), keys=dict.keys())

これで良い。関数いらね。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?