A Python library for generating realistic synthetic datasets
Project description
DataGen - Synthetic Data Generation Library
A Python library for generating realistic synthetic datasets for testing, analytics, and machine learning experiments. DataGen provides modular, reproducible, and easy-to-use data generators for various domains.
Features
Four Specialized Generators:
- Profile Data - User profiles with names, emails, addresses, and geographic coordinates
- Salary Data - Job titles, levels, compensation, and bonuses
- Region Data - Global regions with countries, timezones, and managers
- Car Data - Vehicle information with make, model, year, and pricing
Key Capabilities:
- Reproducible - Deterministic output with seed control
- Flexible - Multiple output formats (DataFrame, dict, CSV, JSON)
- Localized - Kenya-focused data with local context
- Well-documented - Comprehensive docstrings and examples
- Type-safe - Full type hints for better IDE support
- Containerized - Docker support for easy development
Installation
From PyPI (Recommended)
pip install sami-datagen
From Source
git clone https://github.com/25thOliver/Datagen.git
cd Datagen
pip install -e .
Development Installation
pip install -e ".[dev]"
Using Docker
DataGen includes Docker support for containerized development and deployment.
Quick Start with Docker
# Clone the repository
git clone https://github.com/25thOliver/Datagen.git
cd Datagen
# Build and run with Docker Compose
docker-compose up -d
# Access the container
docker-compose exec datagen bash
# Inside the container, use datagen
python -c "from datagen import generate_profiles; print(generate_profiles(n=10))"
or
python -m datagen.generators.profle
Using Dockerfile Directly
# Build the Docker image
docker build -t datagen:latest .
# Run the container
docker run -it --rm \
-v $(pwd):/app \
-v datagen-cache:/root/.cache \
datagen:latest
# Inside the container
python -c "from datagen import generate_profiles; print(generate_profiles(n=10))"
Docker Configuration
Dockerfile features
- Base image:
python:3.11-slim - Includes git for version control
- Installs all dependencies from
requirements.txt - Install datagen in development mode
- Optimized layer caching for faster builds
- Optimized layer caching for faster builds
- Unbuffered Python output for real-time logs
docker-compose.yml Features:
- Servive name:
datagen - Container name:
datagen-dev - Volume mounting for live coding changes
- Cache volume for pip packages
- Interactive terminal support(stdin_open, tty)
- Working directory:
/app
Docker Use Cases
1. Development Environment
# Start development container
docker-compose up -d
# Run tests
docker-compose exec datagen pytest tests/
# Generate data
docker-compose exec datagen python -c "
from datagen import generate_profiles, save_data
df = generate_profiles(n=1000)
save_data(df, 'output/profiles.csv')
"
# Stop container
docker-compose down
2. CI/CD Pipeline
Example GitHub Actions workflow
-
name: Build Docker image run: docker build -t datagen:test .
-
name: Run tests in container run: docker run --rm datagen:test pytest tests/
3. Production Deployment
# Build production image
docker build -t datagen:v0.1.0 .
# Run as a service
docker run -d \
--name datagen-service \
-v /path/to/output:/app/output \
datagen:v0.1.0 \
python -c "from datagen import generate_profiles, save_data; save_data(generate_profiles(10000), 'output/profiles.csv')"
4. Batch Data Generation
# Generate multiple datasets in parallel
docker run --rm -v $(pwd)/output:/app/output datagen:latest \
bash -c "
python -c 'from datagen import *; save_data(generate_profiles(5000), \"output/profiles.csv\")' &
python -c 'from datagen import *; save_data(generate_salaries(5000), \"output/salaries.csv\")' &
python -c 'from datagen import *; save_data(generate_regions(5000), \"output/regions.csv\")' &
python -c 'from datagen import *; save_data(generate_cars(1000), \"output/cars.csv\")' &
wait
"
Docker Best Practices
- Volume Mounting: Mount your output directory to persist generated data - Cache Volume: Use named volumes for pip cache to speed up rebuilds - Resource Limits: Set memory/CPU limits for production deployments - Multi-stage Builds: For production, consider multi-stage builds to reduce image size - Security: Run as non-root user in production environments
Quick Start
Basic Usage
from datagen import generate_profiles, generate_salaries, generate_regions, generate_cars
# Generate 100 user profiles
profiles = generate_profiles(n=100, seed=42)
print(profiles.head())
# Generate 50 salary records
salaries = generate_salaries(n=50, seed=42, currency="KES")
print(salaries.head())
# Generate all global regions
regions = generate_regions(seed=42)
print(regions.head())
# Generate 25 car records
cars = generate_cars(n=25, seed=42)
print(cars.head())
Saving Data
from datagen import generate_profiles, save_data
# Generate and save to CSV
profiles = generate_profiles(n=1000, seed=42)
save_data(profiles, "profiles.csv", file_format="csv")
# Save to JSON
save_data(profiles, "profiles.json", file_format="json")
# Save to Excel
save_data(profiles, "profiles.xlsx", file_format="excel")
# Save to Parquet
save_data(profiles, "profiles.parquet", file_format="parquet")
Detailed Usage
1. Profile Generator
Generate realistic user profiles with Kenyan localization.
from datagen import generate_profiles
# Generate profiles with default settings
profiles = generate_profiles(
n=100, # Number of profiles
seed=42, # Random seed for reproducibility
locale="en_KE", # Locale (Kenya)
output_format="dataframe" # Output format
)
# Output formats: 'dataframe', 'dict', 'csv', 'json'
profiles_dict = generate_profiles(n=10, output_format="dict")
profiles_csv = generate_profiles(n=10, output_format="csv")
Generated Fields:
profile_id- Unique identifier (UUID)first_name,last_name,full_name- Name fieldsemail,username- Contact informationgender- Male, Female, or Non-binarydate_of_birth,age- Age informationphone- Phone numberstreet_address,city,state,postal_code,country- Addresslatitude,longitude- Geographic coordinates (Kenya bounds)created_at- Account creation timestamp
2. Salary Generator
Generate salary data across multiple departments and experience levels.
from datagen import generate_salaries
# Generate salary records
salaries = generate_salaries(
n=100,
seed=42,
locale="en_KE",
currency="KES", # KES or USD
output_format="dataframe"
)
# Analyze salary distribution
print(salaries.groupby('department')['total_compensation'].mean())
print(salaries.groupby('level')['base_salary'].describe())
Generated Fields:
salary_id,employee_id- Identifiersjob_title- Specific role (60+ titles across 8 departments)department- Engineering, Product, Data, Marketing, Sales, Operations, Finance, HRlevel- Junior, Mid, Senior, Lead, Principal, Manager, Senior Manager, Director, VP, C-Levelyears_experience- Years of experience aligned with levelbase_salary- Base annual salarybonus- Annual bonus amountbonus_percentage- Bonus as percentage of basetotal_compensation- Base + bonuscurrency- KES or USDeffective_date- Salary effective date
Supported Departments:
- Engineering (18 roles)
- Product (9 roles)
- Data (10 roles)
- Marketing (9 roles)
- Sales (9 roles)
- Operations (7 roles)
- Finance (9 roles)
- HR (9 roles)
3. Region Generator
Generate global region data with timezone and country information.
from datagen import generate_regions
# Generate all regions (default)
regions = generate_regions(seed=42, include_all=True)
# Generate random subset
regions = generate_regions(n=3, seed=42, include_all=False)
Generated Fields:
region_id- Unique identifierregion_name- North America, South America, Europe, Middle East, Africa, Asia Pacificregion_code- NA, SA, EU, ME, AF, APACcountries- Comma-separated list of countriescountry_count- Number of countries in regionprimary_timezone- Main timezoneall_timezones- All timezones in regionhq_city,hq_country- Regional headquartersregional_manager- Manager namemanager_email- Manager emailestablished_date- Region establishment date
4. Car Generator
Generate vehicle data focused on the Kenyan automotive market.
from datagen import generate_cars
# Generate car inventory
cars = generate_cars(
n=100,
seed=42,
output_format="dataframe"
)
# Analyze pricing by make
print(cars.groupby('make')['price_kes'].mean())
Generated Fields:
car_id- Unique identifiermake- Toyota, Nissan, Mazda, Subaru, Mitsubishi, VW, BMW, Mercedes-Benz, Isuzumodel- Specific model (Corolla, Probox, Note, Demio, Forester, etc.)year- Manufacturing year (2008-2025)color- Vehicle colortransmission_type- Manual or Automaticfuel_type- Petrol or Dieselassembled_in- Country of assemblydealer_city- Nairobi, Mombasa, Kisumu, Eldoret, Nakuruprice_kes- Price in Kenyan Shillings (with depreciation modeling)
Advanced Features
Reproducibility
All generators support deterministic output through seed control:
# Same seed = same output
df1 = generate_profiles(n=100, seed=42)
df2 = generate_profiles(n=100, seed=42)
assert df1.equals(df2) # True
Custom Output Formats
# Get as list of dictionaries
data = generate_profiles(n=10, output_format="dict")
# Get as CSV string
csv_string = generate_profiles(n=10, output_format="csv")
# Get as JSON string
json_string = generate_profiles(n=10, output_format="json")
# Get as pandas DataFrame (default)
df = generate_profiles(n=10, output_format="dataframe")
Batch Generation
# Generate large datasets efficiently
large_profiles = generate_profiles(n=10000, seed=42)
large_salaries = generate_salaries(n=10000, seed=42)
# Save to file
save_data(large_profiles, "large_profiles.parquet", file_format="parquet")
CLI Usage
DataGen includes a command-line interface for quick data generation:
# Generate profiles
datagen profiles --count 100 --output profiles.csv
# Generate salaries
datagen salaries --count 50 --currency KES --output salaries.json
# Generate regions
datagen regions --output regions.csv
# Generate cars
datagen cars --count 25 --output cars.json
# With seed for reproducibility
datagen profiles --count 100 --seed 42 --output profiles.csv
API Reference
generate_profiles(n, seed, locale, output_format)
Generate synthetic user profile data.
Parameters:
n(int): Number of profiles to generate. Default: 100seed(Optional[int]): Random seed for reproducibility. Default: Nonelocale(str): Faker locale. Default: "en_KE"output_format(str): Output format. Options: 'dataframe', 'dict', 'csv', 'json'. Default: "dataframe"
Returns: Union[pd.DataFrame, List[Dict], str]
generate_salaries(n, seed, locale, currency, output_format)
Generate synthetic salary data.
Parameters:
n(int): Number of salary records. Default: 100seed(Optional[int]): Random seed. Default: Nonelocale(str): Faker locale. Default: "en_KE"currency(str): Currency code. Options: 'KES', 'USD'. Default: "KES"output_format(str): Output format. Default: "dataframe"
Returns: Union[pd.DataFrame, List[Dict], str]
generate_regions(n, seed, include_all, output_format)
Generate global region data.
Parameters:
n(Optional[int]): Number of regions (ignored if include_all=True). Default: Noneseed(Optional[int]): Random seed. Default: Noneinclude_all(bool): Generate all predefined regions. Default: Trueoutput_format(str): Output format. Default: "dataframe"
Returns: Union[pd.DataFrame, List[Dict], str]
generate_cars(n, seed, output_format)
Generate synthetic car data.
Parameters:
n(int): Number of car records. Default: 100seed(Optional[int]): Random seed. Default: Noneoutput_format(str): Output format. Default: "dataframe"
Returns: Union[pd.DataFrame, List[Dict], str]
save_data(data, filename, file_format)
Save data to file.
Parameters:
data(Union[pd.DataFrame, List[Dict]]): Data to savefilename(str): Output file pathfile_format(Optional[str]): File format. Options: 'csv', 'json', 'excel', 'parquet'. Auto-detected from filename if None.
Examples
See the examples/ directory for Jupyter notebooks demonstrating:
- Profile generation and analysis
- Salary distribution analysis
- Regional data mapping
- Car inventory management
Requirements
- Python >= 3.8
- faker >= 18.0.0
- pandas >= 2.0.0
- numpy >= 1.24.0
Development
Setup Development Environment
git clone https://github.com/25thOliver/Datagen.git
cd Datagen
pip install -e ".[dev]"
Run Tests
pytest tests/
pytest --cov=datagen tests/
Code Formatting
black datagen/
flake8 datagen/
mypy datagen/
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please ensure:
- Code follows PEP 8 style guidelines
- All tests pass
- New features include tests
- Documentation is updated
Author
Sami
- Email: os679736@gmail.com
- GitHub: @25thOliver
Changelog
Version 0.1.0 (Initial Release)
- Profile generator with Kenya localization
- Salary generator with 8 departments and 10 levels
- Region generator with 6 global regions
- Car generator with Kenya market focus
- Multiple output format support
- Reproducible generation with seed control
- CLI interface for quick generation
- Comprehensive documentation
Support
If you encounter any issues or have questions:
- Open an issue on GitHub
- Email: os679736@gmail.com
Roadmap
Future enhancements planned:
- Additional generators (transactions, events, logs)
- More locales and regions
- Data relationship support (foreign keys)
- Performance optimizations for large datasets
- Web UI for interactive generation
- More export formats (SQL, Avro)
- Data quality validation tools
- Kubernetes deployment examples
- Cloud deployment guides (AWS, GCP, Azure)
Project details
Release history Release notifications | RSS feed
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 sami_datagen-0.1.1.tar.gz.
File metadata
- Download URL: sami_datagen-0.1.1.tar.gz
- Upload date:
- Size: 22.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c5d8008684793f51e9616973dffc3d4410dc661f79bedfd7ae25249722c1ce2
|
|
| MD5 |
197a44135526c8ddbb16436aa63b9f70
|
|
| BLAKE2b-256 |
71e57b71b122bca9d3f377fd96b7e5275147ae229116cc520a88e354ee348afd
|
File details
Details for the file sami_datagen-0.1.1-py3-none-any.whl.
File metadata
- Download URL: sami_datagen-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88019703e385c389ed548a0770212be77e85ef24144f98f3559ff54c04029c54
|
|
| MD5 |
a7b5a3f751e28dfa1f5e93aad19f3d1b
|
|
| BLAKE2b-256 |
5966e829953c5dbdf3b7fcd836e7683b6401908de7c9d3d7a40945037d77507d
|