数据帧的排序子数组的滚动平均值
给定一个大的多列 Pandas 数据框,我想尽快计算N元素窗口上的滚动“k-mean” 。
这里“k-mean”定义为排除最大和最小元素的N-2k元素的均值。Nkk
例子
给定数据框:
df = pandas.DataFrame(
{'A': [34, 78, -2, -96, 58, -34, 44, -50, 42],
'B': [-82, 28, 96, 46, 36, -34, -20, 10, -40]})
A B
0 34 -82
1 78 28
2 -2 96
3 -96 46
4 58 36
5 -34 -34
6 44 -20
7 -50 10
8 42 -40
随着N=6与k=1预期输出是:
A B
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 14.0 19.0
6 16.5 22.5
7 -10.5 18.0
8 0.5 -2.0
试图
我的代码似乎符合要求:
def k_mean(s: pandas.Series, trim: int) -> float:
assert trim >= 0, f"Trim must not be negative, {trim} provided."
if trim == 0:
return s.mean()
return s.sort_values()[trim:-trim].mean()
df.rolling(window=6, axis=0).apply(k_mean, kwargs={'trim': 1})
我的问题:我的代码是否正确,如果正确,是否有更快的方法来实现相同的结果,尤其是考虑到大型多列数据帧?
也许有一个巧妙的数学技巧可以提供帮助?
如果它有助于加快性能,我并不太关心起始期的处理,要么可以是 NaN 直到N或可以增长到N一旦2k+1元素在窗口中。