之前发过一篇用python展示NBA球员出手位置偏好的视频:

有些同学想要其中的代码和讲解。再加上当时用的NBA官方接口现在极不稳定,几乎无法使用,所以我这里就再发一篇图文,简单讲解下代码,以及新的替代接口。

项目代码地址:

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

NBA 2018-19 赛季已经落下帷幕,猛龙击败勇士,成为新科冠军球队。(注:这篇文章是2019年写的)

我想,不如来做个 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个替代方案:

1. 使用别人下载好的数据:https://github.com/toddwschneider/nba-shots-db

2. 一个付费API服务:https://probasketballapi.com/docs/shotcharts 可以免费试用一周,拿来做个练习足够(但部分球员部分赛季数据有缺失)

这里我来讲下第2个方法。从上面的地址点进去可以看到接口和说明。注册一下,拿到 API_KEY 就可以请求了。

接口地址:

https://probasketballapi.com/shotcharts

参数:

player_id - 球员ID

season - 赛季

比如获取林书豪 2013-14 赛季:

2. 解析数据

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

data = r.json()

shot_df = pd.DataFrame(data)

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

3. 绘制投篮点

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

made = shot_df[shot_df['shot_made']==1]

miss = shot_df[shot_df['shot_made']==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 里的 Circle、Rectangle、Arc 等方法拼出来的,没啥特别的技术,但代码比较繁琐,这边就不贴了。(只要你愿意,甚至可以用它画出小猪佩奇)

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 的值(不同系统,甚至不同编译器都可能存在差异)。

最终效果:

项目代码地址:

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

一起学,不孤单

圆老司 @ Crossin的编程教室

python分析出nba球员的位置_【圆老司】用python展示NBA球员出手位置偏好相关推荐

  1. python函数和方法的编写原则_跟老齐学Python之传说中的函数编写条规

    关于函数的事情,总是说不完的,下面就罗列一些编写函数的注意事项.特别声明,这些事项不是我总结的,我是从一本名字为<Learning Python>的书里面抄过来的,顺便写成了汉语,当然,是 ...

  2. python b站 排行_【圆老司】用python爬虫追踪知乎/B站大V排行

    之前我们一位同学在学习和实践 python 数据分析的时候把知乎.B站.虎扑上的各种信息都抓了个遍,比如粉丝数.关注关系.发布时间.阅读量.回复数.标题关键字.地域分布--然后又对这些数据进行了整理, ...

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

    原标题:虎扑热帖|Python数据分析|NBA的球星们喜欢在哪个位置出手 前言 1. 这篇数据分析案例,我做了个视频版本,对代码做了解读,讲了运行的注意事项和一些有的没的,供需.对于视频制作还不是很有 ...

  4. python分析出nba球员的位置_你知道NBA球星都喜欢在哪个位置出手? Python告诉你

    导读:NBA 2018-19 赛季已经落下帷幕,猛龙击败勇士,成为新科冠军球队.近日各队纷纷发布2019-20季前赛赛程,迎接新赛季. 我想,不如来做个 NBA 相关的数据分析案例好了.实际上,数据分 ...

  5. python分析出nba球员的位置_解码NBA:数据分析揭示十三个隐藏的球员位置

    自打1891年詹姆斯·奈史密斯(JAMES A. NAISMITH)发明篮球以来,篮球场上的球员就一直按照五个位置划分:中锋,大前锋.小前锋.组织后卫和得分后卫.但是斯坦福大学的一位数据狂人Muthu ...

  6. python分析出nba球员的位置_python--NBA数据分析初探(下)

    上回学习到利用jupyter notebook简单展示了一下单变量.双变量几多变量的数据可视化,本篇将在上篇的基础上,练习一下python数据处理及衍生变量的一些可视化实践. 在已有的数据集里想要生成 ...

  7. python分析出nba球员的位置_Python告诉你NBA球星都喜欢在哪个位置出手?

    作者 | Crossin先生 导读:NBA 2018-19 赛季已经落下帷幕,猛龙击败勇士,成为新科冠军球队.近日各队纷纷发布2019-20季前赛赛程,迎接新赛季. 我想,不如来做个 NBA 相关的数 ...

  8. python分析出nba球员的位置_python抓取NBA现役球员基本信息数据并进行分析

    数据来源:NBA中国官网 库: requests 用于解析页面文本数据 pandas   用于处理数据 时间: 2017/2/17 (因为为现役球员,故需注明时间节点) 开工: 得到了数据,这下就好办 ...

  9. python 去掉list元素的双引号_一天快速入门 Python

    Python 是由Guido Van Rossum在 90 年代早期设计,现在是最常用的编程语言之一.特别是人工智能的火热,再加之它的语法简洁且优美,实乃初学者入门AI必备的编程语言. Python基 ...

最新文章

  1. linux php7扩展查看,linux安装PHP7以及扩展
  2. kuka机器人if逻辑编程_KUKA机器人调试的程序语法是什么
  3. 深入理解分布式技术 - 分布式事务总结回顾
  4. 成都东软学院计算机科学与技术系,成都东软学院计算机科学与技术系毕业设计(论文)工作实施细则成都东软学院计算机科学与技术系毕业设计(论文)工作实施细则.doc...
  5. 多线程面试题系列(12):多线程同步内功心法——PV操作上
  6. python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发
  7. 我的世界中国版服务器无限夜视,我的世界服务器游戏技巧 无限夜视的方法
  8. 如何在linux当中,大量的添加用户
  9. 蓝桥杯 2016年C语言组大学B组 C/C++
  10. oreo另一个意思_other和another区别:两种不同的“另一个”
  11. 模拟计算机怎么做,如何为具有独立模拟输出的计算机或音频系统制作8通道放大器...
  12. 层次分析法(附代码)
  13. 大带宽、高灵敏度、扫描快速手持式监测接收机TFN DC700S
  14. 习题4-7 最大公约数和最小公倍数 (15分)
  15. python快速实现简单的图像人脸融合
  16. Redis基本数据类型和使用场景
  17. C/C++加减乘除运算效率分析
  18. 如何在游戏中快速集成聊天功能
  19. word2019安装mythtype后出现“不受信任的位置及禁用宏”问题解决办法
  20. mysql root密码过期了_MYSQL 密码过期解决办法

热门文章

  1. 网上传的京东撸货为什么那么火?
  2. (编程题)相邻数字相乘为偶数
  3. 机器学习中的F1-score
  4. 安卓远程控制软件哪个好用
  5. MSP430-流水灯和key
  6. python-docx库实战修改word文档格式
  7. DFS分布式文件存储系统
  8. 《大国大城》读书笔记
  9. Cadence OrCAD Capture 绘制总线的方法
  10. T t与T t = T()的区别