导读:NBA 2018-19 赛季已经落下帷幕,猛龙击败勇士,成为新科冠军球队。近日各队纷纷发布2019-20季前赛赛程,迎接新赛季。

我想,不如来做个 NBA 相关的数据分析案例好了。实际上,数据分析团队对于现在的 NBA 球队已经算是标配了,无论是在球员选择还是战术制定上都起着重要的作用。当下整个联盟越来越盛行的“魔球化”打法,其实也正是基于数据分析的产物。

于是,我们就借助官方数据和 Python 的绘图函数,来看一看不同的球员都是在什么位置出手投篮的。

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

01 视频版本

这篇数据分析案例,我做了个视频版本,对代码做了解读,讲了运行的注意事项和一些有的没的,供需。对于视频制作还不是很有经验,多包涵。(视频里有彩蛋)

本文在案例的代码写完后,我把它发在了虎扑上。结果,被推荐上了首页,25万多次浏览,近800回复……感谢各位JRs赏脸!

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

原图、更多球员生成的结果及完整代码,见以下网址:

NBA出手点统计代码:

https://gitee.com/crossin/snippet/tree/master/nba-fpa

几十位球星生成图:

提取码: jbpw

02 效果展示

照例先看结果,每个点是一次投篮,蓝色点是投中,红色点是未中。挑几个有特点的:

1. 哈登

魔球得很明显了,长两分这种低效率的事绝对不干

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

2. 西蒙斯

古典中锋

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

3. 德拉赞

中投小王子

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

4. 字母哥

篮下都给你扣糊了!

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

5. 库里

这个得放全场……

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

6. 科比

生涯累计图,全方位无死角,包括篮板后负角度

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

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

03 获取数据

NBA 有一个官方统计网站:stats.nba.com,上面有各种数据,可以说是一个宝藏了。

从网页上,我没有找到这次所需的数据。但通过一番搜索,我找到了网站的开放接口 API。相关的接口和文档你可以从这个项目里查看:

nba_py - stats.nba.com API for python

https://github.com/seemethere/nba_py/

通过以下接口,我们可以获取某个球员在指定赛季的投篮详细数据:

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=

其中参数 PlayerID是查询球员的 ID,这个 ID 可以通过在网页上搜索球员姓名,从对应的 URL 中获取。比如林书豪就是 202391。

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

链接中的两处 2018-19是赛季参数,你可以改成其他赛季,不过我试过不能太早,大约 96 年往前就没数据了,而且早期数据精度要差些。

其他参数可以不用管。

用 requests库可轻松获取结果(需加上 headers):

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

04 解析数据

返回的数据是 JSON格式,用 pandas 转成 DataFrame 格式,方便后续处理:

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

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

我们关心的数据就是 LOC_X、LOC_Y(出手位置)和 SHOT_MADE_FLAG(是否投中)这三列。

05 绘制投篮点

使用 matplotlib库的散点图绘制 scatter 方法就可以把投篮点画出来,这个我们之前的各种案例里也用过不少次了:

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)

我们通过参数设定点的大小和透明度,让显示更清楚。

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

06 绘制球场

投篮点画出来了,不过只是这样不够直观。我们再来加个球场的图。

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

这个是通过 matplotlib里的 Circle、Rectangle、Arc 等方法拼出来的,没啥特别的技术,但代码比较繁琐,这边就不贴了。(只要你愿意,甚至可以用它画出小猪佩奇)

07 添加头像

最后,再给数据图加上一个头像,让它看起来更完整。头像地址:

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)

如果在你的电脑上位置不对,记得修改下 offset的值(不同系统,甚至不同编译器都可能存在差异)。

最终效果:

新知图谱, Python告诉你NBA球星都喜欢在哪个位置出手?

来源商业新知网,原标题:Python告诉你NBA球星都喜欢在哪个位置出手?