首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python实现NBA球员出手位置图表

很多篮球迷对NBA球员的投篮出手位置感兴趣,想要得到如下的这种图:

经搜索发现网上已有相关资源,基本都来源于How to Create NBA Shot Charts in Python(http://savvastjortjoglou.com/nba-shot-sharts.html),但是现在按照这些教程都不能重现。

本文将介绍怎样具体可操作的用python的matplotlib包实现绘制NBA球员投篮出手位置图。

要做到这件事主要是解决两个大问题:

NBA球员的投篮数据从哪里获得 (大多网上已有资源卡在了这里)

怎么样绘制到图表

我们将练习到如下知识:

怎么样通过网页分析获取数据API

获取网页数据的基础方式

绘制篮球半场图

第一部分--获取球员投篮位置数据

NBA官方并没有提供公共的API方便我们访问球员的shot log, Web Scraping 201: finding the API(http://www.gregreda.com/2015/02/15/web-scraping-finding-the-api/)这篇文章为我们提供了分析网页寻找数据API的方法,我们要分析NBA球员shot log可拆解成以下步骤:

锁定目标网站(哪个网站有NBA球员shot log数据)

具体网页对象(具体哪个网页有shot log数据)

分析shot log API

通过API获取感兴趣球员的shot log数据

1.锁定目标网站

2.具体网页对象

shot log所在的页面标签可能会有改变,有时不在很显眼的位置,这也是很多教程失效的原因(只给了最后API的网址,没有说这个网址是怎么来的),所以这个得花时间找一下。

按照图中1、2顺序点击后会得到以下页面

页面表格是每个NBA球员的数据,表头都是简写,通过图示点击 我们得到表头详细信息,其中 表示尝试投篮的位置,表格中每个球员的 列的数字都是可点击的,我们按上图所示点击 的 列数字,跳转的结果是显示了 2017-18常规赛的

好了,可以结束了...

等等,我们的目的不是简单得到 ,而是要 ,所以,继续

点击 的 数据,跳转后的页面除了以上3个图还包括以下这个表格

这个表格的内容结合 的图,可以确定,要找的 应该是这个页面了,但是表格中并没有直接给出投篮位置信息,这个网页访问的API应该包括这些信息,所以我们进入下面的步骤

3.分析shot log API

我们以Chrome浏览器为例,在上一步找到的 页面打开浏览器的开发者选项(更多工具->开发者工具),然后按F5键,刷新页面,你将得到如下页面

我们按上图红色数字标注,依次点击,选择 ,然后点击 进行过滤, 是XMLHttpRequest的简写 - 这是一种用来获取XML或JSON数据的请求类型。经 筛选后表格中的有几个条目,红色数字标注为3的既是我们将要查找的shot log API, 标签中包括:

resource - 请求的名称 shotchartdetail。

parameters - 请求参数,提交给API的请求参数,我们可以理解成SQL语言的条件语句,例如赛季、球员ID等等,我们改变URL中的参数就能得到不同的数据

resultSets - 请求得到的数据集,包含两个表格。仔细看表头(headers)第一个表格包含我们想要的shot log信息(LOCX,LOCY)。

与 并列的 标签包含:

Request URL - API URL

Requset Headers - 请的表头,用程序爬取网页请求数据时会用到

通过API获取感兴趣球员的shot log数据

4.通过API获取感兴趣球员的shot log数据

上一步得到了本赛季MVP热门人选 shot log的Request URL和Requset Headers,下面我们要做的是通过python代码获取shot log数据,以下是代码

我们得到的pandas DataFrame: ,表头及前3行数据展示如下:

shot_chart_url其中PlayerID、Season、SeasonType三项是可变参数,如果想获得其他球员的PlayerID可以登录nba.com/players搜索感兴趣球员的名字,如下

点击搜索结果,跳转到页面的网址最后一项既是PlayerID,例如: 中的 即是字母哥的PlayerID。

我们这一步得到的 包含了James Harden在2017-18赛季常规赛目前为止(20180219全明星赛)所有投篮尝试。我们需要的数据为 和 两列,这些是每次投篮尝试的坐标值,然后可以将这些坐标值绘制到代表篮球场的坐标轴上,当然我们可能还需要 列,来区分投篮是否投进。

第二部分--绘制球员shot log到球场图

关于这一部分,How to Create NBA Shot Charts in Python已经做了非常优秀的工作,我们会延续其框架,并对代码做修改以达到更好的适用性。

首先我们对上一步得到的James Harden的shot log 和 进行快速绘图,看其X、Y是怎么定义的。

通过快速预览图我们对 和 有了一个大概的认识,有一点需要注意: 其实是观众视野从中场面向篮筐来说的, 是正值则在篮筐的左边。所以最终绘图时需要按以下代码做调整,我们以shot log中Right Side(R) 投篮区域(投篮区域划分请参考前文 图)的出手作为示例说明。

画篮球半场图

通过对 和 数据的快速画图,我们大概知道了篮筐的位置大概就是 和 的原点。知道了这一点,我们结合篮球半场的具体尺寸 (下图)和比例就可以画出篮球半场图了。

通过上图我们知道了篮球场宽度是 ,转换成 是 ,篮球场长 ,转换成 是 ,再结合我们上一步画出的投篮点快速预览图,通过对很多球员的 为0时, 与 ,我们能够推测出 和 的单位与 的换算大概为10/12。

画图函数如下:

画图:

添加上投篮出手位置数据

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180223G0WL8V00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券