Time_RCD / utils /slidingWindows.py
Oliver Le
Initial commit
d03866e
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