from statsmodels.tsa.stattools import acf from scipy.signal import argrelextrema import numpy as np from statsmodels.graphics.tsaplots import plot_acf # determine sliding window (period) based on ACF def find_length_rank(data, rank=1): data = data.squeeze() if len(data.shape) > 1: return 0 if rank == 0: return 1 data = data[:min(20000, len(data))] base = 3 auto_corr = acf(data, nlags=400, fft=True)[base:] # plot_acf(data, lags=400, fft=True) # plt.xlabel('Lags') # plt.ylabel('Autocorrelation') # plt.title('Autocorrelation Function (ACF)') # plt.savefig('/data/liuqinghua/code/ts/TSAD-AutoML/AutoAD_Solution/candidate_pool/cd_diagram/ts_acf.png') local_max = argrelextrema(auto_corr, np.greater)[0] # print('auto_corr: ', auto_corr) # print('local_max: ', local_max) try: # max_local_max = np.argmax([auto_corr[lcm] for lcm in local_max]) sorted_local_max = np.argsort([auto_corr[lcm] for lcm in local_max])[::-1] # Ascending order max_local_max = sorted_local_max[0] # Default if rank == 1: max_local_max = sorted_local_max[0] if rank == 2: for i in sorted_local_max[1:]: if i > sorted_local_max[0]: max_local_max = i break if rank == 3: for i in sorted_local_max[1:]: if i > sorted_local_max[0]: id_tmp = i break for i in sorted_local_max[id_tmp:]: if i > sorted_local_max[id_tmp]: max_local_max = i break # print('sorted_local_max: ', sorted_local_max) # print('max_local_max: ', max_local_max) if local_max[max_local_max] < 3 or local_max[max_local_max] > 300: return 125 return local_max[max_local_max] + base except: return 125 # determine sliding window (period) based on ACF, Original version def find_length(data): if len(data.shape) > 1: return 0 data = data[:min(20000, len(data))] base = 3 auto_corr = acf(data, nlags=400, fft=True)[base:] local_max = argrelextrema(auto_corr, np.greater)[0] try: max_local_max = np.argmax([auto_corr[lcm] for lcm in local_max]) if local_max[max_local_max] < 3 or local_max[max_local_max] > 300: return 125 return local_max[max_local_max] + base except: return 125