From 8a5f890ddb686e7496232d878949836ea11344fa Mon Sep 17 00:00:00 2001 From: Anna Scholtz Date: Wed, 24 Jun 2026 14:44:44 -0700 Subject: [PATCH 1/2] Fix analysis_period_length in pre treatments --- jetstream/analysis.py | 4 ++-- jetstream/statistics.py | 6 +++--- jetstream/tests/test_statistics.py | 31 ++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/jetstream/analysis.py b/jetstream/analysis.py index 4788403c..f3d5499a 100644 --- a/jetstream/analysis.py +++ b/jetstream/analysis.py @@ -1386,9 +1386,9 @@ def run( segment_labels = ["all"] + [s.name for s in self.config.experiment.segments] analysis_length_dates = 1 - if period.value == AnalysisPeriod.OVERALL: + if period == AnalysisPeriod.OVERALL: analysis_length_dates = time_limits.analysis_length_dates - elif period.value == AnalysisPeriod.WEEK: + elif period == AnalysisPeriod.WEEK: analysis_length_dates = 7 for analysis_basis in analysis_bases: diff --git a/jetstream/statistics.py b/jetstream/statistics.py index c26586f2..197f665b 100644 --- a/jetstream/statistics.py +++ b/jetstream/statistics.py @@ -78,10 +78,10 @@ def from_config( continue if pre_treatment.name() == pre_treatment_conf.name: found = True - # inject analysis_period_length from experiment - pre_treatment.analysis_period_length = analysis_period_length or 1 + pre_treatment_instance = pre_treatment.from_dict(pre_treatment_conf.args) + pre_treatment_instance.analysis_period_length = analysis_period_length or 1 - pre_treatments.append(pre_treatment.from_dict(pre_treatment_conf.args)) + pre_treatments.append(pre_treatment_instance) if not found: raise ValueError(f"Could not find pre-treatment {pre_treatment_conf.name}.") diff --git a/jetstream/tests/test_statistics.py b/jetstream/tests/test_statistics.py index a44aa844..d62799a8 100644 --- a/jetstream/tests/test_statistics.py +++ b/jetstream/tests/test_statistics.py @@ -52,6 +52,37 @@ def __repr__(self): class TestStatistics: + def test_summary_from_config_injects_analysis_period_length(self): + """normalize_over_analysis_period must receive the experiment's analysis period length + on the resulting pre-treatment instance. Otherwise values are divided by the default + of 1 (a no-op) and weekly/overall metrics are not scaled down.""" + from metric_config_parser.metric import Metric as ConfigMetric + from metric_config_parser.metric import Summary as ConfigSummary + from metric_config_parser.pre_treatment import PreTreatmentReference + from metric_config_parser.statistic import Statistic as ConfigStatistic + + from jetstream.statistics import Summary + + summary_config = ConfigSummary( + metric=ConfigMetric( + name="dau_per_1000_clients", data_source=None, select_expression="1" + ), + statistic=ConfigStatistic(name="bootstrap_mean", params={}), + pre_treatments=[ + PreTreatmentReference(name="normalize_over_analysis_period", args={}) + ], + ) + + summary = Summary.from_config(summary_config, 7, AnalysisPeriod.WEEK) + + (pre_treatment,) = summary.pre_treatments + assert pre_treatment.analysis_period_length == 7 + + # the pre-treatment actually scales values by the period length (7-day week) + df = pd.DataFrame({"dau_per_1000_clients": [1400.0, 7000.0]}) + out = pre_treatment.apply(df, "dau_per_1000_clients") + assert list(out["dau_per_1000_clients"]) == [200.0, 1000.0] + def test_bootstrap_means(self): stat = BootstrapMean(num_samples=10) test_data = pd.DataFrame( From de4c772b650ec9de0769354f75c265fff8507782 Mon Sep 17 00:00:00 2001 From: Anna Scholtz Date: Wed, 24 Jun 2026 14:54:27 -0700 Subject: [PATCH 2/2] format --- jetstream/tests/test_statistics.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jetstream/tests/test_statistics.py b/jetstream/tests/test_statistics.py index d62799a8..e24e1ea6 100644 --- a/jetstream/tests/test_statistics.py +++ b/jetstream/tests/test_statistics.py @@ -68,9 +68,7 @@ def test_summary_from_config_injects_analysis_period_length(self): name="dau_per_1000_clients", data_source=None, select_expression="1" ), statistic=ConfigStatistic(name="bootstrap_mean", params={}), - pre_treatments=[ - PreTreatmentReference(name="normalize_over_analysis_period", args={}) - ], + pre_treatments=[PreTreatmentReference(name="normalize_over_analysis_period", args={})], ) summary = Summary.from_config(summary_config, 7, AnalysisPeriod.WEEK)