1

ウィキペディアを読んだ後、パーセンタイルを計算しようとしています単純な式を実装しました

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 などのパーセンタイルを表す配列から値を取得する方法が配列に与えられます。

4

2 に答える 2

0

numpy は正しいことをしています。

コードは のパーセンタイルnumList + [0]、つまり 0 を含むセットを返しています。

0 番目のパーセンタイル アイテムは で最も低いアイテムでnumList、この例では 15 です。

于 2013-10-05T01:30:43.970 に答える