有没有办法计算 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
在 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