Spaces:
Running
Running
| 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 | |