Skip to content

Commit 072caf3

Browse files
authored
Merge pull request #1323 from cmu-delphi/outlier-warnings
Change outlier checks as warnings
2 parents b92109a + 95fdfb0 commit 072caf3

File tree

3 files changed

+30
-17
lines changed

3 files changed

+30
-17
lines changed

_delphi_utils_python/delphi_utils/validator/dynamic.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ def outlier_nearby(frame):
525525

526526
if source_outliers.shape[0] > 0:
527527
for time_val in source_outliers["time_value"].unique():
528-
report.add_raised_error(
528+
report.add_raised_warning(
529529
ValidationFailure(
530530
"check_positive_negative_spikes",
531531
time_val,
@@ -637,7 +637,7 @@ def check_avg_val_vs_reference(self, df_to_test, df_to_reference, checking_date,
637637
thres["mean_abs_z"])).any()
638638

639639
if mean_z_high or mean_abs_z_high:
640-
report.add_raised_error(
640+
report.add_raised_warning(
641641
ValidationFailure(
642642
"check_test_vs_reference_avg_changed",
643643
checking_date,

_delphi_utils_python/delphi_utils/validator/report.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,19 @@ def log(self, logger=None):
103103
checks_suppressed = self.num_suppressed,
104104
warnings = len(self.raised_warnings),
105105
phase="validation")
106+
# Threshold for slack alerts if warnings are excessive,
107+
# Currently extremely strict, set by observation of 1 month's logs
108+
excessive_warnings = self.total_checks > 0 and \
109+
(len(self.raised_warnings) > 200 or \
110+
len(self.raised_warnings) / self.total_checks > 0.015)
111+
if excessive_warnings:
112+
logger.info("Excessive number of warnings",
113+
data_source = self.data_source,
114+
checks_run = self.total_checks,
115+
checks_failed = len(self.unsuppressed_errors),
116+
checks_suppressed = self.num_suppressed,
117+
warnings = len(self.raised_warnings),
118+
phase = "validation")
106119
for error in self.unsuppressed_errors:
107120
date_str = "*" if error.date is None else error.date.isoformat()
108121
logger.critical(str(error),

_delphi_utils_python/tests/validator/test_dynamic.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ def test_10x_val(self):
202202
test_df, ref_df,
203203
datetime.combine(date.today(), datetime.min.time()), "geo", "signal", report)
204204

205-
assert len(report.raised_errors) == 1
206-
assert report.raised_errors[0].check_name == "check_test_vs_reference_avg_changed"
205+
assert len(report.raised_warnings) == 1
206+
assert report.raised_warnings[0].check_name == "check_test_vs_reference_avg_changed"
207207

208208
def test_100x_val(self):
209209
validator = DynamicValidator(self.params)
@@ -223,8 +223,8 @@ def test_100x_val(self):
223223
test_df, ref_df,
224224
datetime.combine(date.today(), datetime.min.time()), "geo", "signal", report)
225225

226-
assert len(report.raised_errors) == 1
227-
assert report.raised_errors[0].check_name == "check_test_vs_reference_avg_changed"
226+
assert len(report.raised_warnings) == 1
227+
assert report.raised_warnings[0].check_name == "check_test_vs_reference_avg_changed"
228228

229229
def test_1000x_val(self):
230230
validator = DynamicValidator(self.params)
@@ -244,8 +244,8 @@ def test_1000x_val(self):
244244
test_df, ref_df,
245245
datetime.combine(date.today(), datetime.min.time()), "geo", "signal", report)
246246

247-
assert len(report.raised_errors) == 1
248-
assert report.raised_errors[0].check_name == "check_test_vs_reference_avg_changed"
247+
assert len(report.raised_warnings) == 1
248+
assert report.raised_warnings[0].check_name == "check_test_vs_reference_avg_changed"
249249

250250

251251
class TestDataOutlier:
@@ -292,8 +292,8 @@ def test_pos_outlier(self):
292292
validator.check_positive_negative_spikes(
293293
test_df, ref_df, "state", "signal", report)
294294

295-
assert len(report.raised_errors) == 2
296-
assert report.raised_errors[0].check_name == "check_positive_negative_spikes"
295+
assert len(report.raised_warnings) == 2
296+
assert report.raised_warnings[0].check_name == "check_positive_negative_spikes"
297297

298298
def test_neg_outlier(self):
299299
validator = DynamicValidator(self.params)
@@ -329,8 +329,8 @@ def test_neg_outlier(self):
329329
validator.check_positive_negative_spikes(
330330
test_df, ref_df, "state", "signal", report)
331331

332-
assert len(report.raised_errors) == 2
333-
assert report.raised_errors[0].check_name == "check_positive_negative_spikes"
332+
assert len(report.raised_warnings) == 2
333+
assert report.raised_warnings[0].check_name == "check_positive_negative_spikes"
334334

335335
def test_zero_outlier(self):
336336
validator = DynamicValidator(self.params)
@@ -365,8 +365,8 @@ def test_zero_outlier(self):
365365
validator.check_positive_negative_spikes(
366366
test_df, ref_df, "state", "signal", report)
367367

368-
assert len(report.raised_errors) == 1
369-
assert report.raised_errors[0].check_name == "check_positive_negative_spikes"
368+
assert len(report.raised_warnings) == 1
369+
assert report.raised_warnings[0].check_name == "check_positive_negative_spikes"
370370

371371
def test_no_outlier(self):
372372
validator = DynamicValidator(self.params)
@@ -402,7 +402,7 @@ def test_no_outlier(self):
402402
validator.check_positive_negative_spikes(
403403
test_df, ref_df, "state", "signal", report)
404404

405-
assert len(report.raised_errors) == 0
405+
assert len(report.raised_warnings) == 0
406406

407407
def test_source_api_overlap(self):
408408
validator = DynamicValidator(self.params)
@@ -438,5 +438,5 @@ def test_source_api_overlap(self):
438438
validator.check_positive_negative_spikes(
439439
test_df, ref_df, "state", "signal", report)
440440

441-
assert len(report.raised_errors) == 2
442-
assert report.raised_errors[0].check_name == "check_positive_negative_spikes"
441+
assert len(report.raised_warnings) == 2
442+
assert report.raised_warnings[0].check_name == "check_positive_negative_spikes"

0 commit comments

Comments
 (0)