Необъяснимые «капли» в савгольском сглаживании с более высоким полиномом для трендов, запасов, энергетических данных (все виды временных рядов в основном!) - PullRequest
0 голосов
/ 11 апреля 2020

Я пытался сгладить кривые с помощью Savgol (scikit) и, в нескольких моих попытках, поднятие степени полинома привело к «падениям», подобным тому, который я показываю ниже. Этот пример взят из данных о тенденциях Google, но у меня были похожие проблемы с данными о запасах и потреблении электроэнергии. Любая информация о том, почему он ведет себя так или как его решить (и может повысить степень полинома), будет принята с благодарностью. Изображение ниже: «Пример вывода».

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

from pytrends.request import TrendReq
pytrends = TrendReq(hl='en-US', tz=360)
from scipy.signal import savgol_filter
kw_list = ["Carbon footprint"]
pytrends.build_payload(kw_list, timeframe='2004-12-14 2019-12-25', geo='', gprop='')


da1 = pytrends.interest_over_time()
#(drop last one for Savgol as need odd number, used to have 196 records)

Y3 = da1["Carbon footprint"]


fig = plt.figure(figsize=(18,9))

l = Y3.shape[0]
l = l if l%2 == 1 else l-1
# window = odd number closest to size of data

ax1 = plt.subplot(2,1,1)
ax1 = sns.lineplot(data=Y3, color="navy")
#Savgol with polynomial order = 7 is fine (but misses the initial plateau)
Y3_smooth = savgol_filter(Y3,l, 7) 
ax1 = sns.lineplot(x=da1.index.to_pydatetime(),y=Y3_smooth, color="red")
plt.title(f"red = with Savgol, polynomial order = 7, window = {l}", fontsize=18)


ax2 = plt.subplot(2,1,2)
ax2 = sns.lineplot(data=Y3, color="navy")
#Savgol with polynomial order = 9 or more has a weird drop
Y3_smooth = savgol_filter(Y3,l, 10) 
ax2 = sns.lineplot(x=da1.index.to_pydatetime(),y=Y3_smooth, color="red")
plt.title(f"red = with Savgol, polynomial order = 10, window = {l}", fontsize=18)

Пример вывода

1 Ответ

0 голосов
/ 16 апреля 2020

Если кому-то интересно, я нашел этот обходной путь, используя другой способ сглаживания. Он хорошо работает, в том числе в начале и в конце, и позволяет точно настроить степень сглаживания.

from scipy.ndimage.filters import gaussian_filter1d

def smooth(y, sigma=2):
    y_smooth = gaussian_filter1d(y, sigma)
    return y_smooth
...