This release is a pre-release and may not be stable for production use.
increment
Analyze experiments directly from your warehouse or a dataframe.
Estimate treatment effects, quantify uncertainty, and inform decisions using data that already exists. Define warehouse analyses in version-controlled YAML, or start directly from a dataframe. Increment does not assign traffic, ship feature flags, or maintain a separate event store.
Quickstart · Warehouse analysis · Documentation · Statistical limitations
What you can do
- Analyze experiments — estimate effects, reduce variance with CUPED, apply multiple-comparison corrections, and check sample-ratio mismatch.
- Bayesian inference — combine prior beliefs with experiment data to estimate effects and probabilities of benefit.
- Plan and monitor — solve for sample size, power, and minimum detectable effect; use sequential methods for repeated looks under their stated assumptions.
- Estimate causal effects — use IPTW, DML, or AIPW for observational treatments from dataframes, or analyze encouragement designs and switchback contrasts.
- Explore and report — inspect breakouts, trends, and heterogeneous treatment effects; produce readout tables, dashboards, and sitewide-impact estimates.
Not every method works with every metric or design. The method guide helps you choose; the compatibility matrix shows supported combinations.
Quickstart
Requires Python 3.12–3.14. Install the pre-release package and Polars for this example:
pip install --pre increment polars
Start with one row per randomization unit. This example generates a small control/treatment dataset and estimates the relative change in mean revenue:
from random import Random
import polars as pl
from increment import Analysis
rng = Random(0)
df = pl.DataFrame(
{
"user_id": [f"u{i}" for i in range(200)],
"variant": ["control"] * 100 + ["treatment"] * 100,
"revenue": [rng.gauss(20 + (i >= 100), 5) for i in range(200)],
}
)
results = Analysis.from_unit_summary(
df,
unit="user_id",
group="variant",
control="control",
metrics={"revenue": "mean"},
).run()
for result in results:
print(f"{result.metric}: lift={result.lift.value:+.1%}")
revenue: lift=+7.5%
Replace the generated data with your own unit-level dataframe. No YAML, warehouse
connection, or DuckDB is required. Other Narwhals-supported eager dataframes work
as well. For unit-by-day data, use Analysis.from_unit_panel.
The dataframe quickstart covers metric declarations, missing values, analysis plans, uncertainty intervals, and monitoring.
Connect your warehouse
Declare sources, exposures, metrics, and experiments in YAML. Bind the definitions to an Ibis connection to inspect the generated SQL and run an analysis:
import ibis
from increment import Analysis
con = ibis.snowflake.connect(...)
analysis = Analysis.from_definitions("checkout_redesign", "definitions/", con)
print(analysis.summary_sql()["revenue"])
results = analysis.run()
Install your warehouse's Ibis backend separately—for example,
pip install 'ibis-framework[snowflake]'. The core package bundles no database
driver. DuckDB, PostgreSQL, Snowflake, and BigQuery have execution test suites;
coverage is not a promise that every method works on every backend.
See the runnable warehouse example and data-model guide for YAML setup, query inspection, portable unit-day artifacts, and moments exports.
Optional extras
| Install | Adds |
|---|---|
increment[demo] |
DuckDB for local examples and simulation |
increment[tables] |
CoefTable and pandas for rendered readouts |
increment[dashboard] |
marimo, CoefTable, and pandas for an HTML experiment dashboard |
Explore the guides
| Goal | Guide |
|---|---|
| Choose an analysis method | Method selection |
| Set up dataframe inputs | Quickstart |
| Define warehouse data and experiments | Data model |
| Understand metrics and supported combinations | Metric types · Compatibility |
| Use priors and probability-based decisions | Bayesian inference |
| Reduce variance | CUPED |
| Correct multiple comparisons | Multiplicity |
| Monitor an experiment | Sequential inference |
| Plan sample size or power | Power analysis |
| Analyze non-randomized treatments | Observational inference |
| Analyze encouragement or switchback designs | Encouragement · Switchback |
| Explore treatment-effect differences | Heterogeneity and rollout |
| Build an experiment dashboard | Dashboard |
| Look up public APIs | API reference |
The examples/ directory contains runnable marimo notebooks for
warehouse and dataframe analyses, power, CUPED, causal inference, and reporting.
See the examples guide to choose one.
Scope and statistical assumptions
Increment analyzes randomized experiments from dataframes or SQL warehouses; observational treatments are supported from dataframes. It estimates effects—it does not make an observational comparison causal without identification assumptions.
Exact and asymptotic methods have different guarantees. Repeated looks require a compatible sequential procedure to claim frequentist error control; Bayesian posterior probabilities do not automatically provide that guarantee. Unsupported combinations surface coded errors or warnings; partial results may be returned when only some requested cells are unsupported.
Read the statistical limitations, compatibility matrix, and backend verification notes before choosing an analysis for production use.
Contributing and license
See CONTRIBUTING.md for development setup and contribution requirements. Contributions require a signed Contributor License Agreement.
Apache License 2.0 — see LICENSE and NOTICE. Copyright 2026 Kyle Caron.
Metadata
Release files for increment 0.1.0a2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| increment-0.1.0a2.tar.gz | 1.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| increment-0.1.0a2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.5 MB
Release files / increment-0.1.0a2.tar.gz
| Download URL | increment-0.1.0a2.tar.gz |
|---|---|
| Size | 1.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
af909df3235db01a3f02a8e4c060b89e9e1fdf8a4d232fb66634b3bf30e1c004
|
|
BLAKE2b-256 checksum How to use checksums |
66175168e5c29e1971a6e0af710e051d4378978b207eda4f6c2e3c5f2cb4696b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / increment-0.1.0a2-py3-none-any.whl
| Download URL | increment-0.1.0a2-py3-none-any.whl |
|---|---|
| Size | 1.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
15804cd12624155800fde40737996a2c2018f9741ca1e208c2aba085cc173fb6
|
|
BLAKE2b-256 checksum How to use checksums |
425ac562cd8025843d229d373a86bf43340f4fc6d4b35b641dfc506b93d215ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency log