2024年7月6日土曜日

NBA通算得点ランキング

選手スタッツデータの集計 

NBAの選手スタッツデータセットから得点集計を行ってみたいと思います。

使用させていただくデータはkaggleから、拝借いたします。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd

fn = "Player_Totals.csv"
df = pd.read_csv(fn)

print(df.head())

seas_id  season  player_id         player  birth_year pos   age  experience   lg   tm   g    gs  ...   ft  fta  ft_percent    orb    drb    trb  ast   stl   blk    tov   pf   pts

0    31136    2024       5025     A.J. Green         NaN  SG  24.0           2  NBA  MIL  56   0.0  ...   17   19       0.895    9.0   55.0   64.0   30   9.0   4.0   12.0   49   252

1    31137    2024       5026    A.J. Lawson         NaN  SG  23.0           2  NBA  DAL  42   0.0  ...   15   23       0.652   14.0   36.0   50.0   20  10.0   3.0   14.0   22   136

2    31138    2024       5027     AJ Griffin         NaN  SF  20.0           2  NBA  ATL  20   0.0  ...    2    2       1.000    2.0   16.0   18.0    5   1.0   2.0    8.0    6    48

3    31139    2024       4219   Aaron Gordon         NaN  PF  28.0          10  NBA  DEN  73  73.0  ...  177  269       0.658  174.0  297.0  471.0  259  56.0  45.0  105.0  142  1013

4    31140    2024       4582  Aaron Holiday         NaN  PG  27.0           6  NBA  HOU  78   1.0  ...   58   63       0.921   23.0  100.0  123.0  140  42.0   6.0   53.0  125   514

1947年から最新の2024年データまであるのは助かります。

NBA選手の通算得点ランキング

このデータセットから、歴代通算得点ランキングを集計します。
完成データの手本は、wikipediaのこちら
まずはデータの整理から


print(df['lg'].unique())

# NBAデータだけ抜き出します。
df2 = df[df['lg'] == "NBA"]
df2 = df2[df2['tm'] != "TOT"]


['NBA' 'ABA' 'BAA']

unique関数で見るとNBAデータ以外も含まれています。
NBAデータだけにし、チームからTOT(複数チームの合計)列を抜かします。[合計が入ると二重に加算されてしまうため]


# 必要な列名をリネーム
df2 = df2.rename(columns={'player': 'Player', 'g': 'G', 'fg': 'FGM', 'x3p': '3PM', 'ft': 'FTM'})

# 必要な列だけにする
df3 = df2[['player_id', 'Player', 'G', 'FGM', '3PM', 'FTM']]

print(df3.head())
 player_id         Player   PTS   G  FGM   3PM  FTM
0       5025     A.J. Green   252  56   83  69.0   17
1       5026    A.J. Lawson   136  42   54  13.0   15
2       5027     AJ Griffin    48  20   18  10.0    2
3       4219   Aaron Gordon  1013  73  398  40.0  177
4       4582  Aaron Holiday   514  78  186  84.0   58

データセットが小さくまとまりました。

選手でグループ化

得られたデータを選手でgroupbyします。
インデックスにplayer_idも含めているのは同名の選手を区別するためです。

# 選手でグループ化
players = df3.groupby(["player_id", "Player"])

# グループ毎の合計を出す
score_sum = players.sum()

# 総合得点順にソート
score_sum = score_sum.sort_values('PTS', ascending=False)

# 1試合あたりの平均得点の列を作る
score_sum['PPG'] = np.round(score_sum['PTS'] / score_sum['G'], 2)

# インデックス解除
score_sum.reset_index(inplace=True)

# player_id 削除
score_sum.drop("player_id", axis=1, inplace=True)
print(score_sum)

Player PTS G FGM 3PM FTM PPG
0 LeBron James 40474 1492 14837 2410 8390 27.13
1 Kareem Abdul-Jabbar 38387 1560 15837 1 6712 24.61
2 Karl Malone 36928 1476 13528 85 9787 25.02
3 Kobe Bryant 33643 1346 11719 1827 8378 24.99
4 Michael Jordan 32292 1072 12192 581 7327 30.12
5 Dirk Nowitzki 31560 1522 11169 1982 7240 20.74
6 Wilt Chamberlain 31419 1045 12681 0 6057 30.07
7 Kevin Durant 28924 1061 9950 2031 6993 27.26
8 Shaquille O'Neal 28596 1207 11330 1 5935 23.69
9 Carmelo Anthony 28289 1260 10119 1731 6320 22.45
10 Moses Malone 27409 1329 9435 8 8531 20.62
11 Elvin Hayes 27313 1303 10976 5 5356 20.96
12 Hakeem Olajuwon 26946 1238 10749 25 5423 21.77
13 Oscar Robertson 26710 1040 9508 0 7694 25.68
14 Dominique Wilkins 26668 1074 9963 711 6031 24.83
15 Tim Duncan 26496 1392 10285 30 5896 19.03
16 Paul Pierce 26397 1343 8668 2143 6918 19.66
17 John Havlicek 26395 1270 10513 0 5369 20.78
18 Kevin Garnett 26071 1462 10505 174 4887 17.83
19 James Harden 25885 1072 7643 2940 7659 24.15
20 Vince Carter 25728 1541 9293 2290 4852 16.70
21 Alex English 25613 1193 10659 18 4277 21.47
22 Reggie Miller 25279 1389 8241 2560 6237 18.20
23 Russell Westbrook 25211 1162 9055 1273 5828 21.70
24 Jerry West 25192 932 9016 0 7160 27.03
25 Patrick Ewing 24815 1183 9702 19 5392 20.98
26 Ray Allen 24505 1300 8567 2973 4398 18.85
27 Allen Iverson 24368 914 8467 1059 6375 26.66
28 Charles Barkley 23757 1073 8435 538 6349 22.14
29 Stephen Curry 23668 956 8084 3747 3753 24.76



と同じ結果が得られました。


PTS = (FGM * 2) + 3PM + FTMで計算出来ます。

PTS: 合計得点
G: 試合数
FGM: フィールドゴール数
3PM: 3Pゴール数
FTM: フリースローゴール数

0 件のコメント:

コメントを投稿

Pythonで地図空間データを扱う⑤

ベースの地図が出来た所で、他のデータを被せてみます。 国土地理院の  500mメッシュ別将来推計人口データ  を使用します。 同じく神奈川県のデータ  500m_mesh_suikei_2018_shape_14.zip をダウンロードします。 ベースの地図データと同じ場所に展開...