1. 针对这个数据分析案例,我做了一个视频版本,讲解了代码,讲了运行的注意事项,还有一些其他的东西,供需。我对视频制作不是很有经验,所以请大家多多包涵。(视频里有彩蛋
)
同样,我之前也上传过一份到,大家可以点击文末的“阅读原文”直接前往阅读,喜欢的话请多多支持我哦。
2.本文示例的代码写完后,我把它发到了虎扑上,结果被推荐到了首页,阅读量超过25万,回复近800条……谢谢各位JR们的好意!
3.获取原图、更多玩家生成结果及完整代码请在公众号“编程课堂”回复关键字:nba
2018-19NBA赛季已经结束,猛龙队击败勇士队成为新科冠军球队。
我觉得最好做个NBA相关的数据分析案例。其实数据分析团队现在已经成为NBA球队的标配,无论是在球员选拔还是战术制定中都发挥着重要作用。现在整个联盟越来越流行的“点球成金”打法,其实就是基于数据分析的产物。
因此,我们使用官方数据和绘图功能来查看不同球员射门的位置。
0.效果展示
和往常一样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']
# 转 DataFrame
shot_df = pd.DataFrame(shots, columns=headers)
我们关心的数据是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)
我们通过参数来设置点的大小和透明度,以使显示更加清晰。
4. 画出球场
射击点已经画出来了,但是这样还不够直观,我们再加一张球场的图片吧。
这是用 、 、 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