用Python计算滚动(又称移动窗口)修剪平均值的最有效方法是什么?
例如,对于50K行和窗口大小为50的数据集,对于每行我需要取最后50行,删除顶部和底部3个值(窗口大小的5%,向上舍入),并获取其余44个值的平均值.
目前我正在为每一行切片以获取窗口,对窗口进行排序然后切片以修剪它.它运作缓慢,但必须有一个更有效的方式.
例
[10,12,8,13,7,18,19,9,15,14] # data used for example, in real its a 50k lines df
Run Code Online (Sandbox Code Playgroud)
窗口大小为5.对于每一行,我们查看最后5行,对它们进行排序并丢弃1个顶部和1个底部行(5%的5 = 0.25,向上舍入为1).然后我们平均剩下的中间行.
生成此示例的代码设置为DataFrame
pd.DataFrame({
'value': [10, 12, 8, 13, 7, 18, 19, 9, 15, 14],
'window_of_last_5_values': [
np.NaN, np.NaN, np.NaN, np.NaN, '10,12,8,13,7', '12,8,13,7,18',
'8,13,7,18,19', '13,7,18,19,9', '7,18,19,9,15', '18,19,9,15,14'
],
'values that are counting for average': [
np.NaN, np.NaN, np.NaN, np.NaN, '10,12,8', '12,8,13', '8,13,18',
'13,18,9', '18,9,15', '18,15,14'
],
'result': [
np.NaN, np.NaN, np.NaN, np.NaN, 10.0, 11.0, 13.0, 13.333333333333334,
14.0, 15.666666666666666
]
})
Run Code Online (Sandbox Code Playgroud)
天真实现的示例代码
window_size …Run Code Online (Sandbox Code Playgroud)