资讯专栏INFORMATION COLUMN

Python告诉你NBA球星都喜欢在哪个位置出手?

stackfing / 3464人阅读

摘要:近日各队纷纷发布季前赛赛程,迎接新赛季。实际上,数据分析团队对于现在的球队已经算是标配了,无论是在球员选择还是战术制定上都起着重要的作用。于是,我们就借助官方数据和的绘图函数,来看一看不同的球员都是在什么位置出手投篮的。比如林书豪就是。

作者 | Crossin先生

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

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

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


01 视频版本

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

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

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

NBA出手点统计代码:

https://gitee.com/crossin/sni...

几十位球星生成图:

提取码: jbpw

02 效果展示

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

1. 哈登

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

2. 西蒙斯

古典中锋

3. 德拉赞

中投小王子

4. 字母哥

篮下都给你扣糊了!

5. 库里

这个得放全场……

6. 科比

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

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

03 获取数据

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

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

nba_py - stats.nba.com API for python

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

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

https://stats.nba.com/stats/s...

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

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

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

其他参数可以不用管。

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

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

04 解析数据

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

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

我们关心的数据就是 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)

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

06 绘制球场

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

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

07 添加头像

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

https://stats.nba.com/media/p...://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的值(不同系统,甚至不同编译器都可能存在差异)。

最终效果:

获取更多精彩内容和专业帮助,可前往:CDA数据分析研究院-12年数据科学教育品牌-引领人工智能新视界

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45187.html

相关文章

  • 前端学习记录(HTML篇)

    摘要:如果在元素内点击文本,就会触发,浏览器会自动将焦点转到和标签相关的表单控件上。在用户使用具体某种方式加入付费会员时,须阅读并确认相关的用户协议和使用方法。在之前,主要提供两种元素来进行多媒体的展示,一个是标签,另一个是标签。 HTML Hyper Text Markup Language,超文本标记语言,不是一种编程语言,而是一种标记语言 思想:网页中有很多数据,不同的数据可能需要不同...

    gplane 评论0 收藏0
  • 如何使用 Python 创建一个 NBA 得分图?

    摘要:本文意在创建一个得分图,该图同时描绘了从场上不同位置投篮得分的百分比和投篮次数,这和个人网站上的帖子类似。接下来,我们需要绘制一个包含得分图的篮球场图。球员照片会出现在得分图的右下角。的解决办法是将命中率与联赛平均分关联。 本文意在创建一个得分图,该图同时描绘了从场上不同位置投篮得分的百分比和投篮次数,这和 Austin Clemen 个人网站上的帖子 http://www.austi...

    KitorinZero 评论0 收藏0
  • pythonScikit-learn中用决策树和随机森林预测NBA获胜者

    摘要:在本文中,我们将以的决策树和随机森林预测获胜者。用决策树和随机森林预测获胜者导入数据集并解析日期导入熊猫作为。这将帮助我们查看决策树分类器的预测是否正确。混淆矩阵显示了我们决策树的正确和不正确的分类。 showImg(https://segmentfault.com/img/bVbcr26?w=750&h=383); 在本文中,我们将以Scikit-learn的决策树和随机森林预测NB...

    learning 评论0 收藏0
  • 阿里云AI如何助攻世界杯?视频集锦背后的技术实践

    摘要:可预见的未来激情赛事已经过半,阿里云视频技术在本次世界杯中也成功落地,而这并不是结局,这是将视频应用于体育行业以及更多其他行业的开端。 本届世界杯互联网直播的顺利进行,离不开各大云计算厂商的支持。在这其中,阿里云是当之无愧的C位,除了优酷外,阿里云还支撑了CNTV、CCTV5客户端,为全网70%的世界杯直播流量保驾护航。 对于世界杯这种超大观看量级、超强影响力的重要体育赛事,阿里云一直...

    BothEyes1993 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<