首页 > 解决方案 > 使用条件前向填充正则化随机数据

问题描述

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

数据可能如下所示:

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。

标签: pandaspandas-groupby

解决方案


自然地,经过三天的努力,我在发布后大约十分钟后想出了一个合理的答案。

# 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')

在此处输入图像描述

最后丢弃的样本是不雅的,但对我来说不是问题;我的日志总是以零结尾。不过我很好奇。如果您有一种优雅的方式使初始 ffill() 包含最终样本,请发布。


推荐阅读