Плотность графика с использованием весов наблюдения

Есть ли способ построить плотность, используя данные, которые имеют веса наблюдения?

У меня есть вектор наблюдений x и вектор целочисленных весов y, так что y1 указывает, сколько у нас наблюдений x1. То есть плотность

   x    y 
   1    2
   2    2
   2    3 

равна плотности 1, 1, 2, 2, 2, 2 ,2 (2x1, 5x2). Насколько я понимаю, matplotlib.pyplot.hist(weights=y) позволяют использовать веса наблюдения при построении гистограммы. Есть ли эквивалент для вычисления и построения графика плотности?

Причина, по которой я хочу, чтобы пакет мог это сделать, заключается в том, что мои данные очень велики, и я ищу более эффективную альтернативу.

В качестве альтернативы я открыт для других пакетов.


person FooBar    schedule 12.11.2014    source источник
comment
Вам нужно только генерировать плотности из наблюдений?   -  person Reut Sharabani    schedule 13.11.2014
comment
Извините за путаницу, я хочу построить плотность, как в stackoverflow.com/questions/4150171/   -  person FooBar    schedule 13.11.2014
comment
так что, насколько я понимаю, вам нужно только создать список, который вы называете histogram, и отправить его в один из предложенных пакетов. У вас проблемы с созданием этого списка из наблюдений, или у вас есть список, и у вас проблемы с пакетом? Или оба?   -  person Reut Sharabani    schedule 13.11.2014
comment
Я говорю, что знаю функции, позволяющие строить гистограммы с использованием весов наблюдения. С другой стороны, я не знаю функций, позволяющих строить графики плотности с использованием этих весов. Я привожу сравнение, учитывая, что плотности — это несколько предельные случаи гистограмм. Я не знаю, как можно построить плотность с помощью гистограмм.   -  person FooBar    schedule 13.11.2014
comment
Аааа теперь я понял...! Извините, тут ничем помочь не могу :)   -  person Reut Sharabani    schedule 13.11.2014
comment
см. график скрипки в mpl 1.4 и оценки KDE от scipy.   -  person tacaswell    schedule 13.11.2014


Ответы (1)


Statsmodels' kde univariate получает веса в своей функции соответствия. См. вывод следующего кода.

import matplotlib.pyplot as plt
import statsmodels.api as sm
import pandas as pd

df = pd.DataFrame({'x':[1.,2.],'weight':[2,4]})
weighted = sm.nonparametric.KDEUnivariate(df.x)
noweight = sm.nonparametric.KDEUnivariate(df.x)
weighted.fit(fft=False, weights=df.weight)
noweight.fit()

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.plot(noweight.support, noweight.density)
ax2.plot(weighted.support, weighted.density)

ax1.set_title('No Weight')
ax2.set_title('Weighted')

Вывод: Без веса против взвешенной плотности

Примечание. Ваша проблема со временем, связанная с созданием массива, вероятно, не будет решена с помощью этого. Потому что, как указано в исходном коде:

Если FFT имеет значение False, то создается промежуточный массив «number_of_obs» x «gridsize».

person tozCSS    schedule 08.11.2015
comment
Используйте ax1.plot(noweight.support, noweight.density), чтобы получить правильные значения по оси x. Также обратите внимание, что веса должны быть массивом numpy (или столбцом в пандах), иначе у вас будет код, жалующийся, что он не может сделать weights.sum() - person fuyas; 30.05.2018