ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

虎扑热帖|Python数据分析|NBA的球星们喜欢在哪个位置出手

2021-04-14 13:01:13  阅读:238  来源: 互联网

标签:LOC stats Python 热帖 headers 球员 NBA com nba


前言


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




同样,之前上传了B站一份,点文末“阅读原文”可直达,喜欢的话请支持我一下。


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


图片


3. 获取原图、更多球员生成的结果及完整代码,请在公众号“Crossin的编程教室”内回复关键字:nba




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


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


图片

图片


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


0. 效果展示


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


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

图片

西蒙斯,古典中锋

图片

德拉赞,中投小王子

图片

母哥,篮下都给你扣糊了!

图片

库里,这个得放全场……

图片

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

图片

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


1. 获取数据


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)


2. 解析数据


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


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

图片

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


3. 绘制投篮点


使用 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)


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

图片


4. 绘制球场


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

图片


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


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)


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


最终效果:

图片


标签:LOC,stats,Python,热帖,headers,球员,NBA,com,nba
来源: https://blog.51cto.com/u_15127553/2705457

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有