Skip to main content

Overview

Player statistics are organized across multiple CSV files, each focusing on different aspects of performance. All player datasets share common identifier fields and can be joined using nba_id (or PLAYER_ID) and year.

Core Player Files

scoring.csv

Basic scoring efficiency and volume metrics. File: scoring.csv / scoring_ps.csv
Player
string
required
Player full name
nba_id
integer
required
Unique player identifier for joining with other datasets
year
integer
required
Season year (e.g., 2014, 2015)
Tm
string
Team abbreviation (e.g., “LAL”, “GSW”, “TOT” for players traded mid-season)
G
integer
Games played
MP
float
Total minutes played for the season
PTS
float
Total points scored
TS%
float
True shooting percentage: PTS / (2 * (FGA + 0.44 * FTA))Accounts for the value of 3-pointers and free throws.
Example:
Player,TS%,PTS,MP,Tm,G,year,nba_id
Zaid Abdul-Aziz,51.5,15.9,2459.0,HOU,79,1974,76002.0

totals.csv

Comprehensive box score statistics including shooting attempts. File: totals.csv / totals_ps.csv
Player
string
required
Player full name
nba_id
integer
required
Unique player identifier
year
integer
required
Season year
Tm
string
Team abbreviation
G
integer
Games played
MP
float
Total minutes played
PTS
float
Total points
FGA
integer
Field goal attempts
FTA
integer
Free throw attempts
TS%
float
True shooting percentage

player_shooting.csv

Detailed shooting metrics broken down by shot coverage and distance. File: player_shooting.csv / player_shooting_p.csv
PLAYER_ID
integer
required
Unique player identifier (equivalent to nba_id)
PLAYER
string
required
Player name
year
integer
required
Season year
shot_type
string
required
Shot coverage category:
  • wide_open: Defender 6+ feet away
  • open: Defender 4-6 feet away
  • tight: Defender 2-4 feet away
  • very_tight: Defender 0-2 feet away
TEAM
string
Team abbreviation
AGE
float
Player age during the season
GP
integer
Games played
G
integer
Games started
FREQ%
float
Frequency percentage - what portion of player’s shots fall into this category
FGM
integer
Field goals made
FGA
integer
Field goals attempted
FG%
float
Field goal percentage (0-100 scale)
EFG%
float
Effective field goal percentage: (FGM + 0.5 * 3PM) / FGA
2FG FREQ%
float
Frequency of 2-point attempts within this shot type
2FGM
integer
2-point field goals made
2FGA
integer
2-point field goals attempted
2FG%
float
2-point field goal percentage
3FG FREQ%
float
Frequency of 3-point attempts within this shot type
3PM
integer
3-pointers made
3PA
integer
3-pointers attempted
3P%
float
3-point percentage
Example:
PLAYER_ID,PLAYER,TEAM,AGE,GP,G,FREQ%,FGM,FGA,FG%,EFG%,...,year,shot_type
201933,Blake Griffin,LAC,25.0,80,78,26.5,149,342,43.6,44.9,...,2014,wide_open

Tracking & Movement Data

tracking.csv

Player movement, touches, and play-type statistics. File: tracking.csv / tracking_p.csv / tracking_ps.csv
PLAYER_ID
integer
required
Unique player identifier
PLAYER
string
Player name
TEAM
string
Team abbreviation
year
integer
required
Season year
type
string
Tracking category:
  • drives: Drives to the basket
  • touches: Touch statistics
  • pull_up: Pull-up shooting
  • catch_shoot: Catch-and-shoot opportunities
  • defense: Defensive tracking
GP
integer
Games played
W
integer
Wins
L
integer
Losses
MIN
float
Minutes played
DRIVES
integer
Number of drives (for drive tracking)
FGM
integer
Field goals made
FGA
integer
Field goals attempted
FG%
float
Field goal percentage
FTM
integer
Free throws made
FTA
integer
Free throws attempted
FT%
float
Free throw percentage
PTS
float
Points scored
PTS%
float
Percentage of team’s points
PASS
integer
Passes made
PASS%
float
Pass percentage
AST
integer
Assists
AST%
float
Assist percentage
TO
integer
Turnovers
TOV%
float
Turnover percentage
PF
integer
Personal fouls
PF%
float
Foul percentage
3PM
integer
3-pointers made
3PA
integer
3-pointers attempted
3P%
float
3-point percentage
eFG%
float
Effective field goal percentage
Touches
integer
Total touches (for touch tracking)

hustle.csv

Hustle statistics including deflections, loose balls, screens, and distance traveled. File: hustle.csv / hustle_ps.csv
PLAYER_ID
integer
required
Unique player identifier
PLAYER_NAME
string
Player name
TEAM_ID
integer
Team identifier
TEAM_ABBREVIATION
string
Team abbreviation
year
integer
required
Season year
AGE
integer
Player age
G
integer
Games played
GP
integer
Games played (duplicate field)
W
integer
Wins
L
integer
Losses
MIN
float
Minutes played
CONTESTED_SHOTS
integer
Total contested shots
CONTESTED_SHOTS_2PT
integer
Contested 2-point shots
CONTESTED_SHOTS_3PT
integer
Contested 3-point shots
DEFLECTIONS
integer
Deflections recorded
CHARGES_DRAWN
integer
Charges drawn
SCREEN_ASSISTS
integer
Screen assists - screens leading to made baskets
SCREEN_AST_PTS
integer
Points generated from screen assists
OFF_LOOSE_BALLS_RECOVERED
integer
Offensive loose balls recovered
DEF_LOOSE_BALLS_RECOVERED
integer
Defensive loose balls recovered
LOOSE_BALLS_RECOVERED
integer
Total loose balls recovered
PCT_LOOSE_BALLS_RECOVERED_OFF
float
Percentage of loose balls recovered on offense
PCT_LOOSE_BALLS_RECOVERED_DEF
float
Percentage of loose balls recovered on defense
OFF_BOXOUTS
integer
Offensive box outs
DEF_BOXOUTS
integer
Defensive box outs
BOX_OUT_PLAYER_TEAM_REBS
integer
Team rebounds resulting from box outs
BOX_OUT_PLAYER_REBS
integer
Player rebounds resulting from box outs
BOX_OUTS
integer
Total box outs
PCT_BOX_OUTS_OFF
float
Percentage of offensive box outs
PCT_BOX_OUTS_DEF
float
Percentage of defensive box outs
PCT_BOX_OUTS_TEAM_REB
float
Box out to team rebound percentage
PCT_BOX_OUTS_REB
float
Box out to rebound percentage
DIST_FEET
float
Total distance traveled in feet
DIST_MILES
float
Total distance traveled in miles
DIST_MILES_OFF
float
Distance traveled on offense (miles)
DIST_MILES_DEF
float
Distance traveled on defense (miles)
AVG_SPEED
float
Average speed (mph)
AVG_SPEED_OFF
float
Average speed on offense (mph)
AVG_SPEED_DEF
float
Average speed on defense (mph)
POSS
integer
Possessions played

Defense Data

defense_master.csv

Defensive field goal percentage metrics. File: defense_master.csv / defense_master_ps.csv
nba_id
integer
required
Unique player identifier
PLAYER
string
Player name
Team
string
Team abbreviation
team_id
integer
Team identifier
year
integer
required
Season year
overall_dfg%
float
Overall defensive field goal percentage - FG% when guarding any shot
all_dfga
integer
All defensive field goal attempts contested
all_dfgm
integer
All defensive field goals made against
dif%
float
Difference percentage - how much better/worse opponents shoot vs their average
rim_dfg%
float
Defensive FG% at the rim
rim_dfga
integer
Attempts defended at the rim
rim_dfgm
integer
Made shots at the rim when defended
rim_dif%
float
Rim defense difference vs shooter’s average

passing.csv

Passing and ball-handling statistics. File: passing.csv / passing_ps.csv
nba_id
integer
required
Unique player identifier
Name
string
Player name
year
integer
required
Season year
GP
integer
Games played
Minutes
float
Total minutes
Points
integer
Total points
Assists
integer
Total assists
Potential Assists
integer
Passes that would be assists if the shot was made
POTENTIAL_AST
integer
Potential assists (duplicate field)
Passes
integer
Total passes made
PASSES_RECEIVED
integer
Passes received
AST_PTS_CREATED
integer
Points created from assists
AST_TO_PASS_PCT
float
Assist to pass percentage
AST_TO_PASS_PCT_ADJ
float
Adjusted assist to pass percentage
SECONDARY_AST
integer
Secondary assists (pass to the assister)
ThreePtAssists
integer
Assists on 3-pointers
AtRimAssists
integer
Assists at the rim
High Value Assist %
float
Percentage of assists that are high value (dunks, layups, open 3s)
Assist PPP
float
Points per play on assists
TOUCHES
integer
Total touches
AVG_SEC_PER_TOUCH
float
Average seconds per touch
AVG_DRIB_PER_TOUCH
float
Average dribbles per touch
PTS_PER_TOUCH
float
Points per touch
Turnovers
integer
Total turnovers
BadPassTurnovers
integer
Turnovers from bad passes
BadPassSteals
integer
Steals from bad passes
TsPct
float
True shooting percentage

Usage Examples

Finding Elite Catch-and-Shoot Players

import pandas as pd

# Load player shooting data
shooting = pd.read_csv('player_shooting.csv')

# Filter for wide open 3-point attempts
wide_open_3s = shooting[
    (shooting['shot_type'] == 'wide_open') &
    (shooting['3PA'] >= 100)  # Minimum attempts
].sort_values('3P%', ascending=False)

print(wide_open_3s[['PLAYER', 'TEAM', '3PM', '3PA', '3P%', 'year']].head(10))

Analyzing Hustle Impact

# Load hustle data
hustle = pd.read_csv('hustle.csv')

# Players who excel at deflections per minute
hustle['DEFL_PER_MIN'] = hustle['DEFLECTIONS'] / hustle['MIN']

top_deflectors = hustle[
    hustle['MIN'] >= 1000
].sort_values('DEFL_PER_MIN', ascending=False)

print(top_deflectors[['PLAYER_NAME', 'TEAM_ABBREVIATION', 'DEFLECTIONS', 'DEFL_PER_MIN']].head(10))

Join Multiple Player Datasets

# Combine scoring efficiency with tracking data
scoring = pd.read_csv('scoring.csv')
tracking = pd.read_csv('tracking.csv')

# Filter tracking for drives only
drives = tracking[tracking['type'] == 'drives']

# Merge on player ID and year
merged = pd.merge(
    scoring,
    drives,
    left_on=['nba_id', 'year'],
    right_on=['PLAYER_ID', 'year'],
    how='inner'
)

print(merged[['Player', 'TS%', 'PTS', 'DRIVES', 'FG%']].head())

Build docs developers (and LLMs) love