Advanced stats
Six stats beyond points and rebounds, computed every morning from the box scores. Each one with its formula, a worked example and what it can't tell you.
Effective field goal % (eFG%)
Field goal percentage that gives a made three its extra point: a three counts as 1.5 field goals. It shows shooting quality without free throws.
eFG% = (FGM + 0.5 × 3PM) ÷ FGA
Worked example: 8-of-18 with 3 threes: (8 + 1.5) ÷ 18 = 52.8%.
Limits: Ignores free throws (true shooting % counts them).
Possessions and pace
A possession ends with a shot that isn't rebounded by the offense, free throws or a turnover. Pace is possessions per 40 minutes: it tells you whether a team plays fast or slow, which puts every per-game number in context.
Possessions = FGA − ORB + TOV + 0.44 × FTA Pace = 40 × (team poss + opponent poss) ÷ 2 ÷ (team minutes ÷ 5)
Worked example: 60 FGA, 10 offensive rebounds, 15 turnovers, 20 FTA: 60 − 10 + 15 + 8.8 = 73.8 possessions. With the opponent at 70.2 in a 40-minute game, pace = 72.0. The same game in overtime (45 minutes) is a pace of 64.0.
Limits: An estimate from the box score; the 0.44 free-throw factor is the standard one (see true shooting %).
Offensive, defensive and net rating
Points scored and allowed per 100 possessions, and the difference. The fairest way to compare teams that play at different speeds.
Offensive rating = 100 × points ÷ possessions Defensive rating = 100 × opponent points ÷ possessions Net rating = offensive − defensive
Worked example: 75 points in a 72-possession game = 104.2 per 100.
Limits: Not adjusted for opponent strength; the Freeman Rating is.
Usage rate
The share of her team's possessions a player finishes with a shot, free throws or a turnover while she's on the floor. Who the offense runs through.
Usage = (FGA + 0.44 × FTA + TOV) × (team minutes ÷ 5) ÷ (minutes × (team FGA + 0.44 × team FTA + team TOV))
Worked example: 15 FGA, 5 FTA, 3 turnovers in 32 minutes, for a team with 60 FGA, 20 FTA and 15 turnovers in a 40-minute game: (15 + 2.2 + 3) × 40 ÷ (32 × 83.8) = 30.1%. Five players who each play every minute always add up to 100%.
Limits: High usage isn't good or bad by itself; read it with true shooting %.
Assist rate and assist-to-turnover ratio
Assist rate is the share of teammates' baskets she assisted while she was on the floor. AST/TO is assists per turnover.
Assist % = AST ÷ ((minutes ÷ (team minutes ÷ 5)) × team FGM − FGM) AST/TO = AST ÷ TOV
Worked example: 6 assists and 6 baskets in 30 of 40 minutes, on a team with 26 baskets: 0.75 × 26 − 6 = 13.5 teammate baskets, so 6 ÷ 13.5 = 44.4%. 6 assists and 3 turnovers = 2.0 AST/TO.
Limits: Scorekeepers award assists differently from arena to arena. AST/TO is blank with no turnovers.
Offensive and defensive rebound %
The share of available rebounds a player or team grabs on each end. Fairer than raw rebound totals, which depend on minutes and how many shots were missed.
Player ORB% = ORB × (team minutes ÷ 5) ÷ (minutes × (team ORB + opponent DRB)) Team ORB% = ORB ÷ (ORB + opponent DRB) (Defensive: swap offensive and defensive rebounds.)
Worked example: 3 offensive rebounds in 30 minutes, with the team getting 10 and the opponent 25 defensive: 3 × 40 ÷ (30 × 35) = 11.4%.
Limits: Team rebounds credited to no player aren't in the box score, so rates run slightly low.
Inputs and source
- Box scores: balldontlie (licensed; not official league data). Pulled Nov 7, 2026, refreshed every morning. Team and opponent totals are the sums of the players' lines.
- Season numbers add up every game first and divide once (not an average of game averages).
- Matching games: pace, ratings and rebound rates need both teams' box scores, so they count only games where both are in the data (a Division I team's games against lower-division schools often aren't). A player's usage and assist rate count the games where her minutes are reported, against her team's totals per minute.
- Team minutes are 200 a game, 225 with one overtime and 25 more for each extra overtime, unless the box score reports every player's minutes.
- Code:
pipeline/metrics/formulas.py, tested against these worked examples before every publish. Impossible values (a rate over 100% for a player with 40+ minutes, a pace outside 40–120) stop the publish.