Что ж, лучше и проще для меня было просто использовать модель FFT-filtering-IFFT, это так просто, как кажется, сначала я построил FFt для своих данных, используя:
one_year_values=48*365
data=elec_price[:one_year_values]
from numpy.fft import fft, fftfreq, ifft
n=len(data)
freqs=fftfreq(n)
mask = freqs>0
fft_values=fft(data)
fft_list=np.copy(fft_values).tolist()
fft_filtered=np.copy(fft_list).tolist() # copying from the original fft list in order to filter it
power= 2*(np.abs(fft_values/one_year_values))**2 # calculating the power make sit easy to compare between frequency components, because they are complex numbers, and the power of them gets the absolute values of them.
power=power.tolist()
после этого я отсортировал список мощностей по амплитудам и использовал 10 верхних частот, которые для моих данных: 0,365,17155,1,17519,11,17509,366,17154,2,17518 обратите внимание, что 0 является компонентом постоянного токав данных, так что вы можете использовать его или нет, в зависимости от того, хотите ли вы смещения в сезонности или нет.Также обратите внимание, что каждая из этих частот является парами, что каждая пара является зеркалами друг друга, и их так как FFT представляет собой график, где каждый частотный компонент и его отрицательная частота имеют одинаковую мощность.После выбора 5 верхних частот я отфильтровал список FFT_filtered:
tuple(fft_filtered)
for i in range(len(fft_filtered)):
fft_filtered[i]=0
for i in (0
,365
,17155
,1
,17519
,11
,17509
,366
,17154
,2
,17518):
fft_filtered[i]=fft_list[i]
Затем я почитал FFt, используя IFFT, чтобы получить график данных с использованием 5 верхних частот:
reverse=np.real(ifft(fft_filtered))
#%%
plt.plot(reverse)
plt.legend(loc='best')
plt.ylabel('seasonal factor')
plt.xlabel('time stamps')
plt.title('1st year seasonality-top 5 freq')
plt.show(block=False)
и вот график обратного списка: 1 год сезонности с использованием 5 лучших частот