Skip to main content

Overview

Team-level statistics aggregate performance metrics at the team level. These datasets are useful for analyzing team strategies, tendencies, and overall effectiveness.

Core Team Files

team_shooting.csv

Team shooting statistics by shot coverage type. File: team_shooting.csv / team_shooting_ps.csv
TEAM
string
required
Team abbreviation (e.g., “LAL”, “BOS”, “GSW”)
TEAMNAME
string
Full team name (e.g., “Los Angeles Lakers”)
year
integer
required
Season year
shot_coverage
string
required
Shot coverage category:
  • Open: Defender 4+ feet away
  • Tight: Defender 2-4 feet away
  • Very Tight: Defender 0-2 feet away
  • Wide Open: Defender 6+ feet away
GP
integer
Games played
G
integer
Total games in dataset
Freq%
float
Frequency percentage - what portion of team’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
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
3PM
integer
3-pointers made
3PA
integer
3-pointers attempted
3P%
float
3-point percentage
Example:
TEAM,GP,G,Freq%,FGM,FGA,FG%,eFG%,2FG Freq%,2FGM,2FGA,2FG%,3FG Freq%,3PM,3PA,3P%,shot_coverage,year,TEAMNAME
ATL,82,82,45.2,1850,3987,46.4,48.1,35.6,1420,3140,45.2,9.6,430,847,50.8,wide_open,2014,Atlanta Hawks

team_shotzone.csv

Team shooting performance by court zone. File: team_shotzone.csv / team_shotzone_ps.csv
Name
string
required
Team abbreviation
EntityId
integer
required
Team identifier
TeamId
integer
Team ID (same as EntityId)
TeamAbbreviation
string
Team abbreviation (same as Name)
year
integer
required
Season year
GamesPlayed
integer
Games played
OffPoss
integer
Offensive possessions
DefPoss
integer
Defensive possessions
Points
integer
Total points scored
FtPoints
integer
Points from free throws
FTA
integer
Free throw attempts
AtRimFGA
integer
Field goal attempts at the rim
AtRimFGM
integer
Field goals made at the rim
AtRimAccuracy
float
Shooting accuracy at the rim (percentage)
ShortMidRangeFGA
integer
Short mid-range field goal attempts
ShortMidRangeFGM
integer
Short mid-range field goals made
ShortMidRangeAccuracy
float
Short mid-range accuracy percentage
ShortMidRangeFrequency
float
Frequency of short mid-range attempts
LongMidRangeFGA
integer
Long mid-range field goal attempts
LongMidRangeFGM
integer
Long mid-range field goals made
FG2A
integer
Total 2-point attempts
FG2M
integer
Total 2-point makes
FG3A
integer
Total 3-point attempts
NonHeaveFg3Pct
float
3-point percentage excluding heaves
NonHeaveArc3FGA
integer
Non-heave 3-point attempts from the arc
NonHeaveArc3FGM
integer
Non-heave 3-point makes from the arc
HeaveAttempts
integer
Number of heave attempts (end-of-clock desperation shots)
Corner3FGA
integer
Corner 3-point attempts
Corner3FGM
integer
Corner 3-point makes
TsPct
float
True shooting percentage
EfgPct
float
Effective field goal percentage
SecondChanceEfgPct
float
eFG% on second chance opportunities
PenaltyEfgPct
float
eFG% in the penalty (bonus free throw situation)
SecondChanceTsPct
float
True shooting % on second chance opportunities
PenaltyTsPct
float
True shooting % in the penalty
SecondChanceShotQualityAvg
float
Average shot quality on second chance attempts
PenaltyShotQualityAvg
float
Average shot quality in penalty situations
ShotQualityAvg
float
Overall average shot quality

teamplay.csv

Team play-type statistics (offensive). File: teamplay.csv / teamplay_p.csv
Team
string
required
Team abbreviation
full_name
string
Full team name
year
integer
required
Season year
playtype
string
required
Type of offensive play:
  • Transition: Fast break plays
  • Isolation: 1-on-1 isolation plays
  • PRBallHandler: Pick and roll ball handler
  • PRRollMan: Pick and roll roll man
  • Postup: Post-up plays
  • Spotup: Spot-up shooting
  • Handoff: Handoff plays
  • Cut: Cutting to the basket
  • OffScreen: Off-ball screens
  • OffRebound: Offensive rebound putbacks
  • Misc: Miscellaneous plays
GP
integer
Games played
POSS
integer
Total possessions of this play type
FREQ%
float
Frequency percentage - portion of team’s plays that are this type
PPP
float
Points per possession for this play type
Points
integer
Total points scored on this play type
FGM
integer
Field goals made
FGA
integer
Field goals attempted
FG%
float
Field goal percentage
EFG%
float
Effective field goal percentage
FTFREQ%
float
Free throw frequency - possessions ending in free throws
TOVFREQ%
float
Turnover frequency - possessions ending in turnovers
SFFREQ%
float
Shooting foul frequency
AND ONEFREQ%
float
And-one frequency - made shot with foul
SCOREFREQ%
float
Scoring frequency - possessions resulting in points
PERCENTILE
float
Percentile rank among all teams for this play type
Example:
Team,GP,POSS,FREQ%,PPP,Points,FGM,FGA,FG%,EFG%,FTFREQ%,TOVFREQ%,SFFREQ%,AND ONEFREQ%,SCOREFREQ%,PERCENTILE,year,playtype,full_name
ATL,82,1456,18.5,1.12,1631,589,1098,53.6,55.2,12.4,8.9,10.1,4.2,58.1,76.2,2014,Transition,Atlanta Hawks

opp_team_shooting.csv

Opponent team shooting statistics (defensive perspective). File: opp_team_shooting.csv / opp_team_shooting_ps.csv Schema is identical to team_shooting.csv, but represents the shooting performance allowed by the defense rather than offensive shooting.
TEAM
string
required
Team abbreviation (the defensive team)
year
integer
required
Season year
shot_coverage
string
required
Shot coverage provided by defense
All other fields match team_shooting.csv schema, representing opponent shooting performance.

team_shotzone_vs.csv

Team shooting performance by zone (defensive/opponent view). File: team_shotzone_vs.csv / team_shotzone_vs_ps.csv Schema matches team_shotzone.csv, representing opponent shooting performance by zone that the team allowed.

Usage Examples

Analyzing Team 3-Point Tendencies

import pandas as pd

# Load team shooting data
team_shooting = pd.read_csv('team_shooting.csv')

# Filter for 2023 season and wide open 3s
wide_open_2023 = team_shooting[
    (team_shooting['year'] == 2023) &
    (team_shooting['shot_coverage'] == 'Wide Open')
]

# Calculate 3-point volume and efficiency
wide_open_2023['3PA_per_game'] = wide_open_2023['3PA'] / wide_open_2023['GP']

print(wide_open_2023[['TEAM', '3PA_per_game', '3P%', 'Freq%']].sort_values('3PA_per_game', ascending=False))

Comparing Offensive and Defensive Efficiency by Play Type

# Load offensive and defensive play-type data
team_offense = pd.read_csv('teamplay.csv')
team_defense = pd.read_csv('teamplayd.csv')

# Filter for transition plays in 2023
transition_off = team_offense[
    (team_offense['year'] == 2023) &
    (team_offense['playtype'] == 'Transition')
]

transition_def = team_defense[
    (team_defense['year'] == 2023) &
    (team_defense['playtype'] == 'Transition')
]

# Merge offensive and defensive stats
transition = pd.merge(
    transition_off[['Team', 'PPP', 'FREQ%']],
    transition_def[['Team', 'PPP', 'FREQ%']],
    on='Team',
    suffixes=('_off', '_def')
)

# Calculate net efficiency
transition['net_ppp'] = transition['PPP_off'] - transition['PPP_def']

print(transition.sort_values('net_ppp', ascending=False))

Shot Distribution Analysis

# Load team shot zone data
shot_zones = pd.read_csv('team_shotzone.csv')

# Calculate shot distribution for each team
shot_zones['rim_freq'] = shot_zones['AtRimFGA'] / (shot_zones['FG2A'] + shot_zones['FG3A'])
shot_zones['three_freq'] = shot_zones['FG3A'] / (shot_zones['FG2A'] + shot_zones['FG3A'])
shot_zones['mid_freq'] = (shot_zones['ShortMidRangeFGA'] + shot_zones['LongMidRangeFGA']) / (shot_zones['FG2A'] + shot_zones['FG3A'])

# Filter for 2023 and compare modern vs traditional shot selection
shot_dist_2023 = shot_zones[shot_zones['year'] == 2023]

print(shot_dist_2023[['Name', 'rim_freq', 'three_freq', 'mid_freq', 'TsPct']].sort_values('TsPct', ascending=False))

Defensive Shot Quality Allowed

# Load opponent shooting data
opp_shooting = pd.read_csv('opp_team_shooting.csv')

# Pivot to compare coverage types
coverage_pivot = opp_shooting.pivot_table(
    index=['TEAM', 'year'],
    columns='shot_coverage',
    values=['FGA', 'FG%', 'Freq%']
)

# Filter for 2023 and calculate defensive quality
defense_2023 = coverage_pivot[coverage_pivot.index.get_level_values('year') == 2023]

# Teams that force the most contested shots
print(defense_2023.sort_values(('Freq%', 'Very Tight'), ascending=False))

Play-Type Efficiency Rankings

# Load team play-type data
teamplay = pd.read_csv('teamplay.csv')

# Find most efficient play types by team
efficient_plays = teamplay[
    (teamplay['year'] == 2023) &
    (teamplay['POSS'] >= 100)  # Minimum sample size
].sort_values(['Team', 'PPP'], ascending=[True, False])

# Get top play type for each team
top_play_by_team = efficient_plays.groupby('Team').first().reset_index()

print(top_play_by_team[['Team', 'playtype', 'PPP', 'FREQ%', 'SCOREFREQ%']])

Relationship to Player Data

Team statistics can be connected to player statistics through:
  • Team abbreviation: Join on TEAM or Team field
  • Season: Join on year field
  • Aggregation: Sum player stats to validate team totals
# Example: Verify team 3-point totals from player data
player_shooting = pd.read_csv('player_shooting.csv')

# Aggregate player 3PA by team
player_team_3pa = player_shooting[
    player_shooting['year'] == 2023
].groupby('TEAM')['3PA'].sum().reset_index()

# Compare to team totals
team_totals = team_shooting[
    team_shooting['year'] == 2023
].groupby('TEAM')['3PA'].sum().reset_index()

comparison = pd.merge(player_team_3pa, team_totals, on='TEAM', suffixes=('_player', '_team'))
print(comparison)

Build docs developers (and LLMs) love