The Synthetic Data API — privacy-preserving synthetic data generation
Project description
DataXID Python SDK
High-fidelity synthetic data generation for single-table, multi-table, and time series data.
Installation
pip install dataxid
Quick Start
import dataxid
import pandas as pd
dataxid.api_key = "dx_..."
dataxid.enable_logging("info") # optional: see training progress
df = pd.read_csv("data.csv")
synthetic = dataxid.synthesize(data=df, n_samples=1000)
Multi-Table & Time Series
Synthesize related tables with referential integrity. Child tables are generated sequentially by default — preserving realistic per-entity patterns like transaction counts, temporal ordering, and sequence lengths.
from dataxid import Table
accounts = Table(pd.read_csv("accounts.csv"), primary_key="account_id")
transactions = Table(pd.read_csv("transactions.csv"),
foreign_keys={"account_id": accounts})
synthetic = dataxid.synthesize_tables({
"accounts": accounts,
"transactions": transactions,
})
synthetic["accounts"] # synthetic accounts with auto-assigned PKs
synthetic["transactions"] # sequential transactions per account, valid FKs
Per-table generation controls are passed as dicts keyed by table name:
from dataxid import Synthetic, Distribution
accounts_preset = Synthetic(n=1000)
transactions_preset = Synthetic(n=5000, seed=42)
country_distribution = Distribution(
column="country",
probabilities={"US": 0.6, "UK": 0.4},
)
synthetic = dataxid.synthesize_tables(
tables={"accounts": accounts, "transactions": transactions},
synthetic={
"accounts": accounts_preset,
"transactions": transactions_preset,
},
distribution={"accounts": country_distribution},
)
Iterative workflow
When you want to train once and generate many times — for example,
running several sampling strategies against the same model — split the
call into Model.create and model.generate:
model = dataxid.Model.create(data=df)
synthetic_a = model.generate(n_samples=1000, diversity=0.8)
synthetic_b = model.generate(n_samples=1000, diversity=1.2)
model.delete()
How It Works
DataXID is built on a privacy-by-architecture principle. Data encoding and decoding happen entirely on your machine; only abstract embeddings are shared with the API for model training. Raw data never leaves your environment.
Configuration
| Parameter | Default | Description |
|---|---|---|
embedding_dim |
64 |
Embedding size (larger = more expressive) |
model_size |
"medium" |
Model capacity: "small", "medium", "large" |
max_epochs |
100 |
Maximum training epochs |
batch_size |
256 |
Training batch size |
privacy |
Privacy() |
Privacy config (see below) |
config = dataxid.ModelConfig(
embedding_dim=128,
model_size="large",
max_epochs=50,
privacy=dataxid.Privacy(enabled=True, noise=0.2),
)
model = dataxid.Model.create(data=df, config=config)
A plain dict is also accepted for quick experiments: config={"embedding_dim": 128}.
Privacy
Privacy settings are grouped under a dedicated Privacy config:
| Parameter | Default | Description |
|---|---|---|
enabled |
False |
Add Gaussian noise to embeddings before they leave the machine |
noise |
0.1 |
Noise scale (Gaussian std) when enabled=True |
protect_rare |
True |
Hide rare categorical values behind a <protected> token |
rare_strategy |
"mask" |
How protected values appear: "mask" or "sample" |
Advanced Generation
Rebalance category distributions
Override the natural distribution of a categorical column:
model = dataxid.Model.create(data=df)
distribution = dataxid.Distribution(
column="gender",
probabilities={"M": 0.5, "F": 0.5},
)
synthetic = model.generate(n_samples=1000, distribution=distribution)
Bias correction
Reduce statistical parity gaps across sensitive attributes:
bias = dataxid.Bias(
target="income",
sensitive=["gender", "race"],
)
synthetic = model.generate(n_samples=1000, bias=bias)
Conditional generation
Fix known values and let the model complete the rest:
conditions = pd.DataFrame({"income": [">50K"] * 1000})
synthetic = model.generate(conditions=conditions)
Impute missing values
Fill NaN cells with model predictions; non-NULL cells are preserved:
model = dataxid.Model.create(data=df)
filled = model.impute(df, trials=3, pick="mode")
Tuning presets
Bundle generation-time knobs into a reusable preset:
preset = dataxid.Synthetic(
n=1000,
seed=42,
diversity=0.8,
rare_cutoff=0.95,
)
synthetic = model.generate(synthetic=preset)
Direct keyword arguments override preset values:
synthetic = model.generate(synthetic=preset, diversity=1.2) # diversity=1.2 wins
Logging
dataxid.enable_logging("info") # see training progress, epoch stats
dataxid.enable_logging("debug") # verbose: includes HTTP requests
dataxid.disable_logging() # turn off (default state)
Or via environment variable (no code change needed):
DATAXID_LOG=info python my_script.py
Error Handling
import dataxid
try:
synthetic = dataxid.synthesize(data=df)
except dataxid.AuthenticationError:
print("Invalid API key")
except dataxid.QuotaExceededError as e:
print(f"Quota exceeded. Upgrade: {e.upgrade_url}")
except dataxid.RateLimitError as e:
print(f"Rate limited. Retry after: {e.retry_after}s")
except dataxid.DataxidError as e:
print(f"Error: {e}")
Links
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dataxid-0.3.0.tar.gz.
File metadata
- Download URL: dataxid-0.3.0.tar.gz
- Upload date:
- Size: 121.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f1ccb0f2a27d779a31178ec83107ee55371ed3afa8e99fa0d4d62b43fbc986c
|
|
| MD5 |
29f4ee3ae8daf5dfbaf4c2529bd1ac1d
|
|
| BLAKE2b-256 |
badb236cb8874df7cbb723af5f229a224de4da4ef5e59170d62a16a0a9aa3e17
|
File details
Details for the file dataxid-0.3.0-py3-none-any.whl.
File metadata
- Download URL: dataxid-0.3.0-py3-none-any.whl
- Upload date:
- Size: 72.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86ced5bdff965a64b3d566454d9572c8ba1506ae03bde7540f47aed76e132642
|
|
| MD5 |
511ce4972bd4c66a602af9d65adbdab3
|
|
| BLAKE2b-256 |
4656a9850de5fe12654f6f10e847c043a1ec591b4def8b7ff59a8f276e889dbc
|