La definición de percentil suelo ver espera como resultado el valor de la lista suministrada por debajo del cual P por ciento de los valores se encuentran ... lo que significa que el resultado debe ser del conjunto, no una interpolación entre los elementos del conjunto. Para obtener eso, puedes usar una función más simple.
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
Si prefiere obtener el valor de la lista suministrada en o por debajo de la cual p por ciento de los valores se encuentran, a continuación, utilizar esta sencilla modificación:
def percentile(N, P):
n = int(round(P * len(N) + 0.5))
if n > 1:
return N[n-2]
else:
return N[0]
O con la simplificación sugerida por @ijustlovemath :
def percentile(N, P):
n = max(int(round(P * len(N) + 0.5)), 2)
return N[n-2]
Gracias! Entonces ahí es donde se ha estado escondiendo. Estaba al tanto de lo simple, pero supongo que asumí cosas simples como que los percentiles se construirían en numpy. – Uri
Por ahora, existe una función de percentil en numpy: http://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html – Anaphory
También puede usarlo como una función de agregación, p. para calcular el décimo percentil de cada grupo de una columna de valor por clave, use 'df.groupby ('clave') [['' valor ']]. agg (lambda g: np.percentile (g, 10))' – patricksurry