Frage

Gibt es eine bequeme Möglichkeit zu berechnen Perzentile für eine Sequenz oder eindimensionales numpy Array?

Ich suche etwas ähnliches wie die Excel-Perzentil-Funktion.

sah ich in NumPy Statistiken Referenz und konnte das nicht finden. Alles, was ich ist der Median finden konnte (50. Perzentil), nicht aber etwas präziser.

War es hilfreich?

Lösung

Sie könnten interessiert sein in der SciPy Statistik Paket. Es hat die Perzentil-Funktion Sie nach und vielen anderen statistischen Leckereien.

percentile() href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html" rel="noreferrer"> ist verfügbar in numpy auch.

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

dieses Ticket führt mich zu glauben, dass sie nicht auf die Integration percentile() in numpy jederzeit schnell.

Andere Tipps

Übrigens gibt es ein rein- Python-Implementierung von Perzentil-Funktion , einen im Fall möchte nicht auf scipy abzuhängen. Die Funktion wird kopiert unter:

## {{{ 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

Hier ist, wie es ohne numpy zu tun, nur Python mit der Perzentile zu berechnen.

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)

Die Definition des Begriffs Perzentil ich in der Regel erwartet als Ergebnis den Wert aus der mitgelieferten Liste sehen, unter dem P Prozent der Werte gefunden werden ... was bedeutet, das Ergebnis aus der Menge sein muss, nicht eine Interpolation zwischen Set-Elementen. Um das, können Sie eine einfachere Funktion verwenden.

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

Wenn Sie lieber den Wert aus der mitgelieferten Liste erhalten würden bei oder unter der P Prozent der Werte gefunden werden, dann diese einfache Modifikation verwendet werden:

def percentile(N, P):
    n = int(round(P * len(N) + 0.5))
    if n > 1:
        return N[n-2]
    else:
        return N[0]

oder mit der Vereinfachung von @ijustlovemath vorgeschlagen:

def percentile(N, P):
    n = max(int(round(P * len(N) + 0.5)), 2)
    return N[n-2]

Check für scipy.stats Modul:

 scipy.stats.scoreatpercentile

Um die Perzentil einer Reihe zu berechnen, führen:

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))

Zum Beispiel:

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}

Ab Python 3.8 kommt die Standard-Bibliothek mit dem quantiles Funktion als Teil des statistics Modul:

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 kehrt für ein bestimmtes Verteilung dist eine Liste der Schnittpunkte, die n - 1 n Quantil-Intervalle (Teilung in dist n kontinuierlichen Abständen mit gleicher Wahrscheinlichkeit) Trennen:

  

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

Dabei gilt n, in unserem Fall (percentiles) ist 100.

Falls Sie benötigen die Antwort ein Mitglied des Eingangs numpy Array zu sein:

nur hinzufügen, dass die Perzentil-Funktion in numpy standardmäßig den Ausgang als eine lineare gewichtete Mittelwert der beiden benachbarten Einträge in dem Eingangsvektor berechnet. In einigen Fällen Perzentil Menschen können die zurückgegeben werden sollen ein tatsächliches Element des Vektors zu sein, in diesem Fall von v1.9.0 ab können Sie die „Interpolation“ Option, entweder mit „niedriger“, „höher“ oder „nächsten“ verwenden.

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

Letzteres ist ein aktueller Eintrag in dem Vektor, während die erstere eine lineare Interpolation von zwei Vektoreinträgen, dass Grenz die Perzentil ist

für eine Serie: verwendet beschreiben Funktionen

Angenommen, Sie haben df mit folgenden Spalten Umsatz und id. Sie wollen Perzentile für den Verkauf berechnen dann funktioniert es so,

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top