Pregunta

¿Hay una manera conveniente para calcular los percentiles para una secuencia o dimensiones de un solo conjunto numpy?

Busco algo similar a la función percentil de Excel.

Miré en referencia las estadísticas de NumPy, y no podía encontrar esto. Todo lo que pude encontrar es la mediana (percentil 50), pero no es algo más específico.

¿Fue útil?

Solución

Quizás se encuentre interesado en el paquete de la SciPy Estadísticas . Tiene la función percentil que está buscando, y muchas otras cosas buenas estadísticas.

percentile() href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html" rel="noreferrer"> 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

percentile() me lleva a este billete creen que no será la integración en cualquier momento pronto numpy.

Otros consejos

Por cierto, no es un puro- implementación de Python de la función percentil , en caso de que uno no quiere depender de scipy. 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/ }}}
import numpy as np
a = [154, 400, 1124, 82, 94, 108]
print np.percentile(a,95) # gives the 95th percentile

Aquí está cómo hacerlo sin numpy, utilizando sólo pitón para calcular el percentil.

import math

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

p5 = percentile(mylist, 5)
p25 = percentile(mylist, 25)
p50 = percentile(mylist, 50)
p75 = percentile(mylist, 75)
p95 = percentile(mylist, 95)

La definición de percentil lo general Sede espera como resultado el valor de la lista suministrada por debajo del cual P por ciento de los valores se encuentran ... que significa que el resultado debe ser a partir del conjunto, no una interpolación entre los elementos de ajuste. Para conseguir eso, se puede utilizar 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]

cheque por scipy.stats módulo:

 scipy.stats.scoreatpercentile

Para calcular el percentil de una serie, ejecute:

from scipy.stats import rankdata
import numpy as np

def calc_percentile(a, method='min'):
    if isinstance(a, list):
        a = np.asarray(a)
    return rankdata(a, method=method) / float(len(a))

Por ejemplo:

a = range(20)
print {val: round(percentile, 3) for val, percentile in zip(a, calc_percentile(a))}
>>> {0: 0.05, 1: 0.1, 2: 0.15, 3: 0.2, 4: 0.25, 5: 0.3, 6: 0.35, 7: 0.4, 8: 0.45, 9: 0.5, 10: 0.55, 11: 0.6, 12: 0.65, 13: 0.7, 14: 0.75, 15: 0.8, 16: 0.85, 17: 0.9, 18: 0.95, 19: 1.0}

A partir Python 3.8, la biblioteca estándar viene con el función quantiles como parte de la statistics módulo:

from statistics import quantiles

quantiles([1, 2, 3, 4, 5], n=100)
# [0.06, 0.12, 0.18, 0.24, 0.3, 0.36, 0.42, 0.48, 0.54, 0.6, 0.66, 0.72, 0.78, 0.84, 0.9, 0.96, 1.02, 1.08, 1.14, 1.2, 1.26, 1.32, 1.38, 1.44, 1.5, 1.56, 1.62, 1.68, 1.74, 1.8, 1.86, 1.92, 1.98, 2.04, 2.1, 2.16, 2.22, 2.28, 2.34, 2.4, 2.46, 2.52, 2.58, 2.64, 2.7, 2.76, 2.82, 2.88, 2.94, 3.0, 3.06, 3.12, 3.18, 3.24, 3.3, 3.36, 3.42, 3.48, 3.54, 3.6, 3.66, 3.72, 3.78, 3.84, 3.9, 3.96, 4.02, 4.08, 4.14, 4.2, 4.26, 4.32, 4.38, 4.44, 4.5, 4.56, 4.62, 4.68, 4.74, 4.8, 4.86, 4.92, 4.98, 5.04, 5.1, 5.16, 5.22, 5.28, 5.34, 5.4, 5.46, 5.52, 5.58, 5.64, 5.7, 5.76, 5.82, 5.88, 5.94]
quantiles([1, 2, 3, 4, 5], n=100)[49] # 50th percentile (e.g median)
# 3.0

quantiles retornos para un determinado dist distribución una lista de puntos de corte n - 1 que separan los intervalos n cuantiles (división de dist en intervalos continuos n con igual probabilidad):

  

statistics.quantiles (dist, *, n = 4, method = 'exclusivo')

donde n, en nuestro caso (percentiles) es 100.

En caso de que necesite la respuesta a ser un miembro de la matriz numpy de entrada:

Sólo para añadir que la función percentil en numpy por defecto calcula la salida como una media ponderada lineal de las dos entradas vecinas en el vector de entrada. En algunos casos las personas pueden querer el percentil volvieron a ser un elemento real del vector, en este caso, a partir v1.9.0 en adelante se puede utilizar la opción de "interpolación", ya sea "inferior", "superior" o "más cercano".

import numpy as np
x=np.random.uniform(10,size=(1000))-5.0

np.percentile(x,70) # 70th percentile

2.075966046220879

np.percentile(x,70,interpolation="nearest")

2.0729677997904314

El último es una entrada real en el vector, mientras que la primera es una interpolación lineal de dos entradas vector que bordean el percentil

para una serie: utilizado describir funciones

suponga que tiene df con columnas siguientes ventas y de identificación. desea calcular percentiles para las ventas entonces funciona como este,

df['sales'].describe(percentiles = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1])

0.0: .0: minimum
1: maximum 
0.1 : 10th percentile and so on
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top