NBA是一个以NBA赛事调侃为主的系列专栏,这里我们会结合开发技术与当下NBA赛事做一些有趣的实验,让大家在看热闹的同时,也能学到一些技巧。分析结果仅供娱乐,缺乏专业的论据支撑~
注意!!!作者只是个球迷,不是篮球专业人士。我要强调的是,这些结果不够严谨。重要的是,你可以通过这些有趣的研究激发你学习技术的兴趣!!!
四个主要五分位数
很多80、90后的朋友,基本都是麦迪、科比、詹姆斯、艾弗森的粉丝。凯尔特人三巨头(加内特、皮尔斯、雷阿伦)组队之前,基本每支球队都只有一个强点,跟我们现在强调的忠于一人一城的理念很吻合。今年夏天随着乔治和伦纳德加盟快船所造成的一系列效应,现在大部分NBA球队都是双核球队,预计下个赛季会非常精彩。说到精彩程度,大家会跟上一个时代对比,因为那个时代基本一支球队就只有一个明星球员,所以这些明星球员很吃香。而我们那个时代脱颖而出的四位著名得分后卫,他们分别是:
玛蒂——手持银枪、骑着白马的帅气少年!
麦迪的小腿很有魅力,拉起的姿势也很美,35秒砍下13分逆转马刺。他还是两届得分王,两届最佳阵容,七届全明星,两届一阵,三届二阵,两届三阵,2001年获得NBA进步最快球员奖。巅峰时期的麦迪征服了无数球迷,可惜职业生涯末期却流离失所。
科比布莱恩特——最接近神的男人,乔丹之后最伟大的得分后卫!
科比,继乔丹之后的第二位球员,是一个篮球时代的象征,他拥有非常强的得分爆发力和最娴熟的进攻技巧,从突破、投篮、罚球、三分球无所不能,几乎没有进攻盲区,创造了单场81分、三节62分、单赛季场均35.4分等众多令人惊叹的奇迹。科比还拥有5个总冠军、1个MVP、2个FMVP、2个得分王、18次全明星、4次全明星MVP、历史得分榜第三、10次一阵、2次二阵、2次三阵、9次防守一阵、2次防守二阵。
卡特——半人半神,UFO,史上最强扣篮王!
卡特,他的扣篮是NBA的象征,至今无人超越他的扣篮天赋,在全明星扣篮大赛中也留下许多精彩场面——单臂吊篮、大风车……五次完美、震撼的满分扣篮表演,卡特凭一己之力拯救了全明星扣篮大赛!
艾弗森——96黄金一代的状元秀!
身高183cm的地球上最强壮的男人,他标志性的盘带过掉乔丹让人们记住了这个敢于挑战上帝的小个子。他还以一己之力带领76人队闯入总决赛。面对湖人王朝的OK组合,他毫不畏惧,给了湖人那场季后赛的唯一一场败仗。
可以说四大得分后卫都是很强的~!
詹姆斯·哈登,联盟顶级得分后卫
休斯顿火箭队当家球星詹姆斯·哈登是2018赛季MVP,也是目前除詹姆斯之外对阵勇士队的领军人物,拥有第一阵容、得分王、助攻王、单打王、MVP等多项个人荣誉,率队取得队史最佳战绩65胜,场均得分36分,超越科比得分纪录,多次入选全明星首发,率领美国国家队夺得奥运会冠军、世界冠军等多项骄人战绩。
不过他却因为季后赛表现不佳而饱受诟病,尽管他的数据非常出色。但由于连续输给勇士,人们开始对他提出质疑,说他缺乏野心,缺乏实力,不配最佳得分后卫的称号。因此,很多人说,他之所以能获得这么多荣誉,是因为现在没有好的得分后卫。换言之,没有英雄,年轻人成名。如果是四大得分后卫的时代,哈登肯定是一个普通的首发。
事实真的如此吗?由于哈登和四大得分后卫并非同一时期的巅峰,因此我们无法根据现实进行比较。但我们可以通过数据来验证哈登是否真的不如四大得分后卫。
温馨提示,如果你只对分析结果感兴趣,可以直接跳到结果分析。如果你也对分析过程感兴趣,想学习一些技巧,或者发现作者的一些瑕疵,那就继续阅读吧。对于初学者,请放心,我的代码简洁易懂,没有任何技巧,而且还有很多优化空间,大家可以自行完善。
源代码可在文章末尾下载。
准备数据源
要分析哈登和四大得分后卫的表现,首先需要数据支撑。我们的数据是从 stat-nba 这个中国 NBA 数据最全的网站获取的。当然我们不是通过人工获取,而是通过简单的爬虫技术获取。这里希望大家有前端基础和基础知识,不然会显得有些吃力。
科比的数据网址为:
的数据 URL 是:
的数据 URL 是:
艾弗森的数据网址为:
的数据 URL 为:
那么,分析他们的能力时,就需要一些指标来参考,笔者根据自己有限的篮球知识nba球队光标,选取了6个指标,分别是:场均得分、场均助攻、场均篮板、胜利贡献值(WS)、球员效率值(PER)、真实投篮命中率。
由于哈登和四位得分后卫到达巅峰的时间不同,我们并不按照具体的赛季来进行比较,因为把哈登的巅峰赛季和四位得分后卫职业生涯的结束时间进行比较是没有意义的,所以我们按照他们的职业生涯年份来进行比较。即新秀年大家都是新秀年,第二年大家都是第二年,这样就能证明他们之中谁才是真正的王者。
把握思路分析
爬取之前,准备好必要的库,请安装,bs4,,。
在爬取内容之前,我们首先要定位。定位什么呢?我们需要定位我们需要的数据的位置,或者更准确的说,包含所需数据的标签在哪里。
比如在投篮命中率中,我们可以发现页面上有多个这样的表格,下图是威斯布鲁克的数据图,但是结构是一样的,不影响我的分析:
我们需要的场均得分、篮板、助攻都在第一个表中,WS、PER 在倒数第二个表中,真实命中率在最后一个表中,所以首先我们需要定位到具体的表,代码如下:
= .("table", ="")[0] # 第一个表用于获取平均每场篮板、平均助攻、平均得分
= .("table", ="")[3] # 第四张表用于获取胜利贡献值和球员效率
= .("table", ="")[4] # 第五张表,获取真实命中率
接下来我们需要找到该数据项的标签,找标签的思路就是将鼠标移动到我们需要的数据项上,然后鼠标右键,点击Check,右边就会弹出该数据项对应的源代码。以场均得分为例:
首先打开四大得分后卫或者哈登的数据页面,将鼠标移动到第一个表格中的任意一项得分数据上,点击右键,然后找到需要查看的项目,光标过后点击左键,你会看到右侧弹出一个窗口如下图所示:
我们可以看到很多td的标签,但是我们想要的是场均得分指标,通过观察可以发现,只有场均得分指标有pts这个类,其他td都没有,因此,我们可以利用这个类来获取场均得分指标。
其他指标操作方法相同,大家可以自行尝试,这样我们的页面标签定位就完成了。
示例代码如下:
找到需要的表--》定位到表里获取需要的数据项--》解析数据--》将数据类型转换为浮点类型方便绘图--》保存结果并返回
定义(网址):
"""正在抓取数据"""
= {
'用户代理':'/5.0(NT 10.0;WOW64)/537.36(KHTML,如 Gecko)/55.0.2883.87 /537.36'
} # 模仿一个title标头,这是爬虫最简单的策略
r = .获取(url=url,=)
html = r.
=(html,'html。')
= .("table", ="")[0] # 第一个表用于获取平均每场篮板、平均助攻、平均得分
= .("table", ="")[3] # 第四张表用于获取胜利贡献值和球员效率
= .("table", ="")[4] # 第五张表,获取真实命中率
= []
.(("pts", )) # 分数
.(("ast", )) # 助攻
.(("trb", )) # 分数
.(("ws", )) # ws
.(("per", )) # 球员效率
.(("tsper", )) # 真实命中率
定义(,表):
“””
提取数据
“””
= 表。(“ td”,=)# 分数
行数 = []
对于 td 中:
尝试:
比率 = 浮点数 (td.text.strip()[:-1]) 如果 td.text.strip()[-1] == "%" 否则 浮点数 (
td.text.strip()) # 过滤%符号,并转换为浮点类型
行数(比例)
:
;
行 = 行[:-1]
行 = 列表((行))
打印(行)
行
到这一步我们的数据基本已经收集好了,有了准备好的数据,我们就可以开始画图了,这里我会画一个条形图来对比数据,不过在画条形图之前我先对数据做了一个综合得分对比,来对比一下那一年谁的表现更好,然后输出控制台得出结论,最后画出条形图来辅助论证。
综合评分
上面提到了,我们会以场均得分、篮板、助攻、WS、PER、真实投篮命中率作为指标。所以,通过前面的数据收集,我们已经有四大得分后卫和哈登职业生涯的数据了。为了方便我们对比,证明结论,我做了一个简单的评分。评分思路是:如果某位球星在某项指标上排名全明星第一,那么他得5分,第二名得4分。依次对所有指标进行排序比较,将所有得分相加,得到一个综合得分,综合得分越高,说明他的表现越好。
有一个输出可以帮助理解:
第一年数据比较
得分:阿伦>文斯>>科比>特雷西
助攻:阿伦>文斯>>特雷西>科比
篮板:文斯>特雷西>阿伦>科比
ws:文斯>>阿伦>特雷西>科比
每:文斯>阿伦>特雷西>科比>
真实投篮命中率:>科比>文斯>阿伦>特雷西
总体排名:文斯>阿伦>>特雷西>科比
上面的意思是科比第一年的得分是2分+1助攻+1篮板+1助攻+2投篮命中率+4真实命中率,按照综合得分排序,卡特第一年表现最好,综合得分代码如下:
定义(,):
“””
四大分位数排序及哈登各项数据指标
::
“””
= {}
ser = (, index=['kobe', 'tracy', 'allen', 'vince', ''])
对于范围内的 i (len()):
ser.(by=i, =True, =False)
print("{5}:{0}>{1}>{2}>{3}>{4}".(ser.index[0], ser.index[1], ser.index[2], ser.index[3], ser.index[4],
[我]))
score = 5 # 每条数据第一名得5分,分数依次递减,最后计算出每个人的总分,分数最高的即为该年度最佳。
对于 ser.index 中的索引:
如果索引在:
[指数] += 分数
别的:
[指数] = 分数
分数 -= 1
= (.items(),键 = item:item[1],=True)
print("综合排序:{0}>{1}>{2}>{3}>{4}".([0][0], [1][0], [2][0],
[3][0], [4][0]))
绘制条形图
由于我们需要绘制5个人的数据对比,所以绘制条形图的过程会比较复杂。首先需要整理数据,也就是把对应年份的各位明星的数据拿出来,形成一个列表。然后设置一下字体,避免出现汉字乱码。然后绘制条形图。注意控制条形图之间的缝隙,防止重叠。最后绘制轴标签和数值变量标题。我知道我说的太笼统了,但我不知道该怎么描述比较好,毕竟还是实际看看绘制的效果比较好,我直接贴代码给大家看吧,代码如下:
定义(,,年份):
“””
绘制条形图
::
“””
,,,,,,=
.['font.sans-serif'] = [''] # 设置中文字体和减号正常显示
.['轴'] = False
“””
绘制条形图
“””
质子泵(=(15,5))
x = 范围(len())
= plt.bar(x, =, width=0.15, alpha=0.8, color='red', label="kobe")
= plt.bar([i + 0.15 for i in x], =, width=0.15, alpha=0.8, color='green',
标签="tracy")
= plt.bar([i + 0.3 for i in x], =, width=0.15, alpha=0.8, color='grey',
标签="allen")
= plt.bar([i + 0.45 for i in x], =, width=0.15, alpha=0.8, color='black',
标签="vince")
= plt.bar([i + 0.6 for i in x], =, width=0.15, alpha=0.8, color='brown',
标签="")
plt.ylim(0, 70) # y轴取值范围
plt.(“值”)
“””
设置x轴刻度显示值
“””
plt.([index + 0.35 for index in range(len())], )
plt.(“数据项”)
plt.title("第 {0} 年的数据比较".(str(year + 1)))
plt.() # 设置标题
# 编辑文本
对于 [,,,,,] 中的项目:
对于项目中的矩形:
= 矩形.()
plt.文本(rect.get_x()+rect.()/ 2,+ 1,str(),ha="",va="")
plt.显示()
到此,我们就完成了所有的步骤,从分析数据,爬取数据,清洗数据,准备数据,整理数据,到绘图。如果你看不懂,没关系,文章最后有源码下载,可以慢慢研究。接下来我们来看结论,证明谁才是真正的王者。
结果分析
对于那些想要直接看结果的人,我在这里再说一遍,我们在分析他们的能力时,需要指标来参考。作者根据自己有限的篮球知识,选取了6个指标,分别是:场均得分、场均助攻、场均篮板、胜利贡献值(WS)、球员效率值(PER)、真实投篮命中率。为了方便我们进行比较,证明结论,我做了一个简单的评分。评分思路是:如果某位球星的某项指标在所有球星中排名第一,那么他就得5分,排名第二得4分。将所有指标依次排序比较,将所有得分相加,得到一个综合得分,综合得分越高,说明他的表现越好。由于哈登目前只有10年的数据,所以我们只比较前十年的数据。
有一个输出可以帮助理解:
第一年数据对比
得分:阿伦>文斯>>科比>特雷西
助攻:阿伦>文斯>>特雷西>科比
篮板:文斯>特雷西>阿伦>科比
ws:文斯>>阿伦>特雷西>科比
每:文斯>阿伦>特雷西>科比>
真实投篮命中率:>科比>文斯>阿伦>特雷西
总体排名:文斯>阿伦>>特雷西>科比
上面的意思是说科比第一年的得分是2分+1助攻+1篮板+1助攻+2分+4真实投篮命中率,按照综合得分排名的话,卡特第一年表现最好。
第一年:
直方图比较:
文本输出:
结论:新秀第一年综合评分,卡特第一,艾弗森第二,哈登第三,麦迪第四,科比第五,卡特最好,科比最差。
第二年:
直方图比较:
文本输出:
结论:二年级综合评分,卡特第一,艾弗森第二,科比第三,哈登第四,麦迪第五,卡特最好,麦迪最差。
第三年:
直方图比较:
文本输出:
结论:三年级综合评分,卡特第一,艾弗森第二,哈登第三,科比第四,麦迪第五,卡特最好,麦迪最差。
第四年:
直方图比较:
文本输出:
结论:四年级综合评分,哈登第一,麦迪第二,科比第三,艾弗森第四,卡特第五,最好是哈登,最差是卡特。
第五年:
直方图比较:
文本输出:
结论:第五年的综合评分,麦迪第一,哈登第二,科比第三,艾弗森第四,卡特第五,最好的是麦迪,最差的是卡特。
第六年:
直方图比较:
文本输出:
结论:六年级综合评分,麦迪第一,哈登第二,科比第三,艾弗森第四,卡特第五,最好是麦迪,最差是卡特。
第七年:
直方图比较:
文本输出:
结论:第七年的综合评分,科比第一,哈登第二,麦迪第三,艾弗森第四,卡特第五,最好的是科比,最差的是卡特。
8年级:
直方图比较:
文本输出:
结论:八年级综合评分,哈登第一,卡特第二nba球队光标,麦迪第三,科比第四,艾弗森第五,最好的是哈登,最差的是艾弗森。
第九年:
直方图比较:
文本输出:
结论:第九年的综合评分,哈登第一,科比第二,艾弗森第三,卡特第四,麦迪第五,最好的是哈登,最差的是麦迪。
10年级:
直方图比较:
文本输出:
结论:第十年的综合评分,哈登第一,科比第二,艾弗森第三,麦迪第四,卡特第五,最好的是哈登,最差的是卡特。
综合评价
请注意,下面的时间是5个人对应年份之间的比较,所以是强者之间的对话。即使是表现最差的,在联盟中也依然很出色。
十年综合评价:
科比最好的时候:1,最差的时候:1。
麦迪的最佳数据:2,最差数据:3。
卡特的最佳数字:3,最差数字:5。
艾弗森的最佳数据:0,最差数据:1。
哈登最好数据:4,最差数据:0。
这个数据正确吗?
首先说说科比,科比职业生涯只拿过一次MVP,除了夺冠那几年,基本都在季后赛边缘甚至没进季后赛,所以对他来说,前十年最好的也只有一次,最差的也只有一次,这也符合常理。
第二位就是麦迪了,麦迪在魔术的生涯很精彩,但在火箭的最后时期,表现实在是一般,恰巧麦迪两度拿下得分王,而火箭最后时期经常受伤,最惨的次数是3次,这也正常。
接下来是卡特。卡特表现最好的是在多伦多猛龙队的新秀前几个赛季,他在那里获得了年度最佳新秀奖,并随布鲁克林篮网队打进了东部决赛。不过他在前十年也多次未能进入季后赛。所以他的最佳表现3和最差表现5基本符合上面的情况。
嗯,艾弗森还算比较平均,其实我也不太清楚这个数据是否符合他过去十年的表现,因为我了解的太少了。
然后就是哈登,新秀赛季在雷霆就入选了最佳新秀阵容,还拿过最佳第六人奖,然后效力火箭期间几次获得MVP亚军,一次拿下MVP,最佳时刻最多也很正常。
注意nba球队光标,以上数据均为常规赛平均值,不包括季后赛。
最终的结果是,就常规赛而言,这位现任第一得分后卫不逊色于前四名得分后卫,最佳表现次数位列第一,生涯从未缺席季后赛,火箭生涯多次位列MVP第二,并拿下MVP,表现是最好的,他现在缺的就是一个总冠军。
当然,哈登想要在季后赛追上科比的表现还有很长的路要走,毕竟科比是上帝之后最好的得分后卫。
有人说哈登并不是靠着自身实力成名的,就常规赛而言,四大得分后卫的表现都没有比他好。
如果对我的文章感兴趣的话可以关注我的主页或者公众号,点个赞,可惜写了这么多字,呵呵。