Metadata-Version: 2.4
Name: dp_wizard
Version: 0.9.0
Summary: DP Wizard makes it easier to get started with Differential Privacy.
Keywords: differential privacy
Author-email: The OpenDP Project <info@opendp.org>
Description-Content-Type: text/markdown
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
License-File: LICENSE
Requires-Dist: dp-wizard-templates==0.8.2
Requires-Dist: faicons
Requires-Dist: fonttools>=4.60.2
Requires-Dist: matplotlib
Requires-Dist: opendp[mbi]==0.14.1
Requires-Dist: pillow>=11.3.0
Requires-Dist: requests>=2.32.4
Requires-Dist: shiny
Requires-Dist: starlette>=0.49.1
Requires-Dist: tornado>=6.5
Requires-Dist: urllib3>=2.6.0
Requires-Dist: absl-py==2.3.1 ; extra == "pins"
Requires-Dist: anyio==4.9.0 ; extra == "pins"
Requires-Dist: appdirs==1.4.4 ; extra == "pins"
Requires-Dist: appnope==0.1.4 ; extra == "pins"
Requires-Dist: asgiref==3.8.1 ; extra == "pins"
Requires-Dist: asttokens==3.0.0 ; extra == "pins"
Requires-Dist: attrs==25.3.0 ; extra == "pins"
Requires-Dist: beautifulsoup4==4.13.4 ; extra == "pins"
Requires-Dist: black==25.1.0 ; extra == "pins"
Requires-Dist: bleach[css]==6.2.0 ; extra == "pins"
Requires-Dist: certifi==2025.4.26 ; extra == "pins"
Requires-Dist: charset-normalizer==3.4.2 ; extra == "pins"
Requires-Dist: chex==0.1.90 ; extra == "pins"
Requires-Dist: click==8.1.8 ; extra == "pins"
Requires-Dist: comm==0.2.2 ; extra == "pins"
Requires-Dist: contourpy==1.3.2 ; extra == "pins"
Requires-Dist: cycler==0.12.1 ; extra == "pins"
Requires-Dist: debugpy==1.8.14 ; extra == "pins"
Requires-Dist: decorator==5.2.1 ; extra == "pins"
Requires-Dist: defusedxml==0.7.1 ; extra == "pins"
Requires-Dist: deprecated==1.2.18 ; extra == "pins"
Requires-Dist: dp-wizard-templates==0.8.2 ; extra == "pins"
Requires-Dist: exceptiongroup==1.3.0 ; extra == "pins"
Requires-Dist: executing==2.2.0 ; extra == "pins"
Requires-Dist: faicons==0.2.2 ; extra == "pins"
Requires-Dist: fastjsonschema==2.21.1 ; extra == "pins"
Requires-Dist: fonttools==4.61.0 ; extra == "pins"
Requires-Dist: h11==0.16.0 ; extra == "pins"
Requires-Dist: htmltools==0.6.0 ; extra == "pins"
Requires-Dist: idna==3.10 ; extra == "pins"
Requires-Dist: ipykernel==6.29.5 ; extra == "pins"
Requires-Dist: ipython==8.35.0 ; extra == "pins"
Requires-Dist: jax==0.6.2 ; extra == "pins"
Requires-Dist: jaxlib==0.6.2 ; extra == "pins"
Requires-Dist: jedi==0.19.2 ; extra == "pins"
Requires-Dist: jinja2==3.1.6 ; extra == "pins"
Requires-Dist: joblib==1.4.2 ; extra == "pins"
Requires-Dist: jsonschema-specifications==2024.10.1 ; extra == "pins"
Requires-Dist: jsonschema==4.23.0 ; extra == "pins"
Requires-Dist: jupyter-client==8.6.3 ; extra == "pins"
Requires-Dist: jupyter-core==5.7.2 ; extra == "pins"
Requires-Dist: jupyterlab-pygments==0.3.0 ; extra == "pins"
Requires-Dist: jupytext==1.17.0 ; extra == "pins"
Requires-Dist: kiwisolver==1.4.8 ; extra == "pins"
Requires-Dist: linkify-it-py==2.0.3 ; extra == "pins"
Requires-Dist: markdown-it-py==3.0.0 ; extra == "pins"
Requires-Dist: markupsafe==3.0.2 ; extra == "pins"
Requires-Dist: matplotlib-inline==0.1.7 ; extra == "pins"
Requires-Dist: matplotlib==3.10.1 ; extra == "pins"
Requires-Dist: mbi==1.0.0 ; extra == "pins"
Requires-Dist: mdit-py-plugins==0.4.2 ; extra == "pins"
Requires-Dist: mdurl==0.1.2 ; extra == "pins"
Requires-Dist: mistune==3.1.3 ; extra == "pins"
Requires-Dist: ml-dtypes==0.5.3 ; extra == "pins"
Requires-Dist: mypy-extensions==1.1.0 ; extra == "pins"
Requires-Dist: narwhals==1.35.0 ; extra == "pins"
Requires-Dist: nbclient==0.10.2 ; extra == "pins"
Requires-Dist: nbconvert==7.16.6 ; extra == "pins"
Requires-Dist: nbformat==5.10.4 ; extra == "pins"
Requires-Dist: nest-asyncio==1.6.0 ; extra == "pins"
Requires-Dist: networkx==3.4.2 ; extra == "pins"
Requires-Dist: numpy==2.2.4 ; extra == "pins"
Requires-Dist: opendp[mbi]==0.14.1 ; extra == "pins"
Requires-Dist: opt-einsum==3.4.0 ; extra == "pins"
Requires-Dist: optax==0.2.5 ; extra == "pins"
Requires-Dist: orjson==3.10.16 ; extra == "pins"
Requires-Dist: packaging==24.2 ; extra == "pins"
Requires-Dist: pandas==2.3.2 ; extra == "pins"
Requires-Dist: pandocfilters==1.5.1 ; extra == "pins"
Requires-Dist: parso==0.8.4 ; extra == "pins"
Requires-Dist: pathspec==0.12.1 ; extra == "pins"
Requires-Dist: pexpect==4.9.0 ; extra == "pins"
Requires-Dist: pillow==11.3.0 ; extra == "pins"
Requires-Dist: platformdirs==4.3.7 ; extra == "pins"
Requires-Dist: polars==1.32.0 ; extra == "pins"
Requires-Dist: prompt-toolkit==3.0.51 ; extra == "pins"
Requires-Dist: psutil==7.0.0 ; extra == "pins"
Requires-Dist: ptyprocess==0.7.0 ; extra == "pins"
Requires-Dist: pure-eval==0.2.3 ; extra == "pins"
Requires-Dist: pyarrow==19.0.1 ; extra == "pins"
Requires-Dist: pygments==2.19.1 ; extra == "pins"
Requires-Dist: pyparsing==3.2.3 ; extra == "pins"
Requires-Dist: python-dateutil==2.9.0.post0 ; extra == "pins"
Requires-Dist: python-multipart==0.0.20 ; extra == "pins"
Requires-Dist: pytz==2025.2 ; extra == "pins"
Requires-Dist: pyyaml==6.0.2 ; extra == "pins"
Requires-Dist: pyzmq==26.4.0 ; extra == "pins"
Requires-Dist: questionary==2.1.0 ; extra == "pins"
Requires-Dist: randomgen==2.1.1 ; extra == "pins"
Requires-Dist: referencing==0.36.2 ; extra == "pins"
Requires-Dist: requests==2.32.4 ; extra == "pins"
Requires-Dist: rpds-py==0.24.0 ; extra == "pins"
Requires-Dist: scikit-learn==1.6.1 ; extra == "pins"
Requires-Dist: scipy==1.15.2 ; extra == "pins"
Requires-Dist: shiny==1.4.0 ; extra == "pins"
Requires-Dist: six==1.17.0 ; extra == "pins"
Requires-Dist: sniffio==1.3.1 ; extra == "pins"
Requires-Dist: soupsieve==2.6 ; extra == "pins"
Requires-Dist: stack-data==0.6.3 ; extra == "pins"
Requires-Dist: starlette==0.49.1 ; extra == "pins"
Requires-Dist: threadpoolctl==3.6.0 ; extra == "pins"
Requires-Dist: tinycss2==1.4.0 ; extra == "pins"
Requires-Dist: tomli==2.2.1 ; extra == "pins"
Requires-Dist: toolz==1.0.0 ; extra == "pins"
Requires-Dist: tornado==6.5.1 ; extra == "pins"
Requires-Dist: traitlets==5.14.3 ; extra == "pins"
Requires-Dist: typing-extensions==4.13.2 ; extra == "pins"
Requires-Dist: tzdata==2025.2 ; extra == "pins"
Requires-Dist: uc-micro-py==1.0.3 ; extra == "pins"
Requires-Dist: urllib3==2.6.0 ; extra == "pins"
Requires-Dist: uvicorn==0.34.1 ; extra == "pins"
Requires-Dist: watchfiles==1.0.5 ; extra == "pins"
Requires-Dist: wcwidth==0.2.13 ; extra == "pins"
Requires-Dist: webencodings==0.5.1 ; extra == "pins"
Requires-Dist: websockets==15.0.1 ; extra == "pins"
Requires-Dist: wrapt==1.17.2 ; extra == "pins"
Project-URL: Home, https://github.com/opendp/dp-wizard
Provides-Extra: pins

# DP Wizard

[![pypi](https://img.shields.io/pypi/v/dp_wizard)](https://pypi.org/project/dp_wizard/)

DP Wizard makes it easier to get started with differential privacy,
the addition of calibrated noise to aggregate statistics to protect the privacy of individuals.
DP Wizard demonstrates how to calculate DP statistics or create a synthetic dataset from the data you provide.

If differential privacy is new to you, [these slides](https://opendp.github.io/dp-wizard/) provide some background, and explain how DP Wizard works.

Options for running DP Wizard:

- No install [online demo](https://mccalluc-dp-wizard.share.connect.posit.cloud/): Does not support data upload.
- Install from [Docker](https://hub.docker.com/repository/docker/mccalluc/dp-wizard/general): `docker run -p 8000:8000 mccalluc/dp-wizard`
- Install from [PyPI](https://pypi.org/project/dp-wizard/): `pip install 'dp-wizard[app]'; dp-wizard`
- Install from [source](https://github.com/opendp/dp-wizard): See developer instructions.

See the [FAQ](https://github.com/opendp/dp-wizard/blob/main/dp_wizard/FAQ.md) for more information.

## Screenshots

<!-- Run `scripts/screenshots.sh` to regenerate these screenshots. -->

Select Dataset:
![Screenshot with a "Data Source" panel on the left, and "Unit of Protection" and "Product" on the right.](https://opendp.github.io/dp-wizard/screenshots/select-dataset.png)

Define Analysis:
![Screenshot with four panels: "Columns", "Grouping", "Privacy Budget", and "Simulation".](https://opendp.github.io/dp-wizard/screenshots/define-analysis.png)

Download Results:
![Screenshot with links to download analysis results".](https://opendp.github.io/dp-wizard/screenshots/download-results.png)

## Usage

DP Wizard requires Python 3.10 or later.
You can check your current version with `python --version`.
The exact upgrade process will depend on your environment and operating system.

Install with `pip install 'dp_wizard[pins]'` and you can start DP Wizard from the command line.

```
usage: dp-wizard [-h] [--demo] [--host HOST] [--port PORT] [--no_browser] [--reload]

DP Wizard makes it easier to get started with Differential Privacy.

options:
  -h, --help    show this help message and exit
  --demo      Generate a demo CSV: See how DP Wizard works without providing your own data
  --host HOST   Bind socket to this host
  --port PORT   Bind socket to this port. If 0, a random port will be used.
  --no_browser  By default, a browser is started; Enable this for no browser.
  --reload      Enable to watch source directory and reload on changes.

Unless you have set "--demo", you will specify a CSV inside the application.

Provide a "Private Data" if you only have a private data set, and want to
make a release from it: The preview visualizations will only use
simulated data, and apart from the headers, the private data is not
read until the release.

Provide a "Public Data" if you have a public data set, and are curious how
DP can be applied: The preview visualizations will use your public data.

Provide both if you have two CSVs with the same structure.
Perhaps the public data is older and no longer sensitive. Preview
visualizations will be made with the public data, but the release will
be made with private data.
```

