【问题标题】:Resample and reshape pandas dataframe using a trigger使用触发器重新采样和重塑 pandas 数据帧
【发布时间】:2018-01-28 18:52:20
【问题描述】:

我有一个包含多个数据通道和一个触发通道的数据帧。触发通道为 0 或 1。事件发生时为 1。

我想检测事件的开始 (trigger == 1) 并在数据帧中采样数据通道,这样我只能在事件触发后获得指定的时间量。

举个具体的例子,考虑一下:

import numpy as np
import pandas as pd

np.random.seed(0)

# time in seconds
t = np.arange(10)*0.1

# data channels and trigger
d = dict(y=np.random.randn(10),
         z=np.random.randn(10),
         trigger=[0, 1, 0, 0, 0, 1, 0, 0, 0, 0])
df = pd.DataFrame(d, index=t)

所以df 是:

     trigger         y         z
0.0        0  1.764052  0.144044
0.1        1  0.400157  1.454274
0.2        0  0.978738  0.761038
0.3        0  2.240893  0.121675
0.4        0  1.867558  0.443863
0.5        1 -0.977278  0.333674
0.6        0  0.950088  1.494079
0.7        0 -0.151357 -0.205158
0.8        0 -0.103219  0.313068
0.9        0  0.410599 -0.854096

假设我有 0.2 秒的时间窗口。然后,当触发器在时间 0.1 秒和时间 0.5 秒时为 1 时,我想在此触发器之后在 0.2 的时间窗口中提取 y 和 z 并将它们放入具有维度的 numpy 3D 数组(事件数,样本时间窗口,通道数)。

在此示例中,两个触发事件、0.2 秒时间窗口内的 3 个样本和 2 个通道 (y,z) 的维度将为 (2, 3, 2)。

pandas 中是否有有效的方法来执行此操作?我现在能想到的唯一方法是循环 trigger == 1 事件。

【问题讨论】:

  • 时间戳是否总是像您的示例一样均匀分布?
  • 是的,这可以假设为真的。

标签: python pandas numpy


【解决方案1】:

提取设置触发器的行索引:

idx = np.where(df.trigger)[0]

将该一维数组扩展为一个二维数组,显示所有要采样的索引(这里我们每个触发器使用 3 个样本):

samples = np.arange(3) + idx[:,np.newaxis]

这是一个 2x3 数组:

array([[1, 2, 3],
       [5, 6, 7]])

我们用来得到最终结果的:

out = df[['y', 'z']].values[samples]

这是一个 2x3x2 数组,其中每个触发器的 y 和 z 值乘以每个触发器的样本数。

【讨论】:

  • 哇,这简直太完美了!谢谢!
猜你喜欢
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多