180 votos

¿Cómo calculo los percentiles con Python/numpy?

¿Existe una forma conveniente de calcular los percentiles para una secuencia o una matriz numérica unidimensional?

Estoy buscando algo similar a la función de percentil de Excel.

Busqué en la referencia estadística de NumPy y no pude encontrar esto. Todo lo que pude encontrar es la mediana (50º percentil), pero no algo más específico.

237voto

Jon W Puntos 7032

Puede que te interese el Estadísticas de SciPy paquete. Tiene la función de percentil que buscas y muchas otras cosas estadísticas.

percentile() está disponible en numpy también.

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

Este boleto me lleva a creer que no se integrarán percentile() en un adormecimiento en cualquier momento.

64voto

bgbg Puntos 4713

Por cierto, hay una implementación de Python puro de la función percentil en caso de que uno no quiera depender de la ciencia. La función se copia a continuación:

## {{{ 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/ }}}

25voto

richie Puntos 664
import numpy as np
a = [154, 400, 1124, 82, 94, 108]
print np.percentile(a,95) # gives the 95th percentile

10voto

mpounsett Puntos 381

La definición de percentil que suelo ver espera como resultado el valor de la lista suministrada bajo el cual se encuentra el porcentaje P de los valores. 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 del cual se encuentra el porcentaje P de los valores, entonces utilice esta simple modificación:

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

7voto

Evert Puntos 61

Busca el módulo scipy.stats: scipy.stats.scoreatpercentile

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X