In [1]:
%matplotlib inline

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import datetime

In [2]:
seasons = pd.read_csv('./data/nba/Seasons_Stats.csv')
seasons.drop('Unnamed: 0', axis=1, inplace=True)
seasons = seasons[seasons['Player'] !=0]
#seasons = seasons[seasons['Year'] >= 1980]
seasons = seasons[seasons['Tm'] != 'TOT'] # TOTAL per season (when some player change a team during the season)

In [3]:
seasons['PPG'] = seasons.PTS/seasons.G # points per game

In [4]:
seasons.head().T


Out[4]:
0 1 2 4 5
Year 1950 1950 1950 1950 1950
Player Curly Armstrong Cliff Barker Leo Barnhorst Ed Bartels Ed Bartels
Pos G-F SG SF F F
Age 31 29 25 24 24
Tm FTW INO CHS DNN NYK
G 63 49 67 13 2
GS NaN NaN NaN NaN NaN
MP NaN NaN NaN NaN NaN
PER NaN NaN NaN NaN NaN
TS% 0.368 0.435 0.394 0.308 0.376
3PAr NaN NaN NaN NaN NaN
FTr 0.467 0.387 0.259 0.378 0.75
ORB% NaN NaN NaN NaN NaN
DRB% NaN NaN NaN NaN NaN
TRB% NaN NaN NaN NaN NaN
AST% NaN NaN NaN NaN NaN
STL% NaN NaN NaN NaN NaN
BLK% NaN NaN NaN NaN NaN
TOV% NaN NaN NaN NaN NaN
USG% NaN NaN NaN NaN NaN
blanl NaN NaN NaN NaN NaN
OWS -0.1 1.6 0.9 -0.5 0
DWS 3.6 0.6 2.8 -0.1 0
WS 3.5 2.2 3.6 -0.6 0
WS/48 NaN NaN NaN NaN NaN
blank2 NaN NaN NaN NaN NaN
OBPM NaN NaN NaN NaN NaN
DBPM NaN NaN NaN NaN NaN
BPM NaN NaN NaN NaN NaN
VORP NaN NaN NaN NaN NaN
FG 144 102 174 21 1
FGA 516 274 499 82 4
FG% 0.279 0.372 0.349 0.256 0.25
3P NaN NaN NaN NaN NaN
3PA NaN NaN NaN NaN NaN
3P% NaN NaN NaN NaN NaN
2P 144 102 174 21 1
2PA 516 274 499 82 4
2P% 0.279 0.372 0.349 0.256 0.25
eFG% 0.279 0.372 0.349 0.256 0.25
FT 170 75 90 17 2
FTA 241 106 129 31 3
FT% 0.705 0.708 0.698 0.548 0.667
ORB NaN NaN NaN NaN NaN
DRB NaN NaN NaN NaN NaN
TRB NaN NaN NaN NaN NaN
AST 176 109 140 20 0
STL NaN NaN NaN NaN NaN
BLK NaN NaN NaN NaN NaN
TOV NaN NaN NaN NaN NaN
PF 217 99 192 27 2
PTS 458 279 438 59 4
PPG 7.26984 5.69388 6.53731 4.53846 2

Players by Points Per Game


In [5]:
seasons.sort_values(by='PPG', ascending=False)[['Year', 'Player', 'PPG']]


Out[5]:
Year Player PPG
1706 1962.0 Wilt Chamberlain* 50.362500
1827 1963.0 Wilt Chamberlain* 44.825000
2100 1965.0 Wilt Chamberlain* 38.947368
1593 1961.0 Wilt Chamberlain* 38.392405
1686 1962.0 Elgin Baylor* 38.250000
1473 1960.0 Wilt Chamberlain* 37.597222
8469 1987.0 Michael Jordan* 37.085366
1962 1964.0 Wilt Chamberlain* 36.850000
2355 1967.0 Rick Barry* 35.576923
17742 2006.0 Kobe Bryant 35.400000
8869 1988.0 Michael Jordan* 34.975610
3316 1972.0 Kareem Abdul-Jabbar* 34.839506
1582 1961.0 Elgin Baylor* 34.767123
4255 1975.0 Bob McAdoo* 34.524390
1812 1963.0 Elgin Baylor* 33.987500
3588 1973.0 Tiny Archibald* 33.987500
9747 1990.0 Michael Jordan* 33.573171
2239 1966.0 Wilt Chamberlain* 33.531646
5848 1980.0 George Gervin* 33.141026
17904 2006.0 Allen Iverson* 33.013889
7722 1985.0 Bernard King* 32.890909
11106 1993.0 Michael Jordan* 32.576923
9297 1989.0 Michael Jordan* 32.506173
6557 1982.0 George Gervin* 32.291139
16286 2003.0 Tracy McGrady 32.093333
22438 2014.0 Kevin Durant 32.012346
3070 1971.0 Kareem Abdul-Jabbar* 31.658537
1687 1962.0 Walt Bellamy* 31.582278
24654 2017.0 Russell Westbrook 31.580247
18295 2007.0 Kobe Bryant 31.558442
... ... ... ...
8680 NaN NaN NaN
9107 NaN NaN NaN
9546 NaN NaN NaN
10006 NaN NaN NaN
10448 NaN NaN NaN
10907 NaN NaN NaN
11357 NaN NaN NaN
11839 NaN NaN NaN
12292 NaN NaN NaN
12838 NaN NaN NaN
13413 NaN NaN NaN
13961 NaN NaN NaN
14469 NaN NaN NaN
14966 NaN NaN NaN
15504 NaN NaN NaN
16005 NaN NaN NaN
16489 NaN NaN NaN
17075 NaN NaN NaN
17661 NaN NaN NaN
18225 NaN NaN NaN
18742 NaN NaN NaN
19338 NaN NaN NaN
19921 NaN NaN NaN
20500 NaN NaN NaN
21126 NaN NaN NaN
21678 NaN NaN NaN
22252 NaN NaN NaN
22864 NaN NaN NaN
23516 NaN NaN NaN
24095 NaN NaN NaN

22568 rows × 3 columns


In [6]:
def get_top_players(agg_func, by = 'PPG'):
    return seasons.groupby('Player', as_index=False) \
                .agg(agg_func) \
                .sort_values(by=by, ascending=False) \
                .head(10)[['Player', by]]

In [7]:
top_players_ppg_mean = get_top_players(np.mean)
top_players_ppg_sum = get_top_players(np.sum, by='PTS')

Top players by mean value of Points Per Game


In [8]:
top_players_ppg_mean


Out[8]:
Player PPG
3882 Wilt Chamberlain* 30.375528
2683 Michael Jordan* 29.444797
2402 LeBron James 27.121076
2270 Kevin Durant 27.029466
1881 Jerry West* 26.741316
1433 George Gervin* 26.180839
390 Bob Pettit* 26.177270
2897 Oscar Robertson* 25.526368
1248 Elgin Baylor* 25.275389
92 Allen Iverson* 25.029824

Players who score the most points during the whole career


In [9]:
top_players_ppg_sum


Out[9]:
Player PTS
2183 Kareem Abdul-Jabbar* 38387.0
2185 Karl Malone* 36928.0
2315 Kobe Bryant 33643.0
2683 Michael Jordan* 32292.0
3882 Wilt Chamberlain* 31419.0
1077 Dirk Nowitzki 30260.0
1227 Eddie Johnson 29365.0
2402 LeBron James 28787.0
3393 Shaquille O'Neal* 28596.0
2798 Moses Malone* 27409.0

Teams with the most points


In [19]:
d = seasons.groupby('Tm', as_index=False) \
    .agg(np.sum) \
    .sort_values(by='PTS', ascending=False) \
    .head(20)
sns.barplot(data=d, x='Tm', y='PTS')


Out[19]:
<matplotlib.axes._subplots.AxesSubplot at 0x10accdf28>

In [11]:
seasons['PTSpm'] = seasons['PTS'] / seasons['MP']
seasons['ASTpm'] = seasons['AST'] / seasons['MP']
seasons['TRBpm'] = seasons['TRB'] / seasons['MP']

Stats (points - PTS; assists - AST; rebounds - TRB) by age


In [12]:
# normalized by minutes played
seasons.groupby('Age') \
    .agg(np.mean)[['PTSpm', 'ASTpm', 'TRBpm']] \
    .plot()
    
# not normalized
seasons.groupby('Age') \
    .agg(np.mean)[['PTS', 'AST', 'TRB']] \
    .plot()


Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x10b18d780>

Minutes played by age


In [13]:
seasons.groupby('Age').agg(np.mean)[['MP']].plot()


Out[13]:
<matplotlib.axes._subplots.AxesSubplot at 0x10b250dd8>

In [14]:
# same as above but with regression curve instead of a mean
sns.lmplot(x='Age', y='MP', data=seasons, lowess=True)


Out[14]:
<seaborn.axisgrid.FacetGrid at 0x10b250048>

In [16]:
plt.figure(figsize=(15,15))
plt.plot(seasons.Year,seasons.PPG,'o', alpha = 0.1, color='#00736A')
plt.plot(seasons.Year[seasons.Player == 'Kobe Bryant'],seasons.PPG[seasons.Player == 'Kobe Bryant'], color = '#FF5A00')
plt.plot(seasons.Year[seasons.Player == 'Michael Jordan*'],seasons.PPG[seasons.Player == 'Michael Jordan*'], color = 'r')
plt.plot(seasons.Year[seasons.Player == 'Wilt Chamberlain*'],seasons.PPG[seasons.Player == 'Wilt Chamberlain*'])
plt.legend(['All','Kobe Bryant','Michael Jordan','Wilt Chamberlain*'], fontsize = 15)
plt.xlabel('Year')
plt.ylabel('Points Per Game')


Out[16]:
<matplotlib.text.Text at 0x1092d5160>