Czy istnieje wygodny sposób obliczania percentyli dla sekwencji lub jednowymiarowej tablicy numpy?
Szukam czegoś podobnego do funkcji percentyla programu Excel.
Zajrzałem do statystyki NumPy i nie mogłem tego znaleźć. Jedyne, co mogłem znaleźć, to mediana (50 percentyl), ale nie coś bardziej szczegółowego.
Odpowiedzi:
Możesz być zainteresowany pakietem SciPy Stats . Ma funkcję percentyla, której szukasz, i wiele innych statystycznych dodatków.
percentile()
jest również dostępny wnumpy
.Ten bilet prowadzi mnie dopercentile()
wniosku, że w najbliższym czasie nie zostaną zintegrowane z Numpy.źródło
df.groupby('key')[['value']].agg(lambda g: np.percentile(g, 10))
Nawiasem mówiąc, istnieje implementacja funkcji percentyla w czystym Pythonie , na wypadek, gdyby ktoś nie chciał polegać na scipy. Funkcja została skopiowana poniżej:
źródło
percentile
wie, do czego używaćN
? Nie jest to określone w wywołaniu funkcji.N
przed obliczeniem percentyla. Załóżmy, że faktycznie masz listę krotekN = [(1, 2), (3, 1), ..., (5, 1)]
i chcesz uzyskać percentyl pierwszego elementu krotek, a następnie wybierzkey=lambda x: x[0]
. Możesz także zastosować transformację (zmieniającą porządek) do elementów listy przed obliczeniem percentyla.źródło
Oto jak to zrobić bez numpy, używając tylko Pythona do obliczenia percentyla.
źródło
Definicja percentyla, którą zwykle widzę, oczekuje w rezultacie wartości z dostarczonej listy, poniżej której znajduje się P procent wartości ... co oznacza, że wynik musi pochodzić ze zbioru, a nie interpolacji między elementami zestawu. Aby to uzyskać, możesz użyć prostszej funkcji.
Jeśli wolisz uzyskać wartość z dostarczonej listy, na której lub poniżej znajduje się P procent wartości, użyj tej prostej modyfikacji:
Lub z uproszczeniem sugerowanym przez @ijustlovemath:
źródło
PERCENTILE
zwraca następujące percentyla dla górnych przykładów: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(...)
wmax(int(...), 1)
funkcjiZaczynając
Python 3.8
, standardowa biblioteka zawieraquantiles
funkcję jako częśćstatistics
modułu:quantiles
zwraca dla danego rozkładudist
listęn - 1
punktów cięcia oddzielającychn
interwały kwantylowe (podziałdist
nan
ciągłe interwały z jednakowym prawdopodobieństwem):gdzie
n
w naszym przypadku (percentiles
) jest100
.źródło
sprawdź moduł scipy.stats:
źródło
Aby obliczyć percentyl serii, uruchom:
Na przykład:
źródło
Jeśli potrzebujesz odpowiedzi, aby być członkiem wejściowej tablicy numpy:
Wystarczy dodać, że funkcja percentyla w numpy domyślnie oblicza wynik jako liniową średnią ważoną dwóch sąsiednich wpisów w wektorze wejściowym. W niektórych przypadkach ludzie mogą chcieć, aby zwracany percentyl był faktycznym elementem wektora, w tym przypadku od wersji 1.0.0 można użyć opcji „interpolacji” z „niższym”, „wyższym” lub „najbliższym”.
Ten ostatni jest rzeczywistym wpisem w wektorze, podczas gdy ten pierwszy jest interpolacją liniową dwóch wpisów wektora, które graniczą z percentylem
źródło
dla serii: używane opisują funkcje
załóżmy, że masz df z następującymi kolumnami sprzedaż i identyfikator. chcesz obliczyć percentyle dla sprzedaży, to działa w ten sposób,
źródło
Wygodnym sposobem obliczania percentyli dla jednowymiarowej sekwencji lub macierzy numpy jest użycie numpy.percentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html >. Przykład:
Jeśli jednak w Twoich danych jest jakakolwiek wartość NaN, powyższa funkcja nie będzie przydatna. Zalecaną funkcją do użycia w takim przypadku jest funkcja numpy.nanpercentile < https://docs.scipy.org/doc/numpy/reference/generated/numpy.nanpercentile.html >:
W dwóch przedstawionych powyżej opcjach nadal możesz wybrać tryb interpolacji. Wykonaj poniższe przykłady, aby łatwiej zrozumieć.
Jeśli tablica wejściowa składa się tylko z liczb całkowitych, być może interesuje Cię odpowiedź procentowa jako liczba całkowita. Jeśli tak, wybierz tryb interpolacji, taki jak „niższy”, „wyższy” lub „najbliższy”.
źródło