diff --git a/analytics/analytics/models/model.py b/analytics/analytics/models/model.py index a8a16ad..db2c132 100644 --- a/analytics/analytics/models/model.py +++ b/analytics/analytics/models/model.py @@ -79,11 +79,6 @@ class Model(ABC): self.state['WINDOW_SIZE'] = math.ceil(max_length / 2) if max_length else 0 model, model_type = self.get_model_type() learning_info = self.get_parameters_from_segments(dataframe, labeled, deleted, model, model_type) - if self.state.get('pattern_center') and self.state.get('pattern_model'): - for center in self.state['pattern_center']: - aligned_segment = utils.get_interval(data, center, self.state['WINDOW_SIZE']) - aligned_segment = utils.subtract_min_without_nan(aligned_segment) - learning_info['patterns_list'].append(aligned_segment) self.do_fit(dataframe, labeled, deleted, learning_info) return self.state diff --git a/analytics/analytics/utils/common.py b/analytics/analytics/utils/common.py index 82a0a31..4d7b3a1 100644 --- a/analytics/analytics/utils/common.py +++ b/analytics/analytics/utils/common.py @@ -80,21 +80,23 @@ def ar_mean(numbers): return float(sum(numbers)) / max(len(numbers), 1) def get_av_model(patterns_list): - if len(patterns_list) == 0: - return [] - x = len(patterns_list[0]) - if len(patterns_list) > 1 and len(patterns_list[1]) != x: - raise ValueError('All elements of patterns_list should have same length') - - model_pat = [] - for i in range(x): - av_val = [] - for val in patterns_list: - if type(val) == pd.Series: - val = val.values - av_val.append(val[i]) - model_pat.append(ar_mean(av_val)) - return model_pat + if not patterns_list: return [] + patterns_list = get_same_length(patterns_list) + value_list = list(map(list, zip(*patterns_list))) + return list(map(ar_mean, value_list)) + +def get_same_length(patterns_list): + for index in range(len(patterns_list)): + if type(patterns_list[index]) == pd.Series: + patterns_list[index] = patterns_list[index].tolist() + patterns_list = list(filter(None, patterns_list)) + max_length = max(map(len, patterns_list)) + for pat in patterns_list: + if len(pat) < max_length: + length_difference = max_length - len(pat) + added_values = list(0 for _ in range(length_difference)) + pat.extend(added_values) + return patterns_list def close_filtering(pattern_list, win_size): if len(pattern_list) == 0: diff --git a/analytics/tests/test_dataset.py b/analytics/tests/test_dataset.py index 96c77d4..06124dc 100644 --- a/analytics/tests/test_dataset.py +++ b/analytics/tests/test_dataset.py @@ -229,11 +229,31 @@ class TestDataset(unittest.TestCase): } data_val = [1.0, 1.0, 1.0, 4.0, 4.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 4.0, 4.0, 4.0, 4.0] dataframe = create_dataframe(data_val) - segments = [{'_id': 'Esl7uetLhx4lCqHa', 'analyticUnitId': 'opnICRJwOmwBELK8', 'from': 1523889000010, 'to': 1523889000012, 'labeled': True, 'deleted': False}] + segments = [{'_id': 'Esl7uetLhx4lCqHa', 'analyticUnitId': 'opnICRJwOmwBELK8', 'from': 152388900009, 'to': 1523889000013, 'labeled': True, 'deleted': False}] model = models.JumpModel() result = model.fit(dataframe, segments, cache) self.assertEqual(len(result['pattern_center']), 3) + def test_models_for_pattern_model_cache(self): + cache = { + 'pattern_center': [4, 12], + 'pattern_model': [], + 'confidence': 2, + 'convolve_max': 8, + 'convolve_min': 7, + 'WINDOW_SIZE': 2, + 'conv_del_min': 0, + 'conv_del_max': 0, + } + data_val = [5.0, 5.0, 5.0, 5.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 9.0, 9.0, 0, 0, 0, 0, 0, 0, 6.0, 6.0, 6.0, 1.0, 1.0, 1.0, 1.0, 1.0] + dataframe = create_dataframe(data_val) + segments = [{'_id': 'Esl7uetLhx4lCqHa', 'analyticUnitId': 'opnICRJwOmwBELK8', 'from': 1523889000019, 'to': 1523889000024, 'labeled': True, 'deleted': False}] + try: + model = models.DropModel() + model_name = model.__class__.__name__ + model.fit(dataframe, segments, cache) + except ValueError: + self.fail('Model {} raised unexpectedly'.format(model_name)) if __name__ == '__main__': unittest.main() diff --git a/analytics/tests/test_utils.py b/analytics/tests/test_utils.py index c1d24f7..17d9a3f 100644 --- a/analytics/tests/test_utils.py +++ b/analytics/tests/test_utils.py @@ -129,7 +129,12 @@ class TestUtils(unittest.TestCase): patterns_list = [] result = [] self.assertEqual(utils.get_av_model(patterns_list), result) - + + def test_get_av_model_normal_data(self): + patterns_list = [[1, 1, 1], [2, 2, 2],[3,3,3]] + result = [2.0, 2.0, 2.0] + self.assertEqual(utils.get_av_model(patterns_list), result) + def test_find_jump_nan_data(self): data = [np.NaN, np.NaN, np.NaN, np.NaN] data = pd.Series(data) @@ -207,6 +212,13 @@ class TestUtils(unittest.TestCase): utils.get_convolve(segemnts, av_model, data, window_size) except ValueError: self.fail('Method get_convolve raised unexpectedly') + + def test_get_av_model_for_different_length(self): + patterns_list = [[1.0, 1.0, 2.0], [4.0, 4.0], [2.0, 2.0, 2.0], [3.0, 3.0], []] + try: + utils.get_av_model(patterns_list) + except ValueError: + self.fail('Method get_convolve raised unexpectedly') if __name__ == '__main__': unittest.main()