使用条件正向填充对随机数据进行正则化

时间:2019-06-12 21:45:26

标签: pandas pandas-groupby

我正在尝试使用Pandas 0.24的经过改进的resampler()对象。我有一个准随机采样车速的数据框。记录器在移动时的采样周期约为1s +/- 100ms,在停止时的采样周期约为30s。

数据可能看起来像这样:

0 1 2 0 2 5 7 3 0 3 3 3 1 0

我想将数据调整为1s间隔,但又不丢失零速间隔。这比我原本想的要难得多,主要是因为我想填充零个周期,然后将非零个周期内插到正则索引上。

问题:

  1. 通常来说,您将如何处理这一由两部分组成的填充/内插过程?

  2. 是否有一个类似于旧resample(how=None)逻辑的现代模拟,可以让我向索引添加规则化的时间戳,而无需添加虚假数据?

  3. 我是不是坚持循环填充零周期,还是有某种apply()魔术可以让我做一个有条件的ffill()?

示例数据:

orig = [0.0,  0.0,  1.5,  2.0,  1.5,  2.0,  1.0,  0.0,  0.0,  3.5]
idx = pd.DatetimeIndex(['2018-12-19 16:50:51+00:00',
               '2018-12-19 16:50:51.400000+00:00',
               '2018-12-19 16:50:57.500000+00:00',
               '2018-12-19 16:50:57.600000+00:00',
               '2018-12-19 16:51:12.500000+00:00',
               '2018-12-19 16:51:16.400000+00:00',
               '2018-12-19 16:51:18.400000+00:00',
               '2018-12-19 16:51:20.400000+00:00',
               '2018-12-19 16:51:22.500000+00:00',
               '2018-12-19 16:51:24.500000+00:00'])
df = pd.DataFrame(orig,index=idx)
df.plot(figsize=(18,4))

请注意,该图显示的是错误的速度提升,该速度以57.5秒结束。速度应该一直为零直到57秒,然后在58秒升至1.5。

1 个答案:

答案 0 :(得分:0)

自然,经过三天的研究,我在发布大约十分钟后就得出了一个合理的答案。

# First create a dummy with the correct index, but containing only the zero periods.
ff = df.asfreq('1s',method='ffill')
dummy1 = ff[ff==0.0]
# Then use 'time' interpolation 
dummy2 = dummy1.combine_first(df).interpolate('time')
# Combine_first adds missing rows from the 2nd dataframe, so resample again
solution = dummy2.asfreq('1s')

enter image description here

最后删除的样本很不雅观,但对我而言不是问题;我的日志总是以零结尾。我很好奇。如果您有一种使初始的ffill()包含最终样本的优雅方法,请发布。