【问题标题】:Pandas and the best method for representing variable-length time-seriesPandas 和表示可变长度时间序列的最佳方法
【发布时间】:2014-11-15 21:35:00
【问题描述】:

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

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

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

我考虑采用 MultiIndex 方法,其中 0 级对应于试验编号,1 级对应于连续数据采集的时间。然后我需要做的就是重复单值列以匹配该试验中时间序列的长度。但我立即预见到两个问题。首先,单值列的数量足够大,以至于扩展它们以匹配时间序列的长度似乎非常浪费,如果不是不切实际的话。其次,更重要的是,如果我想做基本的 groupby 类型的分析(例如,在给定的难度级别获得正确响应的比例),这将给出有偏差(不正确)的结果,因为每次试验是正确还是错误都会重复为需要多次使其长度与该试验的时间序列长度相匹配(这与试验平均值的计算无关)。

我希望我的问题有意义,并感谢您的建议。

【问题讨论】:

  • 我投票结束,因为我对 StackOverflow 来说这不是一个好问题,它太大了......
  • ...也就是说,我目前正在处理类似的数据(也在心理学中,也使用眼动追踪)。我将所有单值试验信息保存在一个数据框中,将所有带时间戳的眼动追踪数据保存在另一个数据框中,按时间索引。在分析眼睛数据时,对于每个试验,我都会抓取眼睛数据的相关部分(如果数据按时间戳索引,这可以像 eyedata[trial_start_time:trial_end_time] 一样简单)并计算该试验的相关变量,例如AoI 中的时间。希望能有所帮助。
  • 投票保持开放。仅仅因为一个问题很难并且您不知道答案,就没有任何理由关闭它。这完全是on-topic。我和另一个人也想知道这个问题的答案。
  • 我不明白你的第二个问题:做 groupby 会产生有偏见的结果,因为结果会重复/扩展到 pad。但如果这是一个问题,您可以将其存储在单独的表中并进行 SQL 连接。
  • 我不明白你的第二个问题:做 groupby 会产生有偏见的结果,因为结果会重复/扩展到 pad。 (你的意思是你只存储一次结果,在时间序列的末尾?)无论如何,如果这是一个问题,你可以将结果存储在一个单独的表中并进行 SQL 连接。或者,您可以在填充结果列后用 NA 回填除最后一行之外的所有位置。

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


【解决方案1】:

我也一直在处理这类问题。我记录了一堆运动捕捉数据,其中包含几个运动捕捉标记的 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()

假设您的数据框有一个“结果”列。

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 2019-10-11
    • 1970-01-01
    • 2011-08-10
    • 2011-12-11
    • 2021-12-12
    • 2010-09-21
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多