python:numpy - 用线性插值计算百分位数

时间:2013-10-05 01:23:27

标签: python numpy percentile linear-interpolation

我试图在阅读维基百科后计算百分位数我实施了简单的公式

def _percentile(numList, percentile):
    numList.sort()
    n = int(round(percentile * len(numList) + 0.5))
    if n > 1:
        return numList[n-2]
    else:
        return 0

但是我想要做的是在wiki中提到的插值版本:(http://en.wikipedia.org/wiki/Percentile#Linear_interpolation_between_closest_ranks)我在google中搜索并发现numpy但是当我使用它时我不认为我得到了正确的值即使是简单的公式。当我尝试传入值进行插值时,它会给我错误。 (http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html

让我们从以下列表开始:

B = [15, 20, 35, 40, 50]

根据我的方法:我得到原始列表的实际值,代表我正在寻找的百分位数:

>>> print percentile(B, P=0.)
0
>>> print percentile(B, P=0.1)
0
>>> print percentile(B, P=0.2)
15
>>> print percentile(B, P=0.3)
15
>>> print percentile(B, P=0.4)
20
>>> print percentile(B, P=0.5)
20
>>> print percentile(B, P=0.6)
35
>>> print percentile(B, P=0.7)
35
>>> print percentile(B, P=0.8)
40
>>> print percentile(B, P=0.9)
40
>>> print percentile(B, P=0.95)
40
>>> print percentile(B, P=1.0)
50

但如果我使用numpy,我就不会得到代表原始列表的实际值。

>>> np.percentile(B, 0.1)
15.02
>>> np.percentile(B, 0.2)
15.039999999999999
>>> np.percentile(B, 0.3)
15.06
>>> np.percentile(B, 0.4)
15.08
>>> np.percentile(B, 0.5)
15.1
>>> np.percentile(B, 0.6)
15.120000000000001
>>> np.percentile(B, 0.7)
15.140000000000001
>>> np.percentile(B, 0.8)
15.16
>>> np.percentile(B, 0.9)
15.18
>>> np.percentile(B, 1)
15.199999999999999
>>> np.percentile(B, 10)
17.0
>>> np.percentile(B, 20)
19.0
>>> np.percentile(B, 30)
23.0
>>> np.percentile(B, 40)
29.0
>>> np.percentile(B, 50)
35.0

我的问题是一个数组,如何通过使用线性插值技术计算百分位数,从该数组中获取表示百分位数(如10,20 ... 100)的值?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。对我来说,这很简单......我认为百分位参数(你称之为P)是0.0-1.0的浮点数,其中1.0表示100%-percentile。

我刚刚阅读了手册,发现P的范围是0-100,其中100表示​​100%-percentile。

  

numpy.percentile(a,q,axis = None,out = None,overwrite_input = False,   插值='线性&#39)

     

q:浮动范围为[0,100](或浮点数)百分位数   计算必须在0到100之间。

http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html

希望有所帮助!

答案 1 :(得分:0)

numpy正在做正确的事。

您的代码返回numList + [0]的百分位数,即包含0的集合。

第0个百分位项目将是numList中的最低项目,在此示例中为15。