From d885b7ec2206ab861406f9c52d2b68da8aa48278 Mon Sep 17 00:00:00 2001 From: Alexandr Velikiy <39257464+VargBurz@users.noreply.github.com> Date: Tue, 25 Sep 2018 17:59:39 +0300 Subject: [PATCH] Anti-segments in general model #142 (#174) --- analytics/models/general_model.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/analytics/models/general_model.py b/analytics/models/general_model.py index 362dda5..0a1e9f4 100644 --- a/analytics/models/general_model.py +++ b/analytics/models/general_model.py @@ -18,8 +18,10 @@ class GeneralModel(Model): super() self.segments = [] self.ipats = [] + self.model_gen = [] self.state = { - 'convolve_max': 200, + 'convolve_max': 240, + 'convolve_min': 200, 'WINDOW_SIZE': 240, } self.all_conv = [] @@ -27,6 +29,7 @@ class GeneralModel(Model): def do_fit(self, dataframe: pd.DataFrame, segments: list) -> None: data = dataframe['value'] convolve_list = [] + patterns_list = [] for segment in segments: if segment['labeled']: segment_from_index = utils.timestamp_to_index(dataframe, pd.to_datetime(segment['from'], unit='ms')) @@ -40,26 +43,37 @@ class GeneralModel(Model): segment_data = data[x - self.state['WINDOW_SIZE'] : x + self.state['WINDOW_SIZE']] segment_min = min(segment_data) segment_data = segment_data - segment_min - convolve = scipy.signal.fftconvolve(segment_data, segment_data) - convolve_list.append(max(convolve)) + patterns_list.append(segment_data) + + self.model_gen = utils.get_av_model(patterns_list) + for n in range(len(segments)): #labeled segments + labeled_data = data[self.ipats[n] - self.state['WINDOW_SIZE']: self.ipats[n] + self.state['WINDOW_SIZE'] + 1] + labeled_data = labeled_data - min(labeled_data) + auto_convolve = scipy.signal.fftconvolve(labeled_data, labeled_data) + convolve_data = scipy.signal.fftconvolve(labeled_data, self.model_gen) + convolve_list.append(max(auto_convolve)) + convolve_list.append(max(convolve_data)) if len(convolve_list) > 0: self.state['convolve_max'] = float(max(convolve_list)) else: self.state['convolve_max'] = self.state['WINDOW_SIZE'] / 3 + + if len(convolve_list) > 0: + self.state['convolve_min'] = float(min(convolve_list)) + else: + self.state['convolve_min'] = self.state['WINDOW_SIZE'] / 3 def do_predict(self, dataframe: pd.DataFrame) -> list: data = dataframe['value'] - pat_data = data[self.ipats[0] - self.state['WINDOW_SIZE']: self.ipats[0] + self.state['WINDOW_SIZE']] - x = min(pat_data) - pat_data = pat_data - x + pat_data = self.model_gen y = max(pat_data) for i in range(self.state['WINDOW_SIZE'] * 2, len(data)): watch_data = data[i - self.state['WINDOW_SIZE'] * 2: i] w = min(watch_data) watch_data = watch_data - w - conv = scipy.signal.fftconvolve(pat_data, watch_data) + conv = scipy.signal.fftconvolve(watch_data, pat_data) self.all_conv.append(max(conv)) all_conv_peaks = utils.peak_finder(self.all_conv, self.state['WINDOW_SIZE'] * 2) @@ -72,7 +86,7 @@ class GeneralModel(Model): delete_list = [] for val in segments: - if self.all_conv[val] < self.state['convolve_max'] * 0.8: + if self.all_conv[val] < self.state['convolve_min'] * 0.8: delete_list.append(val) for item in delete_list: