熊猫和表示变长时间序列的最佳方法

时间:2014-09-22 00:35:51

标签: python sorting pandas time-series multi-index

这是场景。假设我有来自视觉心理物理学实验的数据,其中受试者指示嘈杂视觉刺激中的净运动方向是左侧还是右侧。这里的原子单位是单次试验,典型的每日试验可能有1000到2000次试验。每个试验都有各种参数:试验的难度,刺激物放置在计算机监视器上的位置,运动速度,受试者距离显示器的距离,受试者是否正确回答等等。现在,让我们假设每个试验对每个参数只有一个值(例如,每个试验只有一个运动速度等)。到目前为止,这么简单:试用ID是索引,不同的参数对应于列。

这是皱纹。每次试验也都是相关的可变长度时间序列。例如,每个试验将具有以1kHz采样的眼动数据(因此我们得到采集时间,该时间点的x数据和该时间点的y数据)。由于每个试验的总持续时间不同,这些时间序列的长度因试验而异。

那么......在pandas DataFrame中表示此类数据的最佳方法是什么?这是大熊猫甚至可以应对的事情吗?我应该去多个DataFrames,一个用于单值参数,一个用于时间序列,如参数?

我考虑采用MultiIndex方法,其中0级对应于试验编号,1级对应于连续数据采集的时间。然后,我需要做的就是重复单值列以匹配该试验中时间序列的长度。但我马上预见到了2个问题。首先,单值列的数量足够大,如果不是不切实际的话,延伸它们中的每一个以匹配时间序列的长度似乎是非常浪费的。其次,更重要的是,如果我想进行基本的分组式分析(例如,在给定的难度级别获得正确答案的比例),这将产生偏差(不正确)的结果,因为每个试验是正确还是错误将重复为根据试验的时间序列长度(与试验中的平均值计算无关),其长度必须多次匹配。

我希望我的问题有道理并感谢您的建议。

1 个答案:

答案 0 :(得分:0)

我也刚刚处理过这类问题。我有一堆我记录的动作捕捉数据,包含几个动作捕捉标记的x-y和z位置,时间间隔为10ms,但每个也有一些单值字段试验(例如,受试者正在做的任务)。

我一直在使用这个项目作为学习pandas的动力,所以我当然不会这么做,而且很流利。"还有它。但我发现能够将每个试验的数据帧连接成一个更大的框架(例如,一个主题)非常方便:

subject_df = pd.concat(
    [pd.read_csv(t) for t in subject_trials],
    keys=[i for i, _ in enumerate(subject_trials)])

无论如何,我关于如何将单值试用数据与连续时间记录相结合的建议是在您的时间记录的整个索引中复制单值列,就像您在问题结束时提到的那样。

通过这种方式对数据进行非规范化,您唯一丢失的是您的数据将消耗更多内存;但是,如果你有足够的内存,我认为它的好处是值得的,因为那样你就可以按照每个试验的值对数据的各个时间帧进行分组。这对于堆叠数据框尤其有用!

至于删除重复项目,例如试验结果分析,这样做非常简单:

df.outcome.unique()

假设您的数据框有"结果"列。