# How to automatically determine if there is NO seasonality from PSD/FFT of time series?

I have around 1000 different time series, and for each one of them I want to automatically determine if there is any seasonality in the time series.

Given the assumption that there is seasonality present, it is easy to determine periodicity from FFT or PSD.

But how do you automatically decide that there is no seasonality or periodicity in the signal based on FFT or PSD?

def psd_time_series(y):
yAC = np.correlate(Y-np.mean(Y), Y-np.mean(Y), mode='full')
yAC = yAC/np.max(yAC) # not necessary, but scales large values
fft_yAC= np.fft.fft(yAC)
freqs = np.arange(0,len(fft_yAC))/len(fft_yAC)
psd = 10*np.log10(np.abs(fft_yAC)/max(np.abs(fft_yAC))
return psd,freqs

def determine_if_seasonal(psd):
### part I need help with

def detect_seasonality(y):

psd,freqs = psd_time_series(y)

seasonality = ... #### do some check of PSD to determine if seasonal

if seasonality:
periodicity = round(1/freqs[psd.argsort()[::-1]][0])
else:
periodicity = None
return periodicity


What would be a way of automatically determining that a single spike or Gaussian noise does not have seasonality based on the FFT or PSD of the time series? Is there any rule of thumb for the threshold of the magnitude of PSD? The prominence of peaks? Height of peaks?

For example, a PSD plot of a single spike might look like

FFT of a single spike

Or PSD of Gaussian noise might look like

FFT of Gaussian noise

Or PSD of an actual signal with periodicity might look like

FFT of the same signal

Appreciate any input or insights.

• your ffts clearly have very different lengths. Do the FFT of white noise (gaussianness doesn't matter, whiteness matters, and those are different things!) that has the same length as your signals, and you will have an answer quite apparent. Sep 27, 2021 at 10:08