Existe uma maneira conveniente de calcular percentis para uma sequência ou matriz numpy unidimensional?
Estou procurando algo semelhante à função de percentil do Excel.
Procurei na referência de estatísticas da NumPy e não consegui encontrar isso. Tudo o que pude encontrar é a mediana (percentil 50), mas não algo mais específico.
Respostas:
Você pode estar interessado no pacote SciPy Stats . Tem a função de percentil que você procura e muitas outras vantagens estatísticas.
percentile()
está disponível emnumpy
também.Esse ingresso me leva a acreditar que eles não se integrarãopercentile()
ao numpy tão cedo.fonte
df.groupby('key')[['value']].agg(lambda g: np.percentile(g, 10))
A propósito, existe uma implementação pura em Python da função percentil , caso não se queira depender de scipy. A função é copiada abaixo:
fonte
percentile
sabe o que usarN
? Não está especificado na chamada de função.N
antes de calcular um percentil. Digamos que você realmente tenha uma lista de tuplasN = [(1, 2), (3, 1), ..., (5, 1)]
e deseje obter o percentil do primeiro elemento das tuplas e escolhakey=lambda x: x[0]
. Você também pode aplicar alguma transformação (alteração de ordem) aos elementos da lista antes de calcular um percentil.fonte
Veja como fazê-lo sem numpy, usando apenas python para calcular o percentil.
fonte
A definição de percentil que normalmente vejo espera como resultado o valor da lista fornecida abaixo da qual P% dos valores são encontrados ... o que significa que o resultado deve ser do conjunto, não uma interpolação entre os elementos do conjunto. Para conseguir isso, você pode usar uma função mais simples.
Se você preferir obter o valor da lista fornecida igual ou inferior a P% dos valores, use esta modificação simples:
Ou com a simplificação sugerida por @ijustlovemath:
fonte
PERCENTILE
função retorna os seguintes percentuais para os seus exemplos 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(...)
max(int(...), 1)
Iniciando
Python 3.8
, a biblioteca padrão vem com aquantiles
função como parte dostatistics
módulo:quantiles
retorna para uma determinada distribuiçãodist
uma lista den - 1
pontos de corte que separam osn
intervalos quantílicos (divisão dedist
emn
intervalos contínuos com igual probabilidade):onde
n
, no nosso caso (percentiles
) é100
.fonte
verifique o módulo scipy.stats:
fonte
Para calcular o percentil de uma série, execute:
Por exemplo:
fonte
Caso você precise da resposta para ser um membro da matriz numpy de entrada:
Apenas para adicionar que a função percentil em numpy, por padrão, calcula a saída como uma média ponderada linear das duas entradas vizinhas no vetor de entrada. Em alguns casos, as pessoas podem querer que o percentil retornado seja um elemento real do vetor; nesse caso, a partir da v1.9.0, você pode usar a opção "interpolação", com "inferior", "superior" ou "mais próximo".
O último é uma entrada real no vetor, enquanto o primeiro é uma interpolação linear de duas entradas do vetor que limitam o percentil
fonte
para uma série: usado para descrever funções
suponha que você tenha df com as seguintes colunas sales e id. você deseja calcular percentis para vendas, funciona assim,
fonte
Uma maneira conveniente de calcular percentis para uma sequência ou matriz numpy unidimensional é usando numpy.percentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html >. Exemplo:
No entanto, se houver algum valor de NaN em seus dados, a função acima não será útil. A função recomendada para uso nesse caso é a função numpy.nanpercentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.nanpercentile.html >:
Nas duas opções apresentadas acima, você ainda pode escolher o modo de interpolação. Siga os exemplos abaixo para entender melhor.
Se sua matriz de entrada consistir apenas em valores inteiros, você poderá estar interessado na resposta do percentil como um número inteiro. Nesse caso, escolha o modo de interpolação, como 'inferior', 'superior' ou 'mais próximo'.
fonte