265

シーケンスまたは 1 次元の numpy 配列のパーセンタイルを計算する便利な方法はありますか?

Excel のパーセンタイル関数に似たものを探しています。

NumPy の統計リファレンスを調べましたが、これが見つかりませんでした。私が見つけたのは中央値 (50 パーセンタイル) だけで、より具体的なものは見つかりませんでした。

4

12 に答える 12

351

SciPy Statsパッケージに興味があるかもしれません。それはあなたが求めているパーセンタイル関数と他の多くの統計的グッズを持っています.

percentile() 利用できnumpyます。

import numpy as np
a = np.array([1,2,3,4,5])
p = np.percentile(a, 50) # return 50th percentile, e.g median.
print p
3.0

このチケットpercentile()は、彼らがすぐに numpyに統合されることはないと私に信じさせます。

于 2010-03-03T20:24:34.573 に答える
83

ちなみに、scipy に依存したくない場合に備えて、パーセンタイル関数の純粋な Python 実装があります。関数は以下にコピーされます。

## {{{ http://code.activestate.com/recipes/511478/ (r1)
import math
import functools

def percentile(N, percent, key=lambda x:x):
    """
    Find the percentile of a list of values.

    @parameter N - is a list of values. Note N MUST BE already sorted.
    @parameter percent - a float value from 0.0 to 1.0.
    @parameter key - optional key function to compute value from each element of N.

    @return - the percentile of the values
    """
    if not N:
        return None
    k = (len(N)-1) * percent
    f = math.floor(k)
    c = math.ceil(k)
    if f == c:
        return key(N[int(k)])
    d0 = key(N[int(f)]) * (c-k)
    d1 = key(N[int(c)]) * (k-f)
    return d0+d1

# median is 50th percentile.
median = functools.partial(percentile, percent=0.5)
## end of http://code.activestate.com/recipes/511478/ }}}
于 2010-05-02T11:46:20.370 に答える
26

パーセンタイルを計算するためにpythonのみを使用して、numpyなしでそれを行う方法は次のとおりです。

import math

def percentile(data, perc: int):
    size = len(data)
    return sorted(data)[int(math.ceil((size * perc) / 100)) - 1]

percentile([10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0], 90)
# 9.0
percentile([142, 232, 290, 120, 274, 123, 146, 113, 272, 119, 124, 277, 207], 50)
# 146
于 2013-03-23T16:35:03.127 に答える
13

私が通常目にするパーセンタイルの定義は、結果として提供されたリストからの値を期待し、その下で値のPパーセントが見つかります...つまり、結果はセットからのものでなければならず、セット要素間の補間ではありません。これを取得するには、より単純な関数を使用できます。

def percentile(N, P):
    """
    Find the percentile of a list of values

    @parameter N - A list of values.  N must be sorted.
    @parameter P - A float value from 0.0 to 1.0

    @return - The percentile of the values.
    """
    n = int(round(P * len(N) + 0.5))
    return N[n-1]

# A = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# B = (15, 20, 35, 40, 50)
#
# print percentile(A, P=0.3)
# 4
# print percentile(A, P=0.8)
# 9
# print percentile(B, P=0.3)
# 20
# print percentile(B, P=0.8)
# 50

提供されたリストから値のPパーセント以下の値を取得したい場合は、次の簡単な変更を使用してください。

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

または、@ ijustlovemathによって提案された簡略化を使用して:

def percentile(N, P):
    n = max(int(round(P * len(N) + 0.5)), 2)
    return N[n-2]
于 2011-09-18T20:05:11.607 に答える
6

scipy.statsモジュールを確認します。

 scipy.stats.scoreatpercentile
于 2011-07-22T00:53:10.600 に答える