2015-04-27 4 views
5

Kurz gesagt, was ist meine beste Option für Diagramme vom Typ Verteilung (Histogramm oder Kde), wenn meine Daten gewichtet werden?Diagramme vom Verteilungstyp (Histogramm/Kde) mit gewichteten Daten

df = pd.DataFrame({ 'x':[1,2,3,4], 'wt':[7,5,3,1] }) 

df.x.plot(kind='hist',weights=df.wt.values) 

Das funktioniert gut, aber Seaborn eine Gewichte kwarg nicht akzeptieren, das heißt

sns.distplot(df.x, bins=4,    # doesn't work like this 
       weights=df.wt.values)  # or with kde=False added 

Es wäre auch schön, wenn kde Gewichte akzeptieren würde, aber weder Pandas noch Seaborn scheint es, zu ermöglichen.

Ich merke BTW, dass die Daten erweitert werden könnten, um die Gewichtung zu fälschen und das ist einfach hier, aber nicht viel mit meinen echten Daten mit Gewichten in den Hunderten oder Tausend, so suche ich nicht nach einer solchen Abhilfe.

Wie auch immer, das ist alles. Ich versuche nur herauszufinden, was (wenn überhaupt) ich mit gewichteten Daten neben dem einfachen Pandas-Histogramm machen kann. Ich habe noch nicht mit Bokeh herumgespielt, aber auch Bokeh-Vorschläge sind willkommen.

Antwort

4

Sie müssen verstehen, dass Seaborn die sehr matplotlib Zeichenfunktionen verwendet, die auch Pandas verwenden.

Da die documentation Staaten, sns.distplot kein weights Argument akzeptieren, aber es dauert ein hist_kws Argument, die den zugrunde liegenden Aufruf plt.hist gesendet werden. Daher sollte dies tun, was Sie wollen:

sns.distplot(df.x, bins=4, hist_kws={'weights':df.wt.values}) 
+0

Ja, danke, das hilfreich ist. Ich war mir nicht sicher, wie ich den Kwarg an Matplotlib weitergeben sollte. Ich werde jetzt upvote, aber lassen Sie es ein wenig länger offen für den Fall, dass jemand Ideen über Kde oder ähnliches hat. – JohnE

+1

Seaborns kde plots verwendet die Python-Paket-Statmodelle für die Berechnungen. Die relevanten Funktionen nehmen ein Gewichtungsargument an, aber es scheint, dass dies nicht von Seaborn weitergeleitet wird. Die relevanten Quelldateien: https://github.com/mwaskom/seaborn/blob/master/seaborn/distributions.py und https://github.com/statsmodels/statsmodels/blob/master/statsmodels/nonparametric/kde.py – hitzg

+0

OK, danke. Es sieht so aus, als ob Gewichte noch nicht implementiert sind (ich kann das nicht aus einem schnellen Skim sagen). Wie auch immer, ich schließe das jetzt und stelle vielleicht zu einem späteren Zeitpunkt eine Frage, die sich mehr auf kde konzentriert. – JohnE

0

Ich löste dieses Problem durch Resampling der Datenpunkte basierend auf ihrem Gewicht.

Sie können es wie folgt tun:

`

from random import random 
from bisect import bisect 

def weighted_choice(choices): 
    values, weights = zip(*choices) 
    total = 0 
    cum_weights = [] 
    for w in weights: 
     total += w 
     cum_weights.append(total) 
    x = random() * total 
    i = bisect(cum_weights, x) 
    return values[i] 

samples = [([5, 0.5], 0.1), ([0, 10], 0.3), ([0, -4], 0.3)] 
choices = np.array([weighted_choice(samples) for c in range(1000)]) 
sns.distributions.kdeplot(choices[:, 0], choices[:, 1], shade=True) 

` enter image description here