5

0.12.0在 Ubuntu 上使用 Pandas 版本13.04。我正在尝试创建一个 5D 面板对象来包含一些按条件拆分的 EEG 数据。

我如何选择构建我的数据:

让我首先展示我对pandas.core.panelnd.creat_nd_panel_factory.

Subject = panelnd.create_nd_panel_factory(
    klass_name='Subject',
    axis_orders=['setsize', 'location', 'vfield', 'channels', 'samples'],
    axis_slices={'labels': 'location',
            'items': 'vfield',
            'major_axis': 'major_axis',
            'minor_axis': 'minor_axis'},
    slicer=pd.Panel4D,
    axis_aliases={'ss': 'setsize',
            'loc': 'location',
            'vf': 'vfield',
            'major': 'major_axis',
            'minor': 'minor_axis'}
    # stat_axis=2  # dafuq is this?
    )

本质上,组织如下:

  • setsize:一个实验条件,可以是12
  • location:实验条件,可以是"same""diff"None
  • vfield:一个实验条件,可以是"lvf"或“ rvf

最后两个轴对应于DataFrameamajor_axisminor_axis。为了清楚起见,它们已重命名:

  • channels:列,EEG 通道(其中 129 个)
  • samples:行,单个样本。 samples可以作为时间轴。

我正在尝试做的事情:

每个实验条件 ( subjectx setsizex locationx vfield) 都存储在它自己的制表符分隔文件中,我正在读取该文件pandas.read_table,获取一个DataFrame对象。我想为每个主题创建一个 5 维面板(即Subject),其中将包含该主题的所有实验条件(即DataFrames)。

首先,我正在为每个 subject/ 构建一个嵌套字典Subject

# ... do some boring stuff to get the text files, etc...
for _, factors in df.iterrows():
    # `factors` is a 4-tuple containing
    #  (subject number, setsize, location, vfield, 
    #  and path to the tab-delimited file).
    sn, ss, loc, vf, path = factors
    eeg = pd.read_table(path, sep='\t', names=range(1, 129) + ['ref'], header=None)

    # build nested dict
    subjects.setdefault(sn, {}).setdefault(ss, {}).setdefault(loc, {})[vf] = eeg

# and now attempt to build `Subject`
for sn, d in subjects.iteritems():
    subjects[sn] = Subject(d)

完整的堆栈跟踪

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-2-831fa603ca8f> in <module>()
----> 1 import_data()

/home/louist/Dropbox/Research/VSTM/scripts/vstmlib.py in import_data()
     64 
     65     import ipdb; ipdb.set_trace()
---> 66     for sn, d in subjects.iteritems():
     67         subjects[sn] = Subject(d)
     68 

/usr/local/lib/python2.7/dist-packages/pandas/core/panelnd.pyc in __init__(self, *args, **kwargs)
     65         if 'dtype' not in kwargs:
     66             kwargs['dtype'] = None
---> 67         self._init_data(*args, **kwargs)
     68     klass.__init__ = __init__
     69 

/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in _init_data(self, data, copy, dtype, **kwargs)
    250             mgr = data
    251         elif isinstance(data, dict):
--> 252             mgr = self._init_dict(data, passed_axes, dtype=dtype)
    253             copy = False
    254             dtype = None

/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in _init_dict(self, data, axes, dtype)
    293         raxes = [self._extract_axis(self, data, axis=i)
    294                  if a is None else a for i, a in enumerate(axes)]
--> 295         raxes_sm = self._extract_axes_for_slice(self, raxes)
    296 
    297         # shallow copy

/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in _extract_axes_for_slice(self, axes)
   1477         """ return the slice dictionary for these axes """
   1478         return dict([(self._AXIS_SLICEMAP[i], a) for i, a
-> 1479                      in zip(self._AXIS_ORDERS[self._AXIS_LEN - len(axes):], axes)])
   1480 
   1481     @staticmethod

KeyError: 'location'

我知道这panelnd是一个实验性功能,但我相当肯定我做错了什么。有人可以指出我正确的方向吗?如果它一个错误,有什么可以解决的吗?

像往常一样,提前非常感谢您!

4

1 回答 1

3

工作示例。您需要通过切片指定轴到内部轴名称的映射。这与内部结构有关,但 pandas 的固定名称仍然存在(并且通过 Panel/Panel4D 进行了一些硬编码),因此您需要提供映射。

我将首先创建一个 Panel4D,然后是您的主题,如下所示。

如果您发现更多错误,请在 github/此处发布。这不是一个大量使用的功能。

输出

<class 'pandas.core.panelnd.Subject'>
Dimensions: 3 (setsize) x 1 (location) x 1 (vfield) x 10 (channels) x 2 (samples)
Setsize axis: level0_0 to level0_2
Location axis: level1_0 to level1_0
Vfield axis: level2_0 to level2_0
Channels axis: level3_0 to level3_9
Samples axis: level4_1 to level4_2

代码

import pandas as pd
import numpy as np
from pandas.core import panelnd

Subject = panelnd.create_nd_panel_factory(
    klass_name='Subject',
    axis_orders=['setsize', 'location', 'vfield', 'channels', 'samples'],
    axis_slices={'location' : 'labels',
                 'vfield' : 'items',
                 'channels' : 'major_axis',
                 'samples': 'minor_axis'},
    slicer=pd.Panel4D,
    axis_aliases={'ss': 'setsize',
                  'loc': 'labels',
                  'vf': 'items',
                  'major': 'major_axis',
                  'minor': 'minor_axis'})


subjects = dict()
for i in range(3):
    eeg = pd.DataFrame(np.random.randn(10,2),columns=['level4_1','level4_2'],index=[ "level3_%s" % x for x in range(10)])

    loc, vf = ('level1_0','level2_0')
    subjects["level0_%s" % i] = pd.Panel4D({ loc : { vf : eeg }})

print Subject(subjects)
于 2013-09-11T19:20:06.327 回答