我正在尝试计算数组的修剪均值,其中不包括异常值。
我发现有一个名为的模块scipy.stats.tmean
,但它要求用户通过绝对值而不是百分比值指定范围。
在 Matlab 中,我们有m = trimmean(X,percent)
,这正是我想要的。
我们有 Python 中的对应物吗?
我正在尝试计算数组的修剪均值,其中不包括异常值。
我发现有一个名为的模块scipy.stats.tmean
,但它要求用户通过绝对值而不是百分比值指定范围。
在 Matlab 中,我们有m = trimmean(X,percent)
,这正是我想要的。
我们有 Python 中的对应物吗?
至少对于 scipy v0.14.0,有一个专用功能(scipy.stats.trim_mean):
from scipy import stats
m = stats.trim_mean(X, 0.1) # Trim 10% at both ends
里面使用stats.trimboth
的。
从源代码中可以看出,proportiontocut=0.1
平均值将使用 80% 的数据进行计算。注意scipy.stats.trim_mean
不能处理np.nan
。
(编辑:此答案的上下文scipy.stats.trim_mean
尚未记录。现在它是公开可用的,请使用该功能而不是自己滚动。我在下面的答案保留用于历史目的。)
您也可以按照 MatLab 文档中的说明自行实现整个过程。
这是 Python 2 中的代码:
from numpy import mean
def trimmean(arr, percent):
n = len(arr)
k = int(round(n*(float(percent)/100)/2))
return mean(arr[k+1:n-k])
这是使用数学库中的 floor 的手动实现...
def trimMean(tlist,tperc):
removeN = int(math.floor(len(tlist) * tperc / 2))
tlist.sort()
if removeN > 0: tlist = tlist[removeN:-removeN]
return reduce(lambda a,b : a+b, tlist) / float(len(tlist))