This is the reference doc. See it running on real generated data, or build it yourself in the Studio.
On this page
Generate Gaming Synthetic Data in Python
Gaming data has a distinctive statistical signature: player levels and XP follow heavy-tailed distributions (most players are low-level, a small elite dominates leaderboards), K/D ratios are beta-distributed around 1.0, and achievement unlock patterns follow the player's progression timeline. Misata generates a four-table gaming dataset, players, matches, sessions, and achievements, where all of this is built in and every FK relationship is valid.
Whether you're testing a leaderboard API, training a churn prediction model on player activity, or building a game analytics dashboard, you can have a statistically accurate gaming dataset running in seconds.
import misata
tables = misata.generate("A competitive FPS game with 10k players and ranked matchmaking", rows=10_000, seed=42)
print(list(tables.keys())) # ['players', 'matches', 'sessions', 'achievements']
print(tables["players"][["level", "xp", "rank"]].describe())What Misata generates#
Four tables: players, matches, sessions (linking players to matches with per-game stats), and achievements (player milestone records). All FKs are valid; achievement unlocked_at is always after player joined_at.
Tables and columns#
| Table | Key columns |
|---|---|
players | player_id, username, level, xp, rank, country, joined_at, last_active |
matches | match_id, game_mode, map, duration_seconds, winner_team, started_at |
sessions | session_id, player_id, match_id, kills, deaths, assists, score, result |
achievements | achievement_id, player_id, name, category, unlocked_at, points |
Realistic distributions#
- Player levels follow a right-skewed lognormal, most players are low-to-mid level, a long elite tail reaches max level
- XP follows a Pareto distribution, top players have disproportionately high experience totals
- K/D ratio (kills/deaths per session) beta-distributed around 1.0, with correct shape for ranked play
last_activeis always afterjoined_at, temporal coherence enforced- Achievement
unlocked_atis always afterjoined_at, no achievements before registration
Quick start#
import misata
tables = misata.generate("An esports platform with 5k ranked players", rows=5000, seed=42)
# K/D analysis
sessions = tables["sessions"]
sessions["kd_ratio"] = sessions["kills"] / (sessions["deaths"] + 0.001)
print(sessions["kd_ratio"].describe())
# Player level distribution
print(tables["players"]["level"].describe())
# Top players by XP
top_players = tables["players"].nlargest(10, "xp")[["username", "level", "xp", "rank"]]
print(top_players)Common use cases#
- Leaderboard and ranking API testing: populate leaderboards with thousands of players across realistic level and XP distributions to stress-test sorting and pagination
- Churn prediction models: generate players with
last_activetimestamps and session frequency for training binary retention classifiers - Matchmaking algorithm development: use session data with kills, deaths, and scores to prototype skill-based matchmaking without production logs
- Game analytics dashboards: seed BI tools with player activity data that produces sensible DAU/MAU and retention funnel metrics
- Achievement system QA: validate badge unlock logic against thousands of achievements across varied categories and point values
- Anti-cheat detection training: inject anomalous K/D ratios and XP progression patterns to develop detection rule classifiers
Advanced: player growth narrative#
tables = misata.generate(
"Battle royale game that launched 18 months ago — player surge at launch, "
"plateau through mid-year, spike after a major update in month 12",
rows=10_000,
seed=42,
)Advanced: locale-aware generation#
# Southeast Asian mobile game — regional usernames, Asian country distribution
tables = misata.generate("Mobile MOBA popular in Southeast Asia with 5k players", rows=5000)
# European esports — European player distribution, competitive ranks
tables = misata.generate("European esports platform with 3k ranked players", rows=3000)Advanced: quality-guaranteed generation#
tables = misata.generate(
"Competitive gaming platform with 5k players",
min_quality_score=85,
smart_correlations=True, # auto-adds level↔xp, rank↔kills correlations
rows=5000,
seed=42,
)