有没有一种方法可以计算熊猫的滚动平均值并排除最大值/最小值?

时间:2020-09-24 22:59:55

标签: python pandas dataframe moving-average rolling-computation

在python中,我试图计算在解决Rubik的多维数据集时使用的“ 5的平均值”或“ 12的平均值”统计信息。

对于平均值5或Ao5,从最近的5个求解时间中删除最快和最慢的时间,并计算剩余3个求解时间的平均值。

例如如果我的最后5次是30、10、20、40、80,则将10和80排除在外,然后从剩余的30、20和40的3次计算平均值,得出Ao5为30。

有没有办法在大熊猫中做到这一点,并排除最大和最小的数字(或离群值)?我已经尝试了多种方法而没有成功。如果可以排除异常值,则滚动平均值将是理想的选择。

一些示例数据可以使用:

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)。 / p>

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

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

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

df.rolling(5).apply(mean_clipped)

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

输出:

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