您如何在Numpy中找到IQR?


75

是否有内置的Numpy / Scipy函数来查找四分位数范围?我自己可以很容易地做到这一点,但是mean()基本上存在sum/len...

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

我认为没有功能,您必须像以前那样计算百分位数。
BrenBarn 2014年

2
@BrenBarn。现在有...
疯狂物理学家

Answers:


116

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 2015年

1
@Jaime *操作符是什么?到底在做什么
Sounak

2
它在其后将元组解包,因此该函数将传递两个单独的项目,而不是两个项目的序列。
2015年

1
将两个数字相减为O(1),而找到%ile则为O(n),因此将这两个东西拆包并非常明确地相加就很好了。
尼克T

24

中现在有一个iqr功能scipy.stats。从scipy 0.18.0开始可用。我最初的意图是将其添加到numpy中,但它被认为也是特定于域的。

仅使用Jaime的答案可能会更好,因为scipy代码只是该代码的过于复杂的版本。


4
为什么IQR对于numpy而言过于特定于域?
罗布·罗斯

因为它不是广泛使用的指标。随时搜索邮件列表以获取详细信息。
疯狂物理学家

1

如果Jaime的答案适合您的情况,请忽略此操作。但是,如果没有,根据此答案,要找到第一个四分位数和第三个四分位数的确切值,则应考虑执行以下操作:

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]

代码来自引用的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.