Skip to content

Commit 18586a7

Browse files
authored
Merge pull request #1332 from cmu-delphi/release/indicators_v0.2.1_utils_v0.2.1
Release covidcast-indicators 0.2.1
2 parents 99e5495 + 2a396a3 commit 18586a7

File tree

10 files changed

+91
-32
lines changed

10 files changed

+91
-32
lines changed

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 0.2.0
2+
current_version = 0.2.1
33
commit = True
44
message = chore: bump covidcast-indicators to {new_version}
55
tag = False

_delphi_utils_python/.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 0.2.0
2+
current_version = 0.2.1
33
commit = True
44
message = chore: bump delphi_utils to {new_version}
55
tag = False

_delphi_utils_python/delphi_utils/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@
1414
from .signal import add_prefix
1515
from .nancodes import Nans
1616

17-
__version__ = "0.2.0"
17+
__version__ = "0.2.1"

_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: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,35 @@ 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:
107-
logger.critical(str(error), phase="validation")
120+
date_str = "*" if error.date is None else error.date.isoformat()
121+
logger.critical(str(error),
122+
phase = "validation",
123+
error_name = error.check_name,
124+
signal = error.signal,
125+
resolution = error.geo_type,
126+
date = date_str)
108127
for warning in self.raised_warnings:
109-
logger.warning(str(warning), phase="validation")
128+
date_str = "*" if warning.date is None else warning.date.isoformat()
129+
logger.warning(str(warning),
130+
phase="validation",
131+
error_name = warning.check_name,
132+
signal = warning.signal,
133+
resolution = warning.geo_type,
134+
date = date_str)
110135

111136
def print_and_exit(self, logger=None, die_on_failures=True):
112137
"""Print results and exit.

_delphi_utils_python/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
setup(
2727
name="delphi_utils",
28-
version="0.2.0",
28+
version="0.2.1",
2929
description="Shared Utility Functions for Indicators",
3030
long_description=long_description,
3131
long_description_content_type="text/markdown",

_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"

_delphi_utils_python/tests/validator/test_report.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class TestValidationReport:
1212
ERROR_2 = ValidationFailure("bad",
1313
filename="20201107_county_sig2.csv",
1414
message="msg 2")
15+
WARNING_1 = ValidationFailure("wrong import", date = None)
16+
WARNING_2 = ValidationFailure("right import", date = None)
1517

1618
def test_add_raised_unsuppressed_error(self):
1719
"""Test that an unsupressed error shows up in the unsuppressed error list."""
@@ -36,8 +38,8 @@ def test_str(self):
3638
report.increment_total_checks()
3739
report.increment_total_checks()
3840
report.increment_total_checks()
39-
report.add_raised_warning(ImportWarning("wrong import"))
40-
report.add_raised_warning(ImportWarning("right import"))
41+
report.add_raised_warning(self.WARNING_1)
42+
report.add_raised_warning(self.WARNING_2)
4143
report.add_raised_error(self.ERROR_1)
4244
report.add_raised_error(self.ERROR_2)
4345

@@ -48,15 +50,27 @@ def test_log(self):
4850
report.increment_total_checks()
4951
report.increment_total_checks()
5052
report.increment_total_checks()
51-
report.add_raised_warning(ImportWarning("wrong import"))
52-
report.add_raised_warning(ImportWarning("right import"))
53+
report.add_raised_warning(self.WARNING_1)
54+
report.add_raised_warning(self.WARNING_2)
5355
report.add_raised_error(self.ERROR_1)
5456
report.add_raised_error(self.ERROR_2)
5557

5658
report.log(mock_logger)
5759
mock_logger.critical.assert_called_once_with(
5860
"bad failed for sig2 at resolution county on 2020-11-07: msg 2",
59-
phase = "validation")
61+
phase = "validation", error_name = "bad",
62+
signal = "sig2", resolution = "county",
63+
date = "2020-11-07")
6064
mock_logger.warning.assert_has_calls(
61-
[mock.call("wrong import",phase = "validation"),
62-
mock.call("right import", phase = "validation")])
65+
[mock.call("wrong import failed for None at resolution None on *: ",
66+
phase = "validation",
67+
error_name = "wrong import",
68+
signal = None,
69+
resolution = None,
70+
date = '*'),
71+
mock.call("right import failed for None at resolution None on *: ",
72+
phase = "validation",
73+
error_name = "right import",
74+
signal = None,
75+
resolution = None,
76+
date = '*')])

ansible/templates/quidel_covidtest-params-prod.json.j2

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,17 @@
2626
"min_expected_lag": {"all": "5"},
2727
"max_expected_lag": {"all": "5"},
2828
"dry_run": true,
29-
"suppressed_errors": []
29+
"suppressed_errors": [
30+
{"check_name": "check_rapid_change_num_rows",
31+
"signal": "covid_ag_raw_pct_positive",
32+
"geo_type": "hrr"},
33+
{"check_name": "check_rapid_change_num_rows",
34+
"signal": "covid_ag_raw_pct_positive",
35+
"geo_type": "msa"},
36+
{"check_name": "check_rapid_change_num_rows",
37+
"signal": "covid_ag_raw_pct_positive",
38+
"geo_type": "county"}
39+
]
3040
},
3141
"static": {
3242
"minimum_sample_size": 50

quidel_covidtest/params.json.template

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,17 @@
2727
"min_expected_lag": {"all": "5"},
2828
"max_expected_lag": {"all": "5"},
2929
"dry_run": true,
30-
"suppressed_errors": []
30+
"suppressed_errors": [
31+
{"check_name": "check_rapid_change_num_rows",
32+
"signal": "covid_ag_raw_pct_positive",
33+
"geo_type": "hrr"},
34+
{"check_name": "check_rapid_change_num_rows",
35+
"signal": "covid_ag_raw_pct_positive",
36+
"geo_type": "msa"},
37+
{"check_name": "check_rapid_change_num_rows",
38+
"signal": "covid_ag_raw_pct_positive",
39+
"geo_type": "county"}
40+
]
3141
},
3242
"static": {
3343
"minimum_sample_size": 50

0 commit comments

Comments
 (0)