python戏说NBA--NBA近二十年得分王各项数据之最

论坛 期权论坛 期权     
代码艺术客户端   2019-7-21 06:05   3716   0
python戏说NBA
python戏说NBA,是一个用python来戏说NBA大事的系列栏目,这里将结合python开发技术,融合现今发生的NBA大事,做一些有趣的实验,让我们一起看热闹的同时,也能学到一些技术。分析结果仅供娱乐,缺乏专业论点支撑~
注意!!!作者只是个看热闹的球迷,并非篮球专业人士,再强调一遍,论证结果不够严谨,重要的是,大家可以通过这些有趣的研究带动自己学习技术的兴趣!!!
先免责,再写,哈哈哈,省的被喷的怀疑人生。



[h1]直戳主题[/h1]本章没有什么球星之间的讨论、对比、互相伤害,你们可以先放下刀听我说下主题。很简单,今天突然想看看历届得分王,谁的出手最多,谁的得分最高之类的数据,然后就去扒拉数据。嗯,很快就找到了。突然想到,我已经三天没更新文章了,不能任自己这么装咸鱼。好吧,虽然没什么可争论的点,但还是写吧,不然今晚睡不着了,老想着没更新。所以,我马上来一个鲤鱼打挺,赶紧开动。

今天的主题是,看一下最近20年来的得分王,各项数据之最。
[h1]嘈点[/h1]写这篇文章的时候我已经想到几个开喷的点了,我先开:
  • 搞这么复杂,这点数据我不会用excel更快吗?
  • 你分析的这些数据有意义吗?这也写。
  • 不同时代的数据含量不同,这么对比没意义啊。很多朋友认为以前防守强度大,所以现在的数据要打骨折。
  • 你的代码写这样,还拿出来。这里其实可以这么写。
  • ...
更多的欢迎大家去挖掘,作为一个厚脸皮的人,我就是不怕,你~们~喷~
[h1]温馨提示[/h1]平时大家上班生活都不容易,刷微博啊刷新闻啥的都是为了放松一下,我理解大家。所以如果看到这里对我的主题还感兴趣的,比如你也想看看得分王中谁出手最多、谁罚球最多、谁三分最准等等,可以直接跳到分析结果去看。如果你对编程有兴趣,不嫌弃枯燥的,可以接着往下看,顺便提示一下,文末有源码下载连接。并且由于我再写这段代码的时候,其实心也是比较烦闷的,注释啥的也没有很多,代码也写得比较简单,没有优化。有心的读者可以自己下来自己改一下。
我这些文章的目的不是为了讨论NBA,也不是为了显摆代码。我只是希望通过实际生活中感兴趣的事情,融入一点开发技术,大家学起来就没这么苦闷。
[h1]确立提取方案[/h1]首先要做的第一步是收集历届得分王的数据,很巧,有网站帮我们做好统计了,但是它缺少导出excel表的功能,其实如果我们只是看数据,可以通过网站肉眼观察。但既然为了学点技术,我们就不嫌弃麻烦,把这些数据搞下来,自己排序输出。这样观察的方便些。
第一步:打开得分王数据的网站,网址是:http://stat-nba.com/award/item14.html
首先我们观察一下该网站,打开网址后,是这样的一个页面:



网站已经列出了历届得分王的数据,比如我们要看谁的篮板最高,我们可以看到篮板那一列,逐行进行比较得出。其它的数据项类似,但我嫌弃这样太累了,不如试着把数据搞下来,排序输出。
第二步:确立数据项。准备数据之前,我们应该知道我们要什么数据,就上图而言,我们待取的数据项分别是球员名字、出场次数、场均出场时间、投篮命中率、场均出手、三分命中率、三分出手、罚球命中率、场均罚球、场均篮板、场均助攻、场均抢断、场均得分。怎么确定你需要取哪项数据呢,如果你想看得分王中谁的篮板最高,那你就取篮板那一列数据,其它的类推。
第三步:确认数据范围。首先观察网站的整体结构,我们发现该页面有两个表格,第一个是NBA的数据,第二个是ABA的数据。因此,我们确认只需要第一个表格就行了,因为我们观察的是近二十年的得分王数据。
第四步:确认提取标签。首先要做的是,我们要确认提取哪项数据,这里以提取出场次数为例。将鼠标移动到出场该列的任一位球员的出场次数上(以13-14赛季凯文杜兰特为例),鼠标右击弹出菜单之后,选择检查后左击鼠标。会弹出如下页面。



上述页面弹出的html标签中,可以看到有很多个td标签,那怎么选择我们要的标签呢。从页面可以看到13-14赛季杜兰特的出场次数是81场,我们找到有81的td标签,这个标签就是我们要的。为了唯一提取这个标签,我们需要观察这个标签跟其他标签有什么不同。通过观察可以得出,出场次数这个标签有一个g的class,这是其它td没有的,因此可以通过这个class来唯一获取这个数据。其它数据项类似,大家自己练习。
至此,我们的数据提取方案就确立了。
[h1]准备数据[/h1]既然已经确立好了提取方案,那么就可以开始提取数据了。这里用到python的requests、bs4进行抓取数据,所以大家要先安装这两个库。
抓取步骤是这样的:访问网页-->获取网站返回内容-->转往网页为beatifulsoup对象-->根据前面的提取方案提取数据-->将数据存储到变量中去。
代码如下:
  1. tags = {"player_name_out": "球员名称", "g": "出场次数", "mp": "场均出场时间", "fgper": "投篮命中率", "fga": "场均出手",
复制代码
  1.         "threepper": "三分命中率", "threepa": "三分出手", "ftper": "罚球命中率", "fta": "场均罚球", "trb": "场均篮板",
复制代码
  1.         "ast": "场均助攻", "stl": "场均抢断 ", "pts": "场均得分"}
复制代码
  1. [/code][code]
复制代码
  1. def get_content():
复制代码
  1.     """爬取数据"""
复制代码
  1.     url = "http://stat-nba.com/award/item14.html"
复制代码
  1.     headers = {
复制代码
  1.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
复制代码
  1.     }  # 模仿一个标题头,这是爬虫最简单的策略
复制代码
  1.     r = requests.get(url=url, headers=headers)
复制代码
  1.     html = r.content
复制代码
  1.     bs_obj = BeautifulSoup(html, 'html.parser')
复制代码
  1.     base_table = bs_obj.find_all("table", class_="stat_box")[0]  # 获取得分王第一个表格
复制代码
  1.     temp_result = []
复制代码
  1.     for tag in tags.keys():
复制代码
  1.         temp_result.append(extract_data(tag, base_table))
复制代码
  1.     print(temp_result)
复制代码
  1. [/code][code]    return temp_result
复制代码
  1. [/code][code]
复制代码
  1. def extract_data(class_tag, table):
复制代码
  1.     """
复制代码
  1.     提取数据
复制代码
  1.     """
复制代码
  1.     all_td = table.find_all("td", class_=class_tag)  # 得分
复制代码
  1.     rows = []
复制代码
  1.     for td in all_td:
复制代码
  1.         try:
复制代码
  1.             ratio = td.text.strip()
复制代码
  1.             ratio = float(ratio[-1]) if ratio[-1] == "%" else float(
复制代码
  1.                 ratio)  # 过滤调%符号并转换为浮点型
复制代码
  1.         except Exception:
复制代码
  1.             continue;
复制代码
  1.         finally:
复制代码
  1.             rows.append(ratio)
复制代码
  1.     rows = rows[:20]  # 只需要近20年的数据
复制代码
  1.     rows = list(reversed(rows))
复制代码
  1.     return rows
复制代码
通过上面的代码,就把历届得分王的数据拔下来了,然后我们可以对数据进行排序了。
[h1]排序数据[/h1]这里要比较的数据项比较多,所以为了简便,就借助了pandas库的dataframe的排序函数进行排序,因为它在排序的时候,可以把索引也排序好,我就省了找球员名字的步骤。其实有更好的办法,比如直接自己写一个冒泡排序,但是,我懒。。。
排序代码比较简单,直接看:
  1. def get_max(core_data):
复制代码
  1.     """
复制代码
  1.     获取各项数据之最
复制代码
  1.     :return:
复制代码
  1.     """
复制代码
  1.     i = 1
复制代码
  1.     for k, v in tags.items():
复制代码
  1.         if k == "player_name_out":
复制代码
  1.             continue
复制代码
  1.         print(v)
复制代码
  1.         df = DataFrame(core_data[i], index=core_data[0])
复制代码
  1.         df.sort_values(by=0, inplace=True, ascending=False)
复制代码
  1.         print(df.index[0])
复制代码
  1.         print(df[0][0])
复制代码
  1.         print("\n")
复制代码
  1.         i += 1
复制代码
主要是用球员名字做索引,然后将待排序的数据做列。然后排序就可以得到该数据项的最大值了。最后输出索引就知道是谁的数据了。
[h1]分析结果[/h1]NBA历史上的得分王无疑都是顶级巨星,比如迈克尔乔丹、科比布莱恩特。我们对得分王的印象往往是得分很高效,能carry比赛,很少关注其它数据。恰巧今天我想看看这么多得分王中,各项数据之最,所以就顺带输出了这篇文章。
通过上面的代码,控制台已经将近20年来得分王中各项数据之最的结果排序好并输出了,如下,看热闹的看官,请看:
  1. 出场次数
复制代码
  1. 凯文-杜兰特
复制代码
  1. 82.0
复制代码
  1. [/code][code]场均出场时间
复制代码
  1. 阿伦-艾弗森
复制代码
  1. 43.7
复制代码
  1. [/code][code]投篮命中率
复制代码
  1. 沙奎尔-奥尼尔
复制代码
  1. 57.4%
复制代码
  1. [/code][code]场均出手
复制代码
  1. 阿伦-艾弗森
复制代码
  1. 27.8
复制代码
  1. [/code][code]三分命中率
复制代码
  1. 斯蒂芬-库里
复制代码
  1. 45.4%
复制代码
  1. [/code][code]三分出手
复制代码
  1. 詹姆斯-哈登
复制代码
  1. 13.2
复制代码
  1. [/code][code]罚球命中率
复制代码
  1. 斯蒂芬-库里
复制代码
  1. 90.8%
复制代码
  1. [/code][code]场均罚球
复制代码
  1. 詹姆斯-哈登
复制代码
  1. 11.0
复制代码
  1. [/code][code]场均篮板
复制代码
  1. 沙奎尔-奥尼尔
复制代码
  1. 13.6
复制代码
  1. [/code][code]场均助攻
复制代码
  1. 拉塞尔-威斯布鲁克
复制代码
  1. 10.4
复制代码
  1. [/code][code]场均抢断
复制代码
  1. 阿伦-艾弗森
复制代码
  1. 2.8
复制代码
  1. [/code][code]场均得分
复制代码
  1. 詹姆斯-哈登
复制代码
  1. 36.1
复制代码
综合分析:
  • 出场次数最多的是凯文杜兰特,居然是满的82场,这个真没想到,我以为会是詹姆斯。毕竟阿杜受过大伤。
  • 场均出场时间达到了43.7分钟,铁人艾佛森被操的够狠的。得分王也不能这么用吧,一场比赛歇4分钟,严重透支。
  • 投篮命中率最高的是奥尼尔。这个真没想到,不查数据还不知道奥尼尔拿过得分王。既然他是内线,命中率高很正常。
  • 场均出手最多的是艾佛森,看来艾佛森的确受身高限制,虽然利用时间差可以获得出手空间,但毕竟矮,只能用高出手换高分。
  • 三分命中率最高的是库里,这个可以预料。库日天那个赛季太爆炸了。
  • 三分出手最多的是哈登,这个嘛,嗯...没预料到,看了下是本赛季出手的,看来后撤步已经魔怔了。
  • 罚球命中率还是库里,这个也没有预料到,以为是很稳的哈登。
  • 场均罚球是哈登,哈哈这个没意义,造犯规好手,人间流传着非常多的称号,比如景德镇王子啥的哈哈
  • 场均篮板是奥尼尔。嗯史诗级的内线,没什么好讨论的。
  • 场均助攻是威少,威少这几年的三双确实牛逼。助攻也是好看的很。
  • 场均抢断是艾佛森,居然有2.8个我的天,不亏是艾佛森。
  • 场均得分是哈登,这个赛季的36.1分已经超过科比的35.4了,确实不可思议。
如果你喜欢我的文章,可以关注我的主页或者公众号:


或者直接搜索公众号代码艺术客户端。
另外,请顺手点个赞。可怜哟。
最后,下载链接:http://47.112.100.1/images/score.py

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:5
帖子:1
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP