NBA play-by-play stats are offered in CSV format that has all events occur in a game. Additionally, it includes active lineups, shot distances and shot locations in X, Y coordinates. You get individual game logs and a combined file for the season which includes all games from regular season and playoffs.
Check out FAQ section to find out more about features of play-by-play dataset.
Datasets are separated by seasons and each of a season dataset comes up with 2 types of files: 1) Individual CSV files for all games played in the regular season and the playoffs. 2) A season-to-date CSV file where all CSV game files are combined. Having this file, you can analyze the whole season stats in one sheet.
To give you an idea: Inside the combined CSV file of 2016-2017 season, there are 1311 individual games and 603,494 rows; which makes ~460 rows per game. The size of 2016-2017 dataset is 389 MB and becomes 36.82 MB when zipped.
In brief, our database-friendly (each play presented in a row) log includes every in-game movement such as: “Active players on the court”, “event time (remaining/elapsing)”, “play length & id”, “activity type (substitution/shot/free throw/turnover/foul committed & drawn/rebound/assist/jump ball etc.)”, “shot location” and “shot coordinates”.
Unzip the sample dataset and open the “(2016-06-10)-0041500404-GSW@CLE.xlsx” where descriptions for all columns have been already provided. Keep in mind that, those descriptions do not appear on the season game logs, so we recommend you to keep the sample file easily accessible until you get along with our play-by-play logs.
We provide shot coordinates in two versions: 1) Original coordinates (belongs to a specific x-axis, y-axis system) that are also being used by the NBA official source. 2) Converted coordinates that reflect real basketball court dimensions in terms of feet. NBA basketball court is 50 feet wide, 94 feet long. Please read the column descriptions on the sample file to get a more detailed explanations of coordinates.
We have developed an algorithm in which, substitutions and the relevant game events (points, fouls, getting fouled, assist, steals and etc.) that are assigned to players are taken into account. Note that; if the active player listed does nothing or did not take part in any game event while he’s on the court, then the algorithm might not be 100% accurate and validated.