pandas - 使用条件前向填充正则化随机数据
问题描述
我第一次尝试使用 Pandas 0.24 改进的 resampler() 对象。我有一个准随机采样车速的数据框。记录器在移动时的采样周期约为 1 秒 +/- 100 毫秒,在停止时约为 30 秒。
数据可能如下所示:
0 1 2 0 2 5 7 3 0 3 3 3 1 0
我想将数据规范化为 1s 间隔,但不会丢失我的零速间隔。这比我想象的要困难得多,主要是因为我想填充零周期,并将非零周期插入到正则化索引上。
问题:
一般来说,您将如何解决这个由两部分组成的向上填充/插值过程?
是否有旧
resample(how=None)
逻辑的现代模拟,让我在不添加虚假数据的情况下向索引添加正则化时间戳?我是否陷入循环以填充零周期,或者是否有某种 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。
解决方案
自然地,经过三天的努力,我在发布后大约十分钟后想出了一个合理的答案。
# 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() 包含最终样本,请发布。
推荐阅读
- laravel - 如何在 AWS 免费套餐上安装 Laravel?
- python - Django fails at sending e-mail in production but works in develoment
- java - 如何以编程方式(java)使用 p4 类型映射而不是使用终端?
- android - Firebase realtime database - variable name changed
- assembly - ARM Assembly increasing number with push button
- javascript - 通过 Node.js 使用 AJAX 登录 POST 请求
- c# - Xamarin Forms - Android 项目出现错误 Java.Lang.IllegalStateException:“无法使用 NULL 对象制作装饰工具栏”
- r - R在使用带有多个变量的For循环时出现意外的括号
- python - SymPy 无法评估 *变形* 向量的点积
- django - Django 中的 get_list_or_404 和 get_object_or_404 之间的确切区别是什么?