有没有办法计算 pandas 中的滚动平均值并排除 max/min 值?

Is there a way to calculate a rolling average in pandas and exclude the max/min values?

在 python 中,我正在尝试计算解魔方时使用的“5 的平均值”或“12 的平均值”统计数据。

对于Average of 5或Ao5,将最近5次求解时间中最快和最慢时间去掉,计算剩余3次求解时间的平均值。

例如如果我的最后 5 次是 30、10、20、40、80 - 10 和 80 将被排除并且平均值将从 30、20 和 40 的剩余 3 次计算得出 Ao5 为 30.

有没有办法在 pandas 中执行此操作并排除最大和最小的数字(或离群值)?我尝试了多种方法都没有成功。如果滚动平均值可以排除异常值,那将是完美的。

一些要使用的示例数据:

df = pd.DataFrame({'time': {0: 232.74, 1: 157.80, 2: 215.55, 3: 86.91, 4: 187.15, 5: 192.56},
                   'turns': {0: 212, 1: 168, 2: 94, 3: 127, 4: 125, 5: 160}})
df

我正在尝试创建一个 Ao5 列来存储此统计信息。

在最后一行的 Ao5 列中,我希望看到最后 5 个数字的平均值,不包括最大和最小数字,因此平均值为 157.80、187.15、192.56(因为 215.55 和 86.91 被排除在外) .

在倒数第二行的 Ao5 列中,我希望看到最后 5 个数字的平均值,不包括最大和最小数字,因此 157.80、215.55、187.15 的平均值(因为 232.74 和 86.91 被排除在外) ).

你可以试试这个:

def mean_clipped(data):
    to_calc = data.sort_values()[1:-1]
    return np.mean(to_calc)

df.rolling(5).apply(mean_clipped)

它使用滚动 window,然后应用自定义聚合函数。在这种情况下,它对 window 中的值进行排序,然后删除第一个和最后一个,然后找到平均值。

输出:

         time       turns
0         NaN         NaN
1         NaN         NaN
2         NaN         NaN
3         NaN         NaN
4  186.833333  140.000000
5  179.170000  137.333333