Я пытаюсь подогнать плотность ядра под временной ряд S & P Returns.Однако результирующая плотность в основном постоянная.Сначала я использую stats.gaussian_kde и сравниваю с плотностью ядра Scikit.
Код следующий:
temp_data = mc_data.iloc[idx_r]['SPX Returns'].dropna().values
X_plot = np.linspace(temp_data.min(),temp_data.max(),100)
kernel = stats.gaussian_kde(temp_data, bw_method='scott')
pdf = kernel.evaluate(X_plot)
fig, ax = plt.subplots()
ax.plot(X_plot, pdf, linewidth=3, alpha=0.5)
ax.hist(temp_data, fc='gray', histtype='stepfilled', alpha=0.3, density=False)
plt.show()
, что дает следующий результат
И второйверсия, использующая scikit:
k_data = temp_data.reshape(-1,1)
kde = KernelDensity(kernel='gaussian', bandwidth=1).fit(k_data)
x_plot = X_plot.reshape(-1,1)
pre_pdf2 = kde.score_samples(x_plot)
pdf2 = np.exp(pre_pdf2)
fig, ax = plt.subplots()
ax.plot(X_plot, pdf2 , linewidth=3, alpha=0.5)
ax.hist(temp_data, fc='gray', histtype='stepfilled', alpha=0.3, density=False)
plt.show()
выход:
После проверки значений pdf2 я вижу, чтомассив значений, разность которых относительно следующей позиции в массиве имеет порядок 10e-8, так что в значительной степени это массив постоянных значений.
Почему KernelDensity не возвращает правильную плотность?