2015-04-27 8 views
5

Jaka jest moja najlepsza opcja dla wykresów typu rozkładu (histogram lub kde), gdy moje dane są ważone?Wykresy typu rozkładu (histogram/kde) z ważonymi danymi

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

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

To działa dobrze, ale Seaborn nie zaakceptuje ciężarów kwarg, tj

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

Byłoby również miło, gdyby kde zaakceptuje ciężary ale ani pandy ani Seaborn Wygląda na to pozwolić.

Zdaję sobie sprawę, że dane mogą zostać rozszerzone w celu udowodnienia ważenia i jest to łatwe, ale nie jest zbyt użyteczne w moich prawdziwych danych z wagami w setkach lub tysiącach, więc nie szukam takiego obejścia.

W każdym razie to wszystko. Próbuję tylko dowiedzieć się, co (jeśli w ogóle) mogę zrobić z ważonymi danymi poza podstawowym histogramem pand. Nie oszukałem jeszcze z bokeh, ale sugestie bokeh są również mile widziane.

Odpowiedz

4

Musisz zrozumieć, że seaborn używa bardzo funkcji plotowania matplotlib, które również używa pandas.

Jak documentation stanach sns.distplot nie akceptuje weights argumentu, jednak bierze hist_kws argument, który zostanie wysłany do podstawowej wezwanie do plt.hist. Tak więc, powinno to zrobić, co chcesz:

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

Tak, dzięki, że jest bardzo pomocna. Nie byłem pewien, jak przekazać kwarg do matplotlib. Przeprowadzę teraz przegłos, ale zostawię go nieco dłużej otwarty na wypadek, gdyby ktoś miał pomysły na temat KDE. – JohnE

+1

Seaborns kde działki wykorzystuje do obliczeń szablony pakietów Pythona. Odpowiednie funkcje przyjmują argumenty wagowe, ale wydaje się, że nie są one przekazywane przez seaborn. Odpowiednie pliki źródłowe: https://github.com/mwaskom/seaborn/blob/master/seaborn/distributions.py i https://github.com/statsmodels/statsmodels/blob/master/statsmodels/nonparametric/kde.py – hitzg

+0

OK, dzięki. Wygląda na to, że wagi mogą nie zostać jeszcze zaimplementowane (nie mogę powiedzieć na pewno z szybkiego podglądu). W każdym razie zamknę to teraz i może zadam pytanie bardziej skupione na kde w późniejszym czasie. – JohnE

0

Rozwiązałem ten problem przez resampling punktów danych na podstawie ich wagi.

Można to zrobić tak:

`

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

Powiązane problemy