## {{{ 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/ }}}
7
import numpy as np
a = [154, 400, 1124, 82, 94, 108]
print np.percentile(a,95) # gives the 95th percentile
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]
8 回答
您可能对SciPy Stats包感兴趣 . 它有the percentile function你正在追求和许多其他统计的好东西 .
percentile()
is available在numpy
中也是如此 .这张票让我相信他们不会很快将百分之百()变成numpy .
顺便说一下,如果一个人不想依赖scipy,那就有a pure-Python implementation of percentile function . 该功能复制如下:
我通常看到的百分位数的定义结果是所提供的列表中的值,其中P%的值被找到...这意味着结果必须来自集合,而不是集合元素之间的插值 . 为此,您可以使用更简单的功能 .
如果您希望从提供的列表中获取值,或者在其中找到P%的值,则使用以下简单修改:
或者@ijustlovemath建议的简化:
检查scipy.stats模块:
这里是如何在没有numpy的情况下完成它,只使用python来计算百分位数 .
要计算系列的百分位数,请运行:
例如:
In case you need the answer to be a member of the input numpy array:
只是补充一点,默认情况下numpy中的百分位函数将输出计算为输入向量中两个相邻条目的线性加权平均值 . 在某些情况下,人们可能希望返回的百分位数是向量的实际元素,在这种情况下,从v1.9.0起,您可以使用“插值”选项,“低”,“高”或“最近” .
后者是向量中的实际条目,而前者是边界百分位数的两个向量条目的线性插值