Data Sources
All data is sourced from the official Euroleague Basketball API
via the euroleague-api Python package. No scraping is involved
โ every data point comes from Euroleague's official endpoints.
- Play-by-Play Data โ Every event (shot, rebound, turnover, foul, substitution) with timestamps, scores, and full lineup tracking for recent seasons.
- Shot Location Data โ X/Y coordinates for every field goal attempt, enabling shot charts, zone analysis, and spatial models.
- Box Score Data โ Per-player, per-game statistics including points, rebounds, assists, steals, blocks, turnovers, plus-minus, and the official PIR valuation.
- Game Metadata โ Schedule, results, home/away designations, and round structure for each season.
Dashboard Pages
- Season Hub โ League standings, power ratings scatter plot (Adj Off vs Adj Def), MVP race top 10, remaining schedule difficulty, and standings race timeline. Includes the Oracle Forecast tab with game predictions, player forecasts, and accuracy tracking.
- Team Deep-Dive โ Select any team to see adjusted ratings, four factors breakdown, Elo history, home/away splits, round-by-round results, roster stats, and Monte Carlo playoff probability distributions.
- Player Stats โ Sortable league-wide player statistics with per-game averages, shooting splits, and advanced metrics (RAPM, WPA, TPM, WIR). Filter by team or search by name.
- Head-to-Head โ Compare any two teams: season series results, rating differentials, recent form, and Oracle predictions for upcoming matchups.
- Game Recap โ Round-by-round game results with box scores, Oracle prediction accuracy, and key player performances.
- Shot Lab โ Interactive shot charts with heatmaps by court location, zone breakdown tables (At Rim, Paint, Mid-Range, 3PT), shot distribution analysis, and paint finishing profiles showing how players and teams score inside.
- Playmaking Network โ Interactive chord diagrams showing who assists whom within each team. Top 8 players by assist involvement connected by ribbons proportional to assist frequency. Hover for rich tooltips (count, 2PT/3PT split, per-game rate, percentage breakdowns). Click to pin a player and see detailed assist given/received breakdowns. League-wide tables for top 20 assist combos and top 20 playmakers.
- Game Replay โ Win probability timelines for every game, showing how the probability shifted play-by-play. Hover any moment to see the exact game state.
- Playoffs โ Interactive playoff bracket with live result tracking. Completed games are locked into the bracket with actual scores and series status, while unplayed games remain interactive for "what if" simulation. Championship Odds Tracker: a Plotly line chart showing how each team's title probability evolves after every playoff game day, with eliminated teams grayed out. Post-game Recap Cards for every completed playoff game, showing scores, series status, pre-game win probability, upset badges (when the underdog wins), and championship odds deltas. Path to Title: a per-team grid showing each road to the championship (completed rounds with actual results, upcoming rounds with probabilities); click any alive team's row to expand a branching tree of possible future opponents. Probabilities use model-based matchup odds (adjusted ratings + Elo + ML win probability) with a 10,000-run Monte Carlo. Share your bracket via URL.
- Series Hub โ A dedicated page per playoff matchup (quarterfinals, semifinals, final). Each bracket matchup line and recap card clicks through to a hub with the series hero (seeds, best-of-5 format, live series-win probability bar), a game-by-game timeline with scores and replay links, the regular-season head-to-head between the two teams with combined margin, and the full set of playoff recap cards for that matchup.
- MVP Race โ Composite MVP rankings with sortable columns, plus a race chart showing how rankings evolved across rounds.
- Game Control โ How teams win, not just that they win. The Game Control Index (GCI) uses Win Probability trajectory analysis to measure dominance, drama, comeback resilience, crunch-time performance, and killer instinct for every game and team.
- GCI History โ 19 seasons of Euroleague evolution through the GCI lens. Hero trend cards with sparklines show how drama, comebacks, and GCI spread changed from 2007 to 2025. Interactive team comparison chart across all 33 historical teams, era breakdown (Expansion, Contraction, Modern), and all-time superlatives for most dramatic game, biggest comeback, most dominant game, and highest single-season GCI.
Player Metrics
-
RAPM
Player
ML Model
Regularized Adjusted Plus-Minus โ The gold standard for measuring individual impact. Uses ridge regression on 11,000+ game stints (contiguous stretches where the same 10 players are on court) to isolate each player's contribution, controlling for teammates and opponents simultaneously.
Our implementation uses a two-pass informed prior: a first pass generates noisy RAPM estimates, then a box-score model (points, assists, steals, blocks, rebounds, turnovers, true shooting %) learns to predict RAPM from traditional stats. These predictions become the regularization center for the final pass โ so low-minute players shrink toward their stats-based expectation rather than toward zero. This is the same concept behind ESPN's RPM and FiveThirtyEight's RAPTOR.
Split into O-RAPM (offensive impact) and D-RAPM (defensive impact, positive = good defender). Measured in points per 100 possessions. -
WPA
Player
Win Probability Added โ Evaluates every play-by-play event through the lens of win probability. Each action (made shot, turnover, steal) shifts the game's win probability โ WPA sums these shifts to measure who contributed most to actual wins. Rewards clutch performances and high-leverage plays. -
WIR
Player
Weighted Impact Rating โ An efficiency-adjusted alternative to Euroleague's official PIR. Reweights box-score stats to better reflect modern basketball value: playmaking (1.5x), steals (1.8x), blocks (1.2x), while penalizing inefficiency (missed shots, turnovers). Normalized per 40 minutes. -
TPM
Player
True Plus-Minus โ Raw point differential when a player is on the floor, normalized per 40 minutes. Unlike RAPM, this is unadjusted โ a bench player on Real Madrid will look better than they are. Compare with RAPM to see who the context adjustment helps or hurts. -
MVP Score
Player
Composite MVP Ranking โ A weighted blend of per-game performance (PIR), win probability added (WPA), team success (win %), consistency (inverse coefficient of variation), and clutch efficiency. Designed to approximate how the Euroleague MVP award is actually voted on.
Team Metrics
-
Adjusted Ratings
Team
KenPom-style Four Factors โ Offensive and defensive efficiency adjusted for strength of schedule with recency weighting (exponential decay, 0.97 per round). Recent games count more than early-season games, so the ratings reflect current form โ not just season averages. Adj_Net = Adj_Off - Adj_Def, measured in points per game. -
Elo Rating
Team
A rolling rating system adapted from chess. Each game updates both teams' ratings based on the result and pre-game expectation. Parameters: K-factor = 10, home court advantage = 50 Elo points, 75% carryover between seasons with regression to the mean. Spans all 19 seasons continuously. -
Strength of Schedule
Team
Average win percentage of opponents faced. Used to adjust raw records โ a 20-10 team that played the hardest schedule is more impressive than a 22-8 team with the easiest. Also computed for remaining games to identify favorable or brutal finishes. -
Home Court Advantage
Team
Decomposed into six components: shooting boost, whistle advantage (free throw rate), ball security (turnover rate), offensive rebounding boost, defensive squeeze, and residual (crowd/travel effects). Computed per-team, not just league-wide.
Predictive Models
-
Win Probability Model
ML Model
A Gradient Boosting Machine trained on historical play-by-play data with Platt scaling calibration. Predicts real-time win probability from four features: current score margin, seconds remaining, Elo rating difference, and home/away status. Used to compute WPA for every play-by-play event and power the Game Replay visualizations.Fallback (when model unavailable):
WP = 1 / (1 + exp(-0.8 * margin / sigma))
sigma = 11 * sqrt(seconds_remaining / 2400) -
Oracle Forecast
ML Model
Game-by-game win/loss predictions using Logistic Regression. Features include adjusted net rating differential, Elo difference, home/away net ratings, recent form differential, and strength of schedule difference. Produces win probabilities and predicted margins for upcoming rounds. -
Monte Carlo Simulation
Simulation
Simulates the remainder of the season 10,000 times to generate probability distributions for final standings. Each unplayed game is resolved using a blend of recency-weighted adjusted ratings (75%) and Elo margin (25%), with team-specific home court advantage, fed into the ML win probability model. Teams are ranked using official Euroleague tiebreaker rules: head-to-head record among tied teams, then head-to-head point differential, then overall point differential. A full head-to-head matrix is tracked across all 10,000 simulations. Outputs playoff probabilities (Top 4, Top 6, Top 10), projected win totals, and seed distributions for every team. Pre-computed pairwise matchup probabilities for all playoff team pairs are exported to power the interactive bracket simulator. -
RAPM Ridge Regression
ML Model
Two-pass ridge regression with cross-validated regularization (alpha selected from [0.01 ... 5000]). Pass 1 uses low regularization (alpha=100) to generate training targets for the box-score prior model. Pass 2 uses full cross-validated alpha with the prior as the regularization center. Sparse design matrix with ~335 player columns + HCA indicator, weighted by possession count per stint.
Game Control Metrics
The Game Control Index (GCI) analyzes Win Probability trajectories โ the second-by-second likelihood of each team winning โ to measure how teams win, not just whether they did. Built from WP replay data across every game this season.
-
Dominance Score
Team
Game
Average distance of WP from 50% across all plays:mean(WP - 0.5). Positive means the home team controlled the game; negative means the away team did. Range: -0.5 to +0.5. -
Control Duration
Team
Game
Percentage of plays where the eventual winner held WP above 60%. 100% means wire-to-wire cruise control; lower values indicate a contested game. -
Drama Index
Game
Total variation of the WP curve: sum of absolute WP changes between consecutive plays. Higher values indicate more momentum swings and lead changes. -
Comeback Magnitude
Game
For wins:1.0 - min(winner WP). Measures how deep a deficit the winning team overcame. A comeback from 10% WP scores 0.90. -
Crunch-Time Swing
Team
Game
Net WP change in the final 5 minutes of game clock (Q4 from 5:00 to buzzer, plus overtime). Positive means the team gained control in the clutch. -
Killer Instinct
Team
Net WP change during Q4 plays when the team was leading (WP above 55%). Positive means the team extended their lead; negative means they surrendered it. Measures close-out ability โ do they finish games or let opponents back in? -
GCI Rating
Team
Weighted composite of Dominance (35%), Control Duration (25%), Crunch-Time Swing (20%), and Killer Instinct (20%), z-normalized to a 0โ100 scale across the league. Higher = more dominant game control profile.
Historical GCI Trends
The GCI History page extends the Game Control Index across all 19 Euroleague seasons (2007โ2025), covering 5,000+ games. The same six sub-metrics and GCI Rating formula are applied to each historical season independently, with z-normalization computed within each season (so a GCI of 70 in 2007 means the same relative dominance as 70 in 2024).
Teams are included in trend comparisons only if they have 3 or more seasons of data. The 10 "legacy" teams (Olympiacos, Barcelona, Real Madrid, Panathinaikos, Maccabi Tel Aviv, Anadolu Efes, Fenerbahce, Baskonia, EA7 Milano, Zalgiris) have been present in all 19 seasons. Era breakdowns use three periods: Expansion Era (2007โ2015, 24 teams), Contraction Era (2016โ2019, 16 teams), and Modern Era (2020โ2025, 18โ20 teams).
Data Pipeline
The entire analytics suite updates via a single command (python refresh_all.py)
that orchestrates the full pipeline:
Tech Stack
- Python โ pandas, NumPy, scikit-learn, SciPy, matplotlib, seaborn for all computation and visualization
- scikit-learn โ Ridge/Logistic regression, Gradient Boosting, cross-validation, calibration
- Frontend โ Vanilla JavaScript, HTML, CSS with Plotly.js for interactive charts. No frameworks โ fast, lightweight, zero dependencies.
- Data โ CSV and JSON flat files with incremental caching. No database required.
- euroleague-api โ Official Python package for Euroleague data access
Quick Glossary
- Per 100 Possessions โ Normalizing stats by possessions instead of games removes pace effects. A fast team that plays 75 possessions per game and a slow team that plays 65 become comparable.
- Stint โ A continuous stretch of play where the same 10 players (5 per team) are on court. Substitutions create new stints. RAPM is built on these.
- Ridge Regression โ A form of regularized regression that prevents overfitting by penalizing large coefficients. Essential for RAPM because many lineup combinations are seen only a few times.
- Informed Prior โ Instead of assuming every player starts at zero impact, we use box-score stats to set a reasonable starting estimate. The on-court data then adjusts from there.
- True Shooting % โ Points / (2 * (FGA + 0.44 * FTA)). Accounts for three-pointers and free throws in a single efficiency number.
- Four Factors โ Dean Oliver's framework: effective FG%, turnover rate, offensive rebound rate, and free throw rate. These four factors explain most of the variance in team success.