Veo muchas preguntas como esta para R, pero no pude encontrar una específicamente para Python, preferiblemente usando numpy.
Digamos que tengo una matriz de observaciones almacenadas en x . Puedo obtener el valor q * 100 por ciento de la población.
# Import numpy import numpy as np # Get 75th percentile np.quantile(a=x, q=0.75) Sin embargo, me preguntaba si hay una función que hace lo contrario. Es decir, una función numérica que toma un valor como entrada y devuelve q .
Para ampliar aún más esto, los objetos de distribución de scipy tienen un método ppf que me permite hacer esto. Estoy buscando algo similar en numpy. ¿Existe?
No es una función preparada, sino un fragmento compacto y razonablemente rápido:
(a<value).mean() Puede (al menos en mi máquina) obtener un rendimiento un poco mejor usando np.count_nonzero
np.count_nonzero(a<value) / a.sizepero tbh ni siquiera me molestaría.
Hay una función de conveniencia que hace esto. Tenga en cuenta que no es un inverso exacto porque las funciones de quantile / percentile no son exactas. Dada una matriz finita de observaciones, los percentiles tendrán valores discretos; en otras palabras, puede estar especificando una q que se encuentre entre esos valores y las funciones encuentren la más cercana.
from scipy import stats import numpy as np stats.percentileofscore(np.arange(0,1,0.12), .65, 'weak') / 100Si se ordena x , el valor en el índice i es el percentil i / len(x) (más o menos, dependiendo de cómo desee tratar las condiciones de contorno). Si x no está ordenado, puede obtener el mismo valor sustituyendo x.argsort().argsort()[i] por i (o simplemente ordenando x primero). Dado que argsort es su propio inverso, el doble argsort le dice dónde caería cada elemento del original en la matriz ordenada.
Si desea encontrar el resultado de valores arbitrarios no necesariamente en x , puede aplicar np.searchsorted a una versión ordenada de x e interpolar el resultado. Puede usar un método más complicado, como ajustar una spline a los datos ordenados o algo similar.