nba为什么禁用api(Python告诉你NBA球星都喜欢在哪个位置出手?)
更新时间:2022-08-02 20:53:27作者:Crossin先生
导读:NBA 2018-19 赛季已经落下帷幕,猛龙击败勇士,成为新科冠军球队。近日各队纷纷发布2019-20季前赛赛程,迎接新赛季。
我想,不如来做个 NBA 相关的数据分析案例好了。实际上,数据分析团队对于现在的 NBA 球队已经算是标配了,无论是在球员选择还是战术制定上都起着重要的作用。当下整个联盟越来越盛行的“魔球化”打法,其实也正是基于数据分析的产物。
于是,我们就借助官方数据和 Python 的绘图函数,来看一看不同的球员都是在什么位置出手投篮的。
01 视频版本
这篇数据分析案例,我做了个视频版本,对代码做了解读,讲了运行的注意事项和一些有的没的,供需。对于视频制作还不是很有经验,多包涵。(视频里有彩蛋)
本文在案例的代码写完后,我把它发在了虎扑上。结果,被推荐上了首页,25万多次浏览,近800回复……感谢各位JRs赏脸!
原图、更多球员生成的结果及完整代码,见以下网址:
NBA出手点统计代码:
gitee/crossin/snippet/tree/master/nba-fpa
几十位球星生成图:
提取码: jbpw
02 效果展示
照例先看结果,每个点是一次投篮,蓝色点是投中,红色点是未中。挑几个有特点的:
1. 哈登
魔球得很明显了,长两分这种低效率的事绝对不干
2. 西蒙斯
古典中锋
3. 德拉赞
中投小王子
4. 字母哥
篮下都给你扣糊了!
5. 库里
这个得放全场……
6. 科比
生涯累计图,全方位无死角,包括篮板后负角度
下面来看具体步骤,我们以刚刚获得本赛季冠军戒指的林书豪作为例子。
03 获取数据
NBA 有一个官方统计网站:stats.nba,上面有各种数据,可以说是一个宝藏了。
从网页上,我没有找到这次所需的数据。但通过一番搜索,我找到了网站的开放接口 API。相关的接口和文档你可以从这个项目里查看:
nba_py - stats.nba API for python
github/seemethere/nba_py/
通过以下接口,我们可以获取某个球员在指定赛季的投篮详细数据:
stats.nba/stats/shotchartdetail?CFID=33CFPARAMS=2018-19ContextFilter=ContextMeasure=FGADateFrom=DateTo=GameID=GameSegment=LastNGames=0LeagueID=00Location=MeasureType=BaseMonth=0OpponentTeamID=0Outcome=PaceAdjust=NPerMode=PerGamePeriod=0PlayerID=201935PlusMinus=NPosition=Rank=NRookieYear=Season=2018-19SeasonSegment=SeasonType=Regular SeasonTeamID=0VsConference=VsDivision=mode=AdvancedshowDetails=0showShots=1showZones=0PlayerPosition=
其中参数 PlayerID是查询球员的 ID,这个 ID 可以通过在网页上搜索球员姓名,从对应的 URL 中获取。比如林书豪就是 202391。
stats.nba/player/202391/
链接中的两处 2018-19是赛季参数,你可以改成其他赛季,不过我试过不能太早,大约 96 年往前就没数据了,而且早期数据精度要差些。
其他参数可以不用管。
用 requests库可轻松获取结果(需加上 headers):
response = requests.get(url, headers=headers,timeout=5)
04 解析数据
返回的数据是 JSON格式,用 pandas 转成 DataFrame 格式,方便后续处理:
data = response.json()# 获取列名即每项投球数据的意思headers = data# 获取投球的相关数据shots = data# 转 DataFrameshot_df = pd.DataFrame(shots, columns=headers)
我们关心的数据就是 LOC_X、LOC_Y(出手位置)和 SHOT_MADE_FLAG(是否投中)这三列。
05 绘制投篮点
使用 matplotlib库的散点图绘制 scatter 方法就可以把投篮点画出来,这个我们之前的各种案例里也用过不少次了:
made = shot_df==1]miss = shot_df==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 添加头像
最后,再给数据图加上一个头像,让它看起来更完整。头像地址:
stats.nba/media/players/230x185/202391.png或者
ak-static.cms.nba/wp-content/uploads/headshots/nba/latest/260x190/202391.png
文件名依然是球员的 ID,但这个地址并不是对所有球员有效,可做下异常处理。
pic =
urllib.request.urlretrieve("
stats.nba/media/players/230x185/202391.png")# imread 读取的图像可以被 matplotlib 绘制head_pic = plt.imread(pic)# 将球员图片放置于右上角,并设置缩小等级以配合整个图片img = OffsetImage(head_pic, zoom=0.6)# (x, y) 控制将球员放在你想要放的位置img.set_offset((540,640))# 添加球员图片fig.gca().add_artist(img)
如果在你的电脑上位置不对,记得修改下 offset的值(不同系统,甚至不同编译器都可能存在差异)。
最终效果:
相关推荐
- 最新资讯
-
- 2023-05-15 test
- 2022-11-15 2夺欧洲杯4获世界杯(俱乐部的成就引领国家队的辉煌——世界杯巡礼之西班牙篇)
- 2022-11-15 谁能介绍韩国国国家足球队(韩国足球,在欧洲是什么水平?)
- 2022-11-15 篮球世界杯中国最多几强(支持杜峰下课,但是中国男篮从世界第八沦为亚洲第八这个锅不该背)
- 2022-11-15 奥运会分为田径和什么(数说奥运:少年强则国强)
- 2022-11-15 中国男足VS沙特男足动漫图片(这部足球动画让日本队踢进了世界杯)
- 2022-11-15 世界杯进球最多的赛事(历届世界杯决赛里面11大进球最多的比赛)
- 2022-11-15 nba2k20手游在哪个平台(《NBA 2K20》试玩版报告:更加平衡的篮球体验)
- 2022-11-15 萨拉赫升至第三位(萨拉赫离封王就差一个冠军了,创下4大里程碑纪录 梅罗之后第三人)
- 2022-11-15 世界杯阿根廷队服(世界杯开赛前9天,阿根廷做出重要决定!恭喜梅西,封神希望大增)
- 推荐攻略
-
-
乌克兰总统身亡(乌总统泽连斯基解除乌总检察长及国家安全局局长职务)
-
足球比赛每个半场多少分钟(足球比赛每半场几分钟)
-
2021中超今天哪里转播(今晚!中超2场对决,CCTV5 直播申花PK武汉,腾讯体育亚泰vs天津)
-
2022梅西坠机身亡事件结果(足坛变天!巴萨无缘榜首的2年:梅西告别,老马去世,2-8惨案)
-
2021全运会篮球直播赛程辽宁(4月22日央视直播:CBA总决赛;赵心童vs马奎尔,塞尔比vs颜丙涛)
-
中国最强导弹(世界洲际导弹前10排名,中国东风导弹领先美国,第一名堪称导弹王)
-
2021篮球比赛在哪里看(CCTV5直播NBA 辽篮争夺CBA总决赛冠军点 颜丙涛出战斯诺克世锦赛)
-
东航结果不敢公布了(民航局再次回应东航MU5735事故调查!查明原因有多难,多久公布?)
-