网罗全网热门赛事

NBA 数据分析案例:猛龙夺冠,勇士失利,数据背后的故事

1. 针对这个数据分析案例,我做了一个视频版本,讲解了代码,讲了运行的注意事项,还有一些其他的东西,供需。我对视频制作不是很有经验,所以请大家多多包涵。(视频里有彩蛋

同样,我之前也上传过一份到,大家可以点击文末的“阅读原文”直接前往阅读,喜欢的话请多多支持我哦。

2.本文示例的代码写完后,我把它发到了虎扑上,结果被推荐到了首页,阅读量超过25万,回复近800条……谢谢各位JR们的好意!

nba 球员数据_球员数据虎扑_球员数据网站

3.获取原图、更多玩家生成结果及完整代码请在公众号“编程课堂”回复关键字:nba

2018-19NBA赛季已经结束,猛龙队击败勇士队成为新科冠军球队。

我觉得最好做个NBA相关的数据分析案例。其实数据分析团队现在已经成为NBA球队的标配,无论是在球员选拔还是战术制定中都发挥着重要作用。现在整个联盟越来越流行的“点球成金”打法,其实就是基于数据分析的产物。

球员数据虎扑_球员数据网站_nba 球员数据

nba 球员数据_球员数据虎扑_球员数据网站

因此,我们使用官方数据和绘图功能来查看不同球员射门的位置。

0.效果展示

和往常一样nba 球员数据,我们先看看结果。每个点都是一次射击,蓝点表示成功,红点表示未命中。挑选几个具有特征的点:

哈登,很明显他有魔力球,他绝对不会干长距离两分球这种低效的事情。

球员数据网站_nba 球员数据_球员数据虎扑

西蒙斯,经典中锋

球员数据网站_球员数据虎扑_nba 球员数据

德拉赞,中距离投篮之王

球员数据虎扑_nba 球员数据_球员数据网站

字母哥,你篮下扣篮失败了!

球员数据网站_球员数据虎扑_nba 球员数据

库里,这场比赛必须在各处进行……

球员数据网站_nba 球员数据_球员数据虎扑

科比布莱恩特,职业生涯累计图表,全面无盲区,包括篮板后的负角度

nba 球员数据_球员数据虎扑_球员数据网站

下面我们来看看具体的步骤,我们以本赛季刚夺得总冠军戒指的林书豪为例。

1.获取数据

NBA有一个官方数据统计网站:,里面包含了各类数据,可以说是一个宝库。

在网页上没找到我需要的数据,但搜索了一番,找到了网站的开放API,你可以从这个项目中查看相关的API和文档:

- API 适用于

通过如下接口,我们可以获取到指定赛季球员的详细射门数据:

https://stats.nba.com/stats/shotchartdetail?CFID=33&CFPARAMS=2018-19&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&GameID=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerID=201935&PlusMinus=N&Position=&Rank=N&RookieYear=&Season=2018-19&SeasonSegment=&SeasonType=Regular+Season&TeamID=0&VsConference=&VsDivision=&mode=Advanced&showDetails=0&showShots=1&showZones=0&PlayerPosition=

参数为需要查询的球员ID,在网页上搜索球员名字即可从对应的URL获取该ID,例如 Lin

https://stats.nba.com/player/202391/

链接里两个2018-19是季节参数,你可以改成其他季节,不过我尽量不要改得太早nba 球员数据,1996年左右之前没有数据,早期数据准确率较低。

其余参数可以忽略。

使用库可以轻松获得结果(需要添加):

response = requests.get(url, headers=headers,timeout=5)

2.解析数据

返回的数据是JSON格式,进行转换,方便后续处理:

data = response.json()# 获取列名即每项投球数据的意思headers = data['resultSets'][0]['headers']# 获取投球的相关数据shots = data['resultSets'][0]['rowSet']# 转 DataFrameshot_df = pd.DataFrame(shots, columns=headers)

nba 球员数据_球员数据网站_球员数据虎扑

我们关心的数据是LOC_X、LOC_Y(射击位置)和(射击是否成功)三列。

3. 画出射击点

我们可以使用库的散点图方法来绘制射击点,这种方法我们在之前的各种案例中已经使用过多次:

made = shot_df[shot_df['SHOT_MADE_FLAG']==1]miss = shot_df[shot_df['SHOT_MADE_FLAG']==0]plt.scatter(miss.LOC_X, miss.LOC_Y, color='r', marker='.', alpha=0.3)plt.scatter(made.LOC_X, made.LOC_Y, color='b', marker='.', alpha=0.3)

我们通过参数来设置点的大小和透明度,以使显示更加清晰。

球员数据网站_球员数据虎扑_nba 球员数据

4. 画出球场

射击点已经画出来了,但是这样还不够直观,我们再加一张球场的图片吧。

球员数据虎扑_nba 球员数据_球员数据网站

这是用 、 、 Arc 等方法实现的。没有什么特别的技术nba 球员数据,但代码比较复杂,这里就不贴出来了。(如果你愿意,你甚至可以用它来画小猪佩奇)

5. 添加头像

最后在数据图中添加头像,让它看起来更加完整。头像地址:

https://stats.nba.com/media/players/230x185/202391.png# 或者https://ak-static.cms.nba.com/wp-content/uploads/headshots/nba/latest/260x190/202391.png

文件名依然是玩家的ID,但是这个地址并不是对所有玩家都有效,所以可以做异常处理。

pic = urllib.request.urlretrieve("http://stats.nba.com/media/players/230x185/202391.png")# imread 读取的图像可以被 matplotlib 绘制head_pic = plt.imread(pic[0])# 将球员图片放置于右上角,并设置缩小等级以配合整个图片img = OffsetImage(head_pic, zoom=0.6)# (x, y) 控制将球员放在你想要放的位置img.set_offset((540,640))# 添加球员图片fig.gca().add_artist(img)

如果你的电脑上该位置不正确,记得修改下面的值(不同的系统甚至不同的编译器可能会有差异)。

最终效果:

nba 球员数据_球员数据网站_球员数据虎扑

获取原图、更多玩家生成结果及完整代码请在公众号“编程课堂”回复关键字:nba