Skip to content

Commit 09f3319

Browse files
committed
fix(monitors): widen prediction thresholds
1 parent b2f0381 commit 09f3319

3 files changed

Lines changed: 21 additions & 13 deletions

File tree

testgen/commands/test_thresholds_prediction.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import ClassVar
44

55
import pandas as pd
6+
from scipy import stats
67

78
from testgen.common.database.database_service import (
89
execute_db_queries,
@@ -29,13 +30,14 @@ class TestThresholdsPrediction:
2930
"prediction",
3031
)
3132
num_forecast = 10
33+
t_distribution_threshold = 20
3234
z_score_map: ClassVar = {
33-
("lower_tolerance", PredictSensitivity.low): -2.0, # 2.5th percentile
34-
("lower_tolerance", PredictSensitivity.medium): -1.5, # 7th percentile
35-
("lower_tolerance", PredictSensitivity.high): -1.0, # 16th percentile
36-
("upper_tolerance", PredictSensitivity.high): 1.0, # 84th percentile
37-
("upper_tolerance", PredictSensitivity.medium): 1.5, # 93rd percentile
38-
("upper_tolerance", PredictSensitivity.low): 2.0, # 97.5th percentile
35+
("lower_tolerance", PredictSensitivity.low): -3.0, # 0.13th percentile
36+
("lower_tolerance", PredictSensitivity.medium): -2.5, # 0.62nd percentile
37+
("lower_tolerance", PredictSensitivity.high): -2.0, # 2.3rd percentile
38+
("upper_tolerance", PredictSensitivity.high): 2.0, # 97.7th percentile
39+
("upper_tolerance", PredictSensitivity.medium): 2.5, # 99.4th percentile
40+
("upper_tolerance", PredictSensitivity.low): 3.0, # 99.87th percentile
3941
}
4042

4143
def __init__(self, test_suite: TestSuite, run_date: datetime):
@@ -71,9 +73,15 @@ def run(self) -> None:
7173
] if self.test_suite.predict_holiday_codes else None,
7274
)
7375

76+
num_points = len(history)
7477
for key, z_score in self.z_score_map.items():
78+
if num_points < self.t_distribution_threshold:
79+
percentile = stats.norm.cdf(z_score)
80+
multiplier = stats.t.ppf(percentile, df=num_points - 1)
81+
else:
82+
multiplier = z_score
7583
column = f"{key[0]}|{key[1].value}"
76-
forecast[column] = forecast["mean"] + (z_score * forecast["se"])
84+
forecast[column] = forecast["mean"] + (multiplier * forecast["se"])
7785

7886
next_date = forecast.index[0]
7987
sensitivity = self.test_suite.predict_sensitivity or PredictSensitivity.medium

testgen/ui/components/frontend/js/components/monitor_settings_form.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,9 @@ const PredictionForm = (
286286
name: 'predict_sensitivity',
287287
label: 'Sensitivity',
288288
options: [
289-
{ label: 'Low', value: 'low', help: 'Fewer alerts. Flag values outside 2 standard deviations of predicted value.' },
290-
{ label: 'Medium', value: 'medium', help: 'Balanced. Flag values outside 1.5 standard deviations of predicted value.' },
291-
{ label: 'High', value: 'high', help: 'More alerts. Flag values outside 1 standard deviation of predicted value.' },
289+
{ label: 'Low', value: 'low', help: 'Fewer alerts. Flag values outside 3 standard deviations of predicted value.' },
290+
{ label: 'Medium', value: 'medium', help: 'Balanced. Flag values outside 2.5 standard deviations of predicted value.' },
291+
{ label: 'High', value: 'high', help: 'More alerts. Flag values outside 2 standard deviations of predicted value.' },
292292
],
293293
value: predictSensitivity,
294294
onChange: (value) => predictSensitivity.val = value,

testgen/ui/static/js/components/monitor_settings_form.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,9 @@ const PredictionForm = (
286286
name: 'predict_sensitivity',
287287
label: 'Sensitivity',
288288
options: [
289-
{ label: 'Low', value: 'low', help: 'Fewer alerts. Flag values outside 2 standard deviations of predicted value.' },
290-
{ label: 'Medium', value: 'medium', help: 'Balanced. Flag values outside 1.5 standard deviations of predicted value.' },
291-
{ label: 'High', value: 'high', help: 'More alerts. Flag values outside 1 standard deviation of predicted value.' },
289+
{ label: 'Low', value: 'low', help: 'Fewer alerts. Flag values outside 3 standard deviations of predicted value.' },
290+
{ label: 'Medium', value: 'medium', help: 'Balanced. Flag values outside 2.5 standard deviations of predicted value.' },
291+
{ label: 'High', value: 'high', help: 'More alerts. Flag values outside 2 standard deviations of predicted value.' },
292292
],
293293
value: predictSensitivity,
294294
onChange: (value) => predictSensitivity.val = value,

0 commit comments

Comments
 (0)