可以保存Panel4d和PanelND对象吗?

2024-09-27 20:17:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在意识到实验板和物体会很好地满足我的需要,只是我似乎无法保存它们:

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

如果我试图将其写入hdf存储,我会得到:

^{pr2}$

除了保存单独的数据帧并将它们缝合在一起,我如何持久化更高维的obects?在

编辑:我看到store.append()适用于Panel4D,但save()不适用于Panel5D,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

Tags: incorepandasdfforsaverangepd
1条回答
网友
1楼 · 发布于 2024-09-27 20:17:25

这里有一种存储Panel5D的方法。实际上,您将每个Panel4D作为一个单独的组存储在存储中,然后在读回时重建。在

注意,最好将其存储为具有多个级别(3个或更多个)的数据帧,这些级别实际上包含与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()

相关问题 更多 >

    热门问题