なんでやるの
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()
で変換しな。」
って書いてあるんでやってみた結果。
なんか思ってたのと違う。
こっから色々やれば行けそうな気もするけど面倒なのでPanelのItemsとIndexのDateをMuliti-Indexとして持つDataFrameを作ってくれる関数を自作します。
今回変換するもの
株のデータになります。(別に株のデータじゃなくてもindexが時系列のPanelなら何でも使える筈。)
始値・終値・高値・低値・出来高の5個のItems、時系列のMajor_axis、銘柄のMinor_axisといった形です。
具体的には以下の画像のよう
このPanelを
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に変換します。
(ご自由に改造したり、お使い下さい)
(中略...)
実際の中身は権利関係上伏せています。
廃止される前にpickle等にしているPanelデータは変換しておきましょう。ではでは。
データの抽出(おまけ)
終値close_price_adj
のDataFrameだけ抽出したい場合
df_cp = mi_all.xs('close_price_adj', level = 'val')
具体的に2013-01-07
のclose_price_adj
を抽出したい場合
mi_all.xs(['close_price_adj', '2013-01-07'], level = ['val', 'date'])
指定期間のclose_price_adj
とclose_price_adj
を抽出したい場合
mi_all.loc[(['close_price_adj', 'open_price_adj'], ['{指定期間のlist}']), :]
# Sliceでもうちょい上手くかけそう。。。
これに関してはどなたか教えていただけると。。。
追記:辞書から直接作成する
そもそもvaluesがDataframeの辞書が準備できているのであれば
multi_index = pd.concat(dict.values(), keys=dict.keys())
これで良い。関数いらね。