2016-04-26 2 views
1

Мне нужно работать с взвешенными распределениями вероятности совсем немного и хотелось бы использовать скрипки для некоторой визуализации. Однако я не могу найти способ создать их с взвешенными данными у любого из обычных подозреваемых (matplotlib, seaborn, bokeh и т. Д.).Python: взвешенные скрипачки

Кто-нибудь знает о реализации или возможном обходном пути, позволяющем использовать взвешенные данные? Повторное создание искусственного невзвешенного распределения из взвешенных данных не представляется возможным из-за большого размера моих наборов данных. R имеет пакет wvioplot, но я бы очень хотел придерживаться Python.

+1

Это может помочь: [Violin участки для весовых данных в Matplotlib] (https://gist.github.com/jquacinella/1a6341f0f1446973714c) –

+0

какой метод вы используете для взвешивания данных? Вы говорите, что не можете найти пакет, который реализует этот метод для вас? – Sam

+0

Спасибо @AniMenon, что отлично работает! – sllrp

ответ

0

Ответ вывешены для справки:

import weighted 
from matplotlib.cbook import violin_stats 
from scipy import stats 
import statsmodels.api as sm 

def vdensity_with_weights(weights): 
    ''' Outer function allows innder function access to weights. Matplotlib 
    needs function to take in data and coords, so this seems like only way 
    to 'pass' custom density function a set of weights ''' 

    def vdensity(data, coords): 
     ''' Custom matplotlib weighted violin stats function ''' 
     # Using weights from closure, get KDE fomr statsmodels 
     weighted_cost = sm.nonparametric.KDEUnivariate(data) 
     weighted_cost.fit(fft=False, weights=weights) 

     # Return y-values for graph of KDE by evaluating on coords 
     return weighted_cost.evaluate(coords) 
    return vdensity 

def custom_violin_stats(data, weights): 
    # Get weighted median and mean (using weighted module for median) 
    median = weighted.quantile_1D(data, weights, 0.5) 
    mean, sumw = np.ma.average(data, weights=list(weights), returned=True) 

    # Use matplotlib violin_stats, which expects a function that takes in data and coords 
    # which we get from closure above 
    results = violin_stats(data, vdensity_with_weights(weights)) 

    # Update result dictionary with our updated info 
    results[0][u"mean"] = mean 
    results[0][u"median"] = median 

    # No need to do this, since it should be populated from violin_stats 
    # results[0][u"min"] = np.min(data) 
    # results[0][u"max"] = np.max(data) 

    return results 

### Example 
#vpstats1 = custom_violin_stats(np.asarray(df_column_data), np.asarray(df_column_weights)) 
#vplot = ax.violin(vpstats1, [pos_idx], vert=False, showmeans=True, showextrema=True, showmedians=True) 
#current_color_palette = ... 
#for pc in vplot['bodies']: 
# pc.set_facecolor(current_color_palette[pos_idx]) 
# pc.set_edgecolor('black') 

Ответ от: here

Смежные вопросы