¿Hay una manera conveniente de calcular percentiles para una secuencia o matriz numpy unidimensional?
Estoy buscando algo similar a la función de percentil de Excel.
Miré en la referencia de estadísticas de NumPy, y no pude encontrar esto. Todo lo que pude encontrar es la mediana (percentil 50), pero no algo más específico.
Respuestas:
Quizás te interese el paquete SciPy Stats . Tiene la función de percentil que busca y muchas otras ventajas estadísticas.
percentile()
está disponible ennumpy
también.Este boleto me lleva a creer que no se integraránpercentile()
en numpy pronto.fuente
df.groupby('key')[['value']].agg(lambda g: np.percentile(g, 10))
Por cierto, hay una implementación de Python pura de la función de percentil , en caso de que uno no quiera depender de scipy. La función se copia a continuación:
fuente
percentile
sabe para qué usarN
? No se especifica en la llamada a la función.N
antes de calcular un percentil. Digamos que en realidad tienes una lista de tuplasN = [(1, 2), (3, 1), ..., (5, 1)]
y quieres obtener el percentil del primer elemento de las tuplas, luego eligeskey=lambda x: x[0]
. También puede aplicar alguna transformación (cambio de orden) a los elementos de la lista antes de calcular un percentil.fuente
Aquí se explica cómo hacerlo sin numpy, usando solo python para calcular el percentil.
fuente
La definición de percentil que generalmente veo espera como resultado el valor de la lista suministrada debajo del cual se encuentra el porcentaje de P ... lo que significa que el resultado debe ser del conjunto, no una interpolación entre los elementos del conjunto. Para obtener eso, puede usar una función más simple.
Si prefiere obtener el valor de la lista provista en o por debajo del cual se encuentra el P por ciento de los valores, utilice esta simple modificación:
O con la simplificación sugerida por @ijustlovemath:
fuente
PERCENTILE
función devuelve los siguientes percentiles para sus ejemplos superiores:3.7 = percentile(A, P=0.3)
,0.82 = percentile(A, P=0.8)
,20 = percentile(B, P=0.3)
,42 = percentile(B, P=0.8)
.n = int(...)
en unamax(int(...), 1)
funciónComenzando
Python 3.8
, la biblioteca estándar viene con laquantiles
función como parte delstatistics
módulo:quantiles
devuelve para una distribución dadadist
una lista den - 1
puntos de corte que separan losn
intervalos cuantiles (división dedist
enn
intervalos continuos con igual probabilidad):donde
n
, en nuestro caso (percentiles
) es100
.fuente
compruebe el módulo scipy.stats:
fuente
Para calcular el percentil de una serie, ejecute:
Por ejemplo:
fuente
En caso de que necesite la respuesta para ser miembro de la matriz numpy de entrada:
Solo para agregar que la función de percentil en numpy por defecto calcula la salida como un promedio lineal ponderado de las dos entradas vecinas en el vector de entrada. En algunos casos, las personas pueden desear que el percentil devuelto sea un elemento real del vector, en este caso, desde v1.9.0 en adelante, puede usar la opción "interpolación", ya sea con "más bajo", "más alto" o "más cercano".
La última es una entrada real en el vector, mientras que la primera es una interpolación lineal de dos entradas de vector que bordean el percentil.
fuente
para una serie: funciones de descripción utilizadas
supongamos que tiene df con las siguientes columnas de ventas e id. desea calcular percentiles para ventas, entonces funciona así,
fuente
Una manera conveniente de calcular los percentiles para una secuencia o matriz numpy unidimensional es usando numpy.percentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html >. Ejemplo:
Sin embargo, si hay algún valor de NaN en sus datos, la función anterior no será útil. La función recomendada para usar en ese caso es la función numpy.nanpercentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.nanpercentile.html >:
En las dos opciones presentadas anteriormente, aún puede elegir el modo de interpolación. Siga los ejemplos a continuación para una comprensión más fácil.
Si su matriz de entrada solo consta de valores enteros, es posible que le interese la respuesta porcentual como un entero. Si es así, elija el modo de interpolación como 'más bajo', 'más alto' o 'más cercano'.
fuente