问题描述
在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列中看到不包括最大和最小数字的最后5个数字的平均值,因此平均值为157.80、187.15、192.56(排除了215.55和86.91)。 / p>
在第二行的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)
它使用滚动窗口,然后应用自定义聚合函数。在这种情况下,它将对窗口中的值进行排序,然后删除第一个和最后一个,然后找到均值。
输出:
time turns
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 186.833333 140.000000
5 179.170000 137.333333