如何在Numpy中找到IQR?

101

是否有内置于Numpy/Scipy的函数来计算四分位距?我可以很容易地自己实现,但是mean()函数已经存在了,它基本上是sum/len...

def IQR(dist):
    return np.percentile(dist, 75) - np.percentile(dist, 25)

我认为没有相应的函数,你必须像之前一样计算百分位数。 - BrenBarn
3
好的,我会尽力进行翻译。以下是需要翻译的内容:@BrenBarn. There is now...@BrenBarn,现在有了... - Mad Physicist
3个回答

155

np.percentile可以接受多个百分位数参数,并且最好这样做:

q75, q25 = np.percentile(x, [75 ,25])
iqr = q75 - q25
或者
iqr = np.subtract(*np.percentile(x, [75, 25]))

比起进行两次 percentile 调用:

In [8]: x = np.random.rand(1e6)

In [9]: %timeit q75, q25 = np.percentile(x, [75 ,25]); iqr = q75 - q25
10 loops, best of 3: 24.2 ms per loop

In [10]: %timeit iqr = np.subtract(*np.percentile(x, [75, 25]))
10 loops, best of 3: 24.2 ms per loop

In [11]: %timeit iqr = np.percentile(x, 75) - np.percentile(x, 25)
10 loops, best of 3: 33.7 ms per loop

使用ufunc机制,np.substract.reduce。在我看来,比*魔法略清晰。 - Davidmh
1
@Jaime
  • 运算符是什么?它有什么作用?
- Sounak
3
函数在其后解包元组,这样函数就不再接收一个两项的序列,而是接收两个单独的项目。 - Jaime
1
从两个数字中减去一个数字的时间复杂度为O(1),而查找%iles的时间复杂度为O(n),因此拆分这两个操作并非不可接受,可以非常明确地将它们加在一起。 - Nick T

32

现在,在scipy.stats中有一个iqr函数。 它从scipy 0.18.0开始提供。 我最初的想法是将其添加到numpy中,但被认为过于领域特定。

也许您最好只使用Jaime的答案,因为scipy代码只是相同内容的过度复杂版本。


5
为什么IQR对于numpy来说被认为过于领域特定? - Rob Rose
因为它不是一个广泛使用的指标。欢迎在邮件列表中搜索详细信息。 - Mad Physicist

2

如果Jaime的答案适用于您的情况,请忽略此内容。但是,如果不适用,则根据此答案,要查找第1四分位数和第3四分位数的确切值,您应该考虑执行以下操作:

samples = sorted([28, 12, 8, 27, 16, 31, 14, 13, 19, 1, 1, 22, 13])

def find_median(sorted_list):
    indices = []

    list_size = len(sorted_list)
    median = 0

    if list_size % 2 == 0:
        indices.append(int(list_size / 2) - 1)  # -1 because index starts from 0
        indices.append(int(list_size / 2))

        median = (sorted_list[indices[0]] + sorted_list[indices[1]]) / 2
        pass
    else:
        indices.append(int(list_size / 2))

        median = sorted_list[indices[0]]
        pass

    return median, indices
    pass

median, median_indices = find_median(samples)
Q1, Q1_indices = find_median(samples[:median_indices[0]])
Q2, Q2_indices = find_median(samples[median_indices[-1] + 1:])

IQR = Q3 - Q1

quartiles = [Q1, median, Q2]

代码取自所引用的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接