2013-06-23 81 views
4

我現在認識到實驗PanelND對象要出色地滿足我的需求,但它似乎我不能將它們保存:可以保存Panel4d和PanelND對象嗎?

p4d = pd.Panel4D(np.random.randn(2, 2, 5, 4), 
    labels=['Label1','Label2'], 
    items=['Item1', 'Item2'], 
    major_axis=pd.date_range('1/1/2000', periods=5), 
    minor_axis=['A', 'B', 'C', 'D']) 
p4d.save('p4d') 
... 
PicklingError: Can't pickle <class 'pandas.core.panelnd.Panel4D'>: attribute lookup pandas.core.panelnd.Panel4D failed 

如果我嘗試將其寫入到一個HDFStore,我得到:

TypeError: cannot properly create the storer for: [_STORER_MAP] [group->/p4d (Group) u'',value-><class 'pandas.core.panelnd.Panel4D'>,table->None,append->False,kwargs->{}] 

除了保存單個DataFrames並將它們拼接在一起,我如何堅持更高維的obects?

編輯:我看到store.append()適用於Panel4D,但save()不適用,store.append()也適用於Panel5D示例。我真的比4D高,所以問題仍然存在。

編輯:更多的信息:

我想創建一個任意尺寸的面板,嵌套循環內橫跨尺寸,然後才能夠切片數據,又隨意,所以我可以處理它(整理,情節,優化)

在(粗糙)代碼:

for a in range(1,10): 
    panel4ddict = {} 
    for b in range(101, 150): 
    paneldict = {} 
     for c in range(500, 501): 
      df = MakeDataFrame(a, b, c) # returns processed df 
      paneldict[c] = df 
     p3d = Panel(paneldict) 
     panel4ddict[b] = p3d 
    p4d = Panel4D(panel4ddict) 
    panel5ddict[a] = p4d 
panel5d = Panel5D(panel5ddict) 

sliced = panel5d[:,3,5:6] 
# and then do some plotting of my sliced DF 
+0

你只能保存一個Panel4D作爲表(追加工程)。舉例說明你正在嘗試做什麼 – Jeff

+0

HDFStorr沒有直接啓用大於4dim,你想存儲什麼,更重要的是你想如何檢索它?例如,你在做什麼樣的查詢? – Jeff

回答

1

這裏是存儲Panel5D的方式。實際上,您將每個Panel 4D作爲商店中的一個獨立組存儲,然後在回讀時進行重構。

請注意,將此存儲爲帶有多級(3個或更多)的DataFrame可能會更好,它實際上包含與Panel5D相同的信息,但展開爲長期。

In [1]: from pandas.core import panelnd, panel4d 
     from pandas.utils import testing as tm 

In [2]: Panel5D = panelnd.create_nd_panel_factory(
    ...:  klass_name='Panel5D', 
    ...:  axis_orders=['cool', 'labels', 'items', 'major_axis', 
    ...:     'minor_axis'], 
    ...:  axis_slices={'labels': 'labels', 'items': 'items', 
    ...:     'major_axis': 'major_axis', 
    ...:     'minor_axis': 'minor_axis'}, 
    ...:  slicer=panel4d.Panel4D, 
    ...:  axis_aliases={'major': 'major_axis', 'minor': 'minor_axis'}, 
    ...:  stat_axis=2) 

In [4]: p4d = panel4d.Panel4D(dict(L1=tm.makePanel(), L2=tm.makePanel())) 

In [5]: p5d = Panel5D(dict(C1 = p4d, C2 = p4d+1)) 

In [6]: p5d 
Out[6]: 
<class 'pandas.core.panelnd.Panel5D'> 
Dimensions: 2 (cool) x 2 (labels) x 3 (items) x 30 (major_axis) x 4 (minor_axis) 
Cool axis: C1 to C2 
Labels axis: L1 to L2 
Items axis: ItemA to ItemC 
Major_axis axis: 2000-01-03 00:00:00 to 2000-02-11 00:00:00 
Minor_axis axis: A to D 

In [7]: store = pd.HDFStore('test.h5',mode='w') 

In [9]: for x in p5d.cool: 
    store.append(x,p5d[x]) 
    ...:  

In [10]: store 
Out[10]: 
<class 'pandas.io.pytables.HDFStore'> 
File path: test.h5 
/C1   wide_table (typ->appendable,nrows->360,ncols->2,indexers->[items,major_axis,minor_axis]) 
/C2   wide_table (typ->appendable,nrows->360,ncols->2,indexers->[items,major_axis,minor_axis]) 

In [11]: store.close() 
+0

謝謝。爲了這個工作,x將是一個字符串,對吧?通用的N-dim解決方案需要建立一個維度的路徑。我的想法是用DataFrame.save()來做到這一點,並使文件名反映維度的組合。 – Tony

+0

x是一個字符串。你的存儲方案取決於你實際做了什麼,例如我建立它的原因是爲了支持附加操作。如果你沒有很多數據,那麼保留多索引數據幀可能更容易。 – Jeff

+0

謝謝。我期待着「本土」的堅持或酸洗,但與此同時,這種變化將適合。 – Tony

相關問題