API reference

The class names remain stable. The methodological repair changes numerical contracts and withdraws unsupported methods; see methodology.

Allocation

  • geostep.SimpleRandomizationDesigner(num_groups=2, seed=42).design(df, geo_col)

  • geostep.StratifiedRandomizationDesigner(num_groups=2, n_strata=4, seed=42).design(df, geo_col, strat_vars)

  • geostep.designer.randomize_within_strata(df, geo_col, seed=42, stratum_col=None)

  • geostep.StaircaseDesigner(num_sequences, clusters_per_sequence, control_periods, intervention_periods).design()

  • StaircaseDesigner.randomize(geos, seed=42, geo_col='geo_id')

Parallel analysis

LiftAnalyzer and DiDAnalyzer accept config=AnalyzerConfig(...) and expose analyze(df, **options) and prepare_data(df, **options).

Required options are geo_col, assignment_col, date_col, kpi_col and test_period_start. Set pre_period_start, pre_period_end and test_period_end explicitly to freeze the windows. stratum_col selects named strata; a column called stratum is retained automatically.

Inference options are confidence_level, random_seed, use_bca_bootstrap, n_bootstrap, use_permutation_test and n_permutations. The config defaults are 95% confidence, 1000 bootstrap draws and no fixed bootstrap seed. The randomisation-test default is 9999 draws. Set a seed for repeatability. Unsupported or misspelt options raise ValidationError; options for CRT do not apply to parallel analysis.

check_balance(df, geo_col, assignment_col, covariates) requires prespecified pre-treatment geo summaries. It never extracts an arbitrary first time-varying covariate observation.

CRT analysis

CRTAnalyzer(config=None, bootstrap_reps=None, bootstrap_seed=None) exposes analyze(df, geo_col=..., period_col=..., assignment_col=..., kpi_col=...). Optional settings are confidence_level, random_seed, bootstrap_ci and n_bootstraps, plus stratum_col (currently rejected because stratified CRT inference is not implemented). Constructor bootstrap settings default to the config values. Retain the sequence column for incomplete staircase panels and resampling. The internal treatment and outcome columns are isolated from the input schema, so a KPI may use any valid input-column name.

Power and diagnostics

geostep.run_power_analysis supports parallel Lift and DiD. See the function’s signature for calendar durations, frozen strata, seeds, worker count and test selection. CRT/staircase power is not supported.

geostep.diagnostics provides check_balance, advanced_balance_check, perform_placebo_test, descriptive standardised differences and multiple_testing_correction. sensitivity_analysis_rosenbaum raises NotImplementedError; its former calculation was invalid. Pass stratum_col to perform_placebo_test when the primary parallel analysis used a named stratum column. Multiplicity correction accepts only a non-empty, finite sequence of p-values in [0, 1] and an alpha strictly between zero and one.

Results and figures

LiftResult, DiDResult and CRTResult expose estimate, p_value, confidence_interval, confidence_level, method, metadata, warnings and to_dict(). is_significant uses the result’s confidence level. A sharp-null p-value and an average-effect interval can disagree because they test different hypotheses. is_significant_at(alpha) also requires a successful result and a numeric threshold strictly between zero and one.

geostep.reports.generate_display_results_report formats the declared units. geostep.visualizer provides plot_lift_distribution, plot_did_results and plot_power_analysis. There is no plot_analysis_results function.