[Python数据分析]NBA的球星们喜欢在哪个位置出手

系统 1560 0

前言

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第1张图片

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第2张图片

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

--------------------

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

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第3张图片

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第4张图片

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

0. 效果展示

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

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第5张图片

西蒙斯  ,古典中锋

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第6张图片

德拉赞  ,中投小王子

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第7张图片

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第8张图片

库里  ,这个得放全场……

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第9张图片

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第10张图片

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

1. 获取数据

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

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

nba_py - http:// stats.nba.com API for python

https:// github.com/seemethere/n ba_py/

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

https:// stats.nba.com/stats/sho tchartdetail?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/20 2391/

链接中的两处  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']
# 转 DataFrame
shot_df = pd.DataFrame(shots, columns=headers)
PYthon学习企鹅裙:88198-2657  领取python自动化编程资料教程
            
          

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第11张图片

我们关心的数据就是  LOC_X  、  LOC_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)
PYthon学习企鹅裙:88198-2657  领取python自动化编程资料教程
            
          

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第12张图片

4. 绘制球场

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

[Python数据分析]NBA的球星们喜欢在哪个位置出手_第13张图片

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

5. 添加头像

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

https:// stats.nba.com/media/pla yers/230x185/202391.png

或者

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

最终效果:


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论