【发布时间】:2018-05-08 22:06:52
【问题描述】:
假设我有以下数据框
import pandas as pd
df = pd.DataFrame({ 'distance':[2.0, 3.0, 1.0, 4.0],
'velocity':[10.0, 20.0, 5.0, 40.0] })
给出数据框
distance velocity
0 2.0 10.0
1 3.0 20.0
2 1.0 5.0
3 4.0 40.0
如何计算速度列的平均值与距离列的滚动总和?在上面的示例中,创建最后 N 行的滚动总和以获得最小累积距离 5,然后计算这些行的平均速度。
我的目标输出将是这样的:
distance velocity rv
0 2.0 10.0 NaN
1 3.0 20.0 15.0
2 1.0 5.0 11.7
3 4.0 40.0 22.5
在哪里
15.0 = (10+20)/2 (2 because 3 + 2 >= 5)
11.7 = (10 + 20 + 5)/3 (3 because 1 + 3 + 2 >= 5)
22.5 = (5 + 40)/2 (2 because 4 + 1 >= 5)
更新:在 Pandas 中,我的代码应该从我的当前记录中找到反向累积距离总和的索引(例如 5 或更大),然后使用该索引计算移动平均线的起点。
【问题讨论】:
-
距离总是整数和正数吗?
-
距离和速度总是正数但不是整数。我更新了问题。谢谢
-
这个问题真的很难理解,我编辑希望使用@fuglede 的答案来解释更清楚。希望我的编辑使这一点更加清晰,当然您可以根据需要进一步编辑。
-
就问题而言,很难(也许不可能?)矢量化。如果@fuglede 的答案足够快,我会使用它。如果不是,您可以将他的函数转换为 numpy 或 numba 函数。将其转换为 numba 函数可能是最好的方法,因为它可以快速、可读且易于实现(而且它可能只是最快的方式)
-
矢量化变得困难,特别是由于窗口可能变得任意大。如果距离是整数且为正的,我们可以假设窗口的大小始终最多为 5,此时预先计算可以提供一个可以通过的解决方案。无论如何,在@JohnE 的评论之后,我在下面的答案中添加了一些 numba 如何有效解决问题的示例。
标签: python pandas dataframe time-series moving-average