NBA Stats (1947-present)
Regular Season Data from Basketball-Reference over 73+ Years
@kaggle.sumitrodatta_nba_aba_baa_stats
Regular Season Data from Basketball-Reference over 73+ Years
@kaggle.sumitrodatta_nba_aba_baa_stats
When I set out to gather data for my first NBA-related project, I used the IMPORTHTML function from Google Sheets repeatedly on Basketball-Reference's Play Index (now Stathead), which was...not ideal to say the least. So I decided to learn how to web-scrape and compile this historical data for everyone to use (in the mold of Lahman's Baseball Database).
There are 3 leagues represented: the National Basketball Association (1950-present), the NBA's predecessor in the Basketball Association of America (1947-1949) and the NBA's past competitor in the American Basketball Association (1968-1976)
There are three informational files: Player Season Info, Player Career Info & Team Abbrevs. Each player was given a unique player ID to facilitate aggregation into career stats.
On the team side, there are 7 files:
On the player side, there are 10 files:
For explanations about a certain stat, I'd suggest checking out Basketball-Reference's glossary.
Basketball-Reference for being the greatest comprehensive basketball stats site (in my humble opinion)
Robert Frey and David Schoch for determining how Basketball-Reference formats its pages
Photo by TJ Dragotta on Unsplash
CREATE TABLE advanced (
"seas_id" BIGINT,
"season" BIGINT,
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" DOUBLE,
"experience" BIGINT,
"lg" VARCHAR,
"tm" VARCHAR,
"g" BIGINT,
"mp" DOUBLE,
"per" DOUBLE,
"ts_percent" DOUBLE,
"x3p_ar" DOUBLE,
"f_tr" DOUBLE,
"orb_percent" DOUBLE,
"drb_percent" DOUBLE,
"trb_percent" DOUBLE,
"ast_percent" DOUBLE,
"stl_percent" DOUBLE,
"blk_percent" DOUBLE,
"tov_percent" DOUBLE,
"usg_percent" DOUBLE,
"ows" DOUBLE,
"dws" DOUBLE,
"ws" DOUBLE,
"ws_48" DOUBLE,
"obpm" DOUBLE,
"dbpm" DOUBLE,
"bpm" DOUBLE,
"vorp" DOUBLE
);CREATE TABLE all_star_selections (
"player" VARCHAR,
"team" VARCHAR,
"lg" VARCHAR,
"season" BIGINT,
"replaced" BOOLEAN
);CREATE TABLE end_of_season_teams (
"season" BIGINT,
"lg" VARCHAR,
"type" VARCHAR,
"number_tm" VARCHAR,
"player" VARCHAR,
"position" VARCHAR,
"seas_id" BIGINT,
"player_id" BIGINT,
"birth_year" DOUBLE,
"tm" VARCHAR,
"age" BIGINT
);CREATE TABLE end_of_season_teams_voting (
"season" BIGINT,
"lg" VARCHAR,
"type" VARCHAR,
"number_tm" VARCHAR,
"position" VARCHAR,
"player" VARCHAR,
"age" BIGINT,
"tm" VARCHAR,
"pts_won" DOUBLE,
"pts_max" DOUBLE,
"share" DOUBLE,
"x1st_tm" DOUBLE,
"x2nd_tm" DOUBLE,
"x3rd_tm" DOUBLE,
"seas_id" BIGINT,
"player_id" BIGINT
);CREATE TABLE opponent_stats_per_100_poss (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"abbreviation" VARCHAR,
"playoffs" BOOLEAN,
"g" BIGINT,
"mp" BIGINT,
"opp_fg_per_100_poss" DOUBLE,
"opp_fga_per_100_poss" DOUBLE,
"opp_fg_percent" DOUBLE,
"opp_x3p_per_100_poss" DOUBLE,
"opp_x3pa_per_100_poss" DOUBLE,
"opp_x3p_percent" DOUBLE,
"opp_x2p_per_100_poss" DOUBLE,
"opp_x2pa_per_100_poss" DOUBLE,
"opp_x2p_percent" DOUBLE,
"opp_ft_per_100_poss" DOUBLE,
"opp_fta_per_100_poss" DOUBLE,
"opp_ft_percent" DOUBLE,
"opp_orb_per_100_poss" DOUBLE,
"opp_drb_per_100_poss" DOUBLE,
"opp_trb_per_100_poss" DOUBLE,
"opp_ast_per_100_poss" DOUBLE,
"opp_stl_per_100_poss" DOUBLE,
"opp_blk_per_100_poss" DOUBLE,
"opp_tov_per_100_poss" DOUBLE,
"opp_pf_per_100_poss" DOUBLE,
"opp_pts_per_100_poss" DOUBLE
);CREATE TABLE opponent_stats_per_game (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"abbreviation" VARCHAR,
"playoffs" BOOLEAN,
"g" DOUBLE,
"mp_per_game" DOUBLE,
"opp_fg_per_game" DOUBLE,
"opp_fga_per_game" DOUBLE,
"opp_fg_percent" DOUBLE,
"opp_x3p_per_game" DOUBLE,
"opp_x3pa_per_game" DOUBLE,
"opp_x3p_percent" DOUBLE,
"opp_x2p_per_game" DOUBLE,
"opp_x2pa_per_game" DOUBLE,
"opp_x2p_percent" DOUBLE,
"opp_ft_per_game" DOUBLE,
"opp_fta_per_game" DOUBLE,
"opp_ft_percent" DOUBLE,
"opp_orb_per_game" DOUBLE,
"opp_drb_per_game" DOUBLE,
"opp_trb_per_game" DOUBLE,
"opp_ast_per_game" DOUBLE,
"opp_stl_per_game" DOUBLE,
"opp_blk_per_game" DOUBLE,
"opp_tov_per_game" DOUBLE,
"opp_pf_per_game" DOUBLE,
"opp_pts_per_game" DOUBLE
);CREATE TABLE opponent_totals (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"abbreviation" VARCHAR,
"playoffs" BOOLEAN,
"g" DOUBLE,
"mp" DOUBLE,
"opp_fg" DOUBLE,
"opp_fga" DOUBLE,
"opp_fg_percent" DOUBLE,
"opp_x3p" DOUBLE,
"opp_x3pa" DOUBLE,
"opp_x3p_percent" DOUBLE,
"opp_x2p" DOUBLE,
"opp_x2pa" DOUBLE,
"opp_x2p_percent" DOUBLE,
"opp_ft" DOUBLE,
"opp_fta" DOUBLE,
"opp_ft_percent" DOUBLE,
"opp_orb" DOUBLE,
"opp_drb" DOUBLE,
"opp_trb" DOUBLE,
"opp_ast" DOUBLE,
"opp_stl" DOUBLE,
"opp_blk" DOUBLE,
"opp_tov" DOUBLE,
"opp_pf" DOUBLE,
"opp_pts" DOUBLE
);CREATE TABLE per_100_poss (
"seas_id" BIGINT,
"season" BIGINT,
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" BIGINT,
"experience" BIGINT,
"lg" VARCHAR,
"tm" VARCHAR,
"g" BIGINT,
"gs" DOUBLE,
"mp" BIGINT,
"fg_per_100_poss" DOUBLE,
"fga_per_100_poss" DOUBLE,
"fg_percent" DOUBLE,
"x3p_per_100_poss" DOUBLE,
"x3pa_per_100_poss" DOUBLE,
"x3p_percent" DOUBLE,
"x2p_per_100_poss" DOUBLE,
"x2pa_per_100_poss" DOUBLE,
"x2p_percent" DOUBLE,
"ft_per_100_poss" DOUBLE,
"fta_per_100_poss" DOUBLE,
"ft_percent" DOUBLE,
"orb_per_100_poss" DOUBLE,
"drb_per_100_poss" DOUBLE,
"trb_per_100_poss" DOUBLE,
"ast_per_100_poss" DOUBLE,
"stl_per_100_poss" DOUBLE,
"blk_per_100_poss" DOUBLE,
"tov_per_100_poss" DOUBLE,
"pf_per_100_poss" DOUBLE,
"pts_per_100_poss" DOUBLE,
"o_rtg" DOUBLE,
"d_rtg" DOUBLE
);CREATE TABLE per_36_minutes (
"seas_id" BIGINT,
"season" BIGINT,
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" DOUBLE,
"experience" BIGINT,
"lg" VARCHAR,
"tm" VARCHAR,
"g" BIGINT,
"gs" DOUBLE,
"mp" DOUBLE,
"fg_per_36_min" DOUBLE,
"fga_per_36_min" DOUBLE,
"fg_percent" DOUBLE,
"x3p_per_36_min" DOUBLE,
"x3pa_per_36_min" DOUBLE,
"x3p_percent" DOUBLE,
"x2p_per_36_min" DOUBLE,
"x2pa_per_36_min" DOUBLE,
"x2p_percent" DOUBLE,
"ft_per_36_min" DOUBLE,
"fta_per_36_min" DOUBLE,
"ft_percent" DOUBLE,
"orb_per_36_min" DOUBLE,
"drb_per_36_min" DOUBLE,
"trb_per_36_min" DOUBLE,
"ast_per_36_min" DOUBLE,
"stl_per_36_min" DOUBLE,
"blk_per_36_min" DOUBLE,
"tov_per_36_min" DOUBLE,
"pf_per_36_min" DOUBLE,
"pts_per_36_min" DOUBLE
);CREATE TABLE player_award_shares (
"season" BIGINT,
"award" VARCHAR,
"player" VARCHAR,
"age" BIGINT,
"tm" VARCHAR,
"first" DOUBLE,
"pts_won" DOUBLE,
"pts_max" DOUBLE,
"share" DOUBLE,
"winner" VARCHAR,
"seas_id" BIGINT,
"player_id" BIGINT
);CREATE TABLE player_career_info (
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"hof" BOOLEAN,
"num_seasons" BIGINT,
"first_seas" BIGINT,
"last_seas" BIGINT
);CREATE TABLE player_directory (
"player" VARCHAR,
"from" BIGINT,
"to" BIGINT,
"pos" VARCHAR,
"ht_in_in" BIGINT,
"wt" DOUBLE,
"birth_date" TIMESTAMP,
"colleges" VARCHAR,
"hof" BOOLEAN,
"slug" VARCHAR
);CREATE TABLE player_per_game (
"seas_id" BIGINT,
"season" BIGINT,
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" DOUBLE,
"experience" BIGINT,
"lg" VARCHAR,
"tm" VARCHAR,
"g" BIGINT,
"gs" DOUBLE,
"mp_per_game" DOUBLE,
"fg_per_game" DOUBLE,
"fga_per_game" DOUBLE,
"fg_percent" DOUBLE,
"x3p_per_game" DOUBLE,
"x3pa_per_game" DOUBLE,
"x3p_percent" DOUBLE,
"x2p_per_game" DOUBLE,
"x2pa_per_game" DOUBLE,
"x2p_percent" DOUBLE,
"e_fg_percent" DOUBLE,
"ft_per_game" DOUBLE,
"fta_per_game" DOUBLE,
"ft_percent" DOUBLE,
"orb_per_game" DOUBLE,
"drb_per_game" DOUBLE,
"trb_per_game" DOUBLE,
"ast_per_game" DOUBLE,
"stl_per_game" DOUBLE,
"blk_per_game" DOUBLE,
"tov_per_game" DOUBLE,
"pf_per_game" DOUBLE,
"pts_per_game" DOUBLE
);CREATE TABLE player_play_by_play (
"seas_id" DOUBLE,
"season" BIGINT,
"player_id" DOUBLE,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" BIGINT,
"experience" DOUBLE,
"lg" VARCHAR,
"tm" VARCHAR,
"g" BIGINT,
"mp" BIGINT,
"pg_percent" DOUBLE,
"sg_percent" DOUBLE,
"sf_percent" DOUBLE,
"pf_percent" DOUBLE,
"c_percent" DOUBLE,
"on_court_plus_minus_per_100_poss" DOUBLE,
"net_plus_minus_per_100_poss" DOUBLE,
"bad_pass_turnover" BIGINT,
"lost_ball_turnover" BIGINT,
"shooting_foul_committed" BIGINT,
"offensive_foul_committed" BIGINT,
"shooting_foul_drawn" BIGINT,
"offensive_foul_drawn" DOUBLE,
"points_generated_by_assists" BIGINT,
"and1" BIGINT,
"fga_blocked" BIGINT
);CREATE TABLE player_season_info (
"season" BIGINT,
"seas_id" BIGINT,
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" DOUBLE,
"lg" VARCHAR,
"tm" VARCHAR,
"experience" BIGINT
);CREATE TABLE player_shooting (
"seas_id" BIGINT,
"season" BIGINT,
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" BIGINT,
"experience" BIGINT,
"lg" VARCHAR,
"tm" VARCHAR,
"g" BIGINT,
"mp" BIGINT,
"fg_percent" DOUBLE,
"avg_dist_fga" DOUBLE,
"percent_fga_from_x2p_range" DOUBLE,
"percent_fga_from_x0_3_range" DOUBLE,
"percent_fga_from_x3_10_range" DOUBLE,
"percent_fga_from_x10_16_range" DOUBLE,
"percent_fga_from_x16_3p_range" DOUBLE,
"percent_fga_from_x3p_range" DOUBLE,
"fg_percent_from_x2p_range" DOUBLE,
"fg_percent_from_x0_3_range" DOUBLE,
"fg_percent_from_x3_10_range" DOUBLE,
"fg_percent_from_x10_16_range" DOUBLE,
"fg_percent_from_x16_3p_range" DOUBLE,
"fg_percent_from_x3p_range" DOUBLE,
"percent_assisted_x2p_fg" DOUBLE,
"percent_assisted_x3p_fg" DOUBLE,
"percent_dunks_of_fga" DOUBLE,
"num_of_dunks" BIGINT,
"percent_corner_3s_of_3pa" DOUBLE,
"corner_3_point_percent" DOUBLE,
"num_heaves_attempted" BIGINT,
"num_heaves_made" BIGINT
);CREATE TABLE player_totals (
"seas_id" BIGINT,
"season" BIGINT,
"player_id" BIGINT,
"player" VARCHAR,
"birth_year" DOUBLE,
"pos" VARCHAR,
"age" DOUBLE,
"experience" BIGINT,
"lg" VARCHAR,
"tm" VARCHAR,
"g" BIGINT,
"gs" DOUBLE,
"mp" DOUBLE,
"fg" BIGINT,
"fga" BIGINT,
"fg_percent" DOUBLE,
"x3p" DOUBLE,
"x3pa" DOUBLE,
"x3p_percent" DOUBLE,
"x2p" BIGINT,
"x2pa" BIGINT,
"x2p_percent" DOUBLE,
"e_fg_percent" DOUBLE,
"ft" BIGINT,
"fta" BIGINT,
"ft_percent" DOUBLE,
"orb" DOUBLE,
"drb" DOUBLE,
"trb" DOUBLE,
"ast" BIGINT,
"stl" DOUBLE,
"blk" DOUBLE,
"tov" DOUBLE,
"pf" BIGINT,
"pts" BIGINT
);CREATE TABLE team_abbrev (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"playoffs" BOOLEAN,
"abbreviation" VARCHAR
);CREATE TABLE team_stats_per_100_poss (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"abbreviation" VARCHAR,
"playoffs" BOOLEAN,
"g" BIGINT,
"mp" BIGINT,
"fg_per_100_poss" DOUBLE,
"fga_per_100_poss" DOUBLE,
"fg_percent" DOUBLE,
"x3p_per_100_poss" DOUBLE,
"x3pa_per_100_poss" DOUBLE,
"x3p_percent" DOUBLE,
"x2p_per_100_poss" DOUBLE,
"x2pa_per_100_poss" DOUBLE,
"x2p_percent" DOUBLE,
"ft_per_100_poss" DOUBLE,
"fta_per_100_poss" DOUBLE,
"ft_percent" DOUBLE,
"orb_per_100_poss" DOUBLE,
"drb_per_100_poss" DOUBLE,
"trb_per_100_poss" DOUBLE,
"ast_per_100_poss" DOUBLE,
"stl_per_100_poss" DOUBLE,
"blk_per_100_poss" DOUBLE,
"tov_per_100_poss" DOUBLE,
"pf_per_100_poss" DOUBLE,
"pts_per_100_poss" DOUBLE
);CREATE TABLE team_stats_per_game (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"abbreviation" VARCHAR,
"playoffs" BOOLEAN,
"g" DOUBLE,
"mp_per_game" DOUBLE,
"fg_per_game" DOUBLE,
"fga_per_game" DOUBLE,
"fg_percent" DOUBLE,
"x3p_per_game" DOUBLE,
"x3pa_per_game" DOUBLE,
"x3p_percent" DOUBLE,
"x2p_per_game" DOUBLE,
"x2pa_per_game" DOUBLE,
"x2p_percent" DOUBLE,
"ft_per_game" DOUBLE,
"fta_per_game" DOUBLE,
"ft_percent" DOUBLE,
"orb_per_game" DOUBLE,
"drb_per_game" DOUBLE,
"trb_per_game" DOUBLE,
"ast_per_game" DOUBLE,
"stl_per_game" DOUBLE,
"blk_per_game" DOUBLE,
"tov_per_game" DOUBLE,
"pf_per_game" DOUBLE,
"pts_per_game" DOUBLE
);CREATE TABLE team_summaries (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"abbreviation" VARCHAR,
"playoffs" BOOLEAN,
"age" DOUBLE,
"w" DOUBLE,
"l" DOUBLE,
"pw" DOUBLE,
"pl" DOUBLE,
"mov" DOUBLE,
"sos" DOUBLE,
"srs" DOUBLE,
"o_rtg" DOUBLE,
"d_rtg" DOUBLE,
"n_rtg" DOUBLE,
"pace" DOUBLE,
"f_tr" DOUBLE,
"x3p_ar" DOUBLE,
"ts_percent" DOUBLE,
"e_fg_percent" DOUBLE,
"tov_percent" DOUBLE,
"orb_percent" DOUBLE,
"ft_fga" DOUBLE,
"opp_e_fg_percent" DOUBLE,
"opp_tov_percent" DOUBLE,
"opp_drb_percent" DOUBLE,
"opp_ft_fga" DOUBLE,
"arena" VARCHAR,
"attend" DOUBLE,
"attend_g" DOUBLE
);CREATE TABLE team_totals (
"season" BIGINT,
"lg" VARCHAR,
"team" VARCHAR,
"abbreviation" VARCHAR,
"playoffs" BOOLEAN,
"g" DOUBLE,
"mp" DOUBLE,
"fg" DOUBLE,
"fga" DOUBLE,
"fg_percent" DOUBLE,
"x3p" DOUBLE,
"x3pa" DOUBLE,
"x3p_percent" DOUBLE,
"x2p" DOUBLE,
"x2pa" DOUBLE,
"x2p_percent" DOUBLE,
"ft" DOUBLE,
"fta" DOUBLE,
"ft_percent" DOUBLE,
"orb" DOUBLE,
"drb" DOUBLE,
"trb" DOUBLE,
"ast" DOUBLE,
"stl" DOUBLE,
"blk" DOUBLE,
"tov" DOUBLE,
"pf" DOUBLE,
"pts" DOUBLE
);Anyone who has the link will be able to view this.