python戏说NBA--NBA得分王各项数据之最

  • 日期:08-28
  • 点击:(807)


  python戏说NBA

  python戏说NBA,是一个用python来戏说NBA大事的系列栏目,这里将结合python开发技术,融合现今发生的NBA大事,做一些有趣的实验,让我们一起看热闹的同时,也能学到一些技术。分析结果仅供娱乐,缺乏专业论点支撑~

  注意!!!作者只是个看热闹的球迷,并非篮球专业人士,再强调一遍,论证结果不够严谨,重要的是,大家可以通过这些有趣的研究带动自己学习技术的兴趣!!!

  先免责,再写,哈哈哈,省的被喷的怀疑人生。

  python戏说NBA--NBA得分王各项数据之最

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

  python戏说NBA--NBA得分王各项数据之最

  鲤鱼打挺

  今天的主题是,看一下最近20年来的得分王,各项数据之最。

  写这篇文章的时候我已经想到几个开喷的点了,我先开:

  搞这么复杂,这点数据我不会用excel更快吗?你分析的这些数据有意义吗?这也写。不同时代的数据含量不同,这么对比没意义啊。很多朋友认为以前防守强度大,所以现在的数据要打骨折。你的代码写这样,还拿出来。这里其实可以这么写。...

  更多的欢迎大家去挖掘,作为一个厚脸皮的人,我就是不怕,你~们~喷~

  平时大家上班生活都不容易,刷微博啊刷新闻啥的都是为了放松一下,我理解大家。所以如果看到这里对我的主题还感兴趣的,比如你也想看看得分王中谁出手最多、谁罚球最多、谁三分最准等等,可以直接跳到分析结果去看。如果你对编程有兴趣,不嫌弃枯燥的,可以接着往下看,顺便提示一下,文末有源码下载连接。并且由于我再写这段代码的时候,其实心也是比较烦闷的,注释啥的也没有很多,代码也写得比较简单,没有优化。有心的读者可以自己下来自己改一下。

  我这些文章的目的不是为了讨论NBA,也不是为了显摆代码。我只是希望通过实际生活中感兴趣的事情,融入一点开发技术,大家学起来就没这么苦闷。

  首先要做的第一步是收集历届得分王的数据,很巧,有网站帮我们做好统计了,但是它缺少导出excel表的功能,其实如果我们只是看数据,可以通过网站肉眼观察。但既然为了学点技术,我们就不嫌弃麻烦,把这些数据搞下来,自己排序输出。这样观察的方便些。

  第一步:打开得分王数据的网站,网址是:

  首先我们观察一下该网站,打开网址后,是这样的一个页面:

  python戏说NBA--NBA得分王各项数据之最

  网站已经列出了历届得分王的数据,比如我们要看谁的篮板最高,我们可以看到篮板那一列,逐行进行比较得出。其它的数据项类似,但我嫌弃这样太累了,不如试着把数据搞下来,排序输出。

  第二步:确立数据项。准备数据之前,我们应该知道我们要什么数据,就上图而言,我们待取的数据项分别是球员名字、出场次数、场均出场时间、投篮命中率、场均出手、三分命中率、三分出手、罚球命中率、场均罚球、场均篮板、场均助攻、场均抢断、场均得分。怎么确定你需要取哪项数据呢,如果你想看得分王中谁的篮板最高,那你就取篮板那一列数据,其它的类推。

  第三步:确认数据范围。首先观察网站的整体结构,我们发现该页面有两个表格,第一个是NBA的数据,第二个是ABA的数据。因此,我们确认只需要第一个表格就行了,因为我们观察的是近二十年的得分王数据。

  第四步:确认提取标签。首先要做的是,我们要确认提取哪项数据,这里以提取出场次数为例。将鼠标移动到出场该列的任一位球员的出场次数上(以13-14赛季凯文杜兰特为例),鼠标右击弹出菜单之后,选择检查后左击鼠标。会弹出如下页面。

  python戏说NBA--NBA得分王各项数据之最

  上述页面弹出的html标签中,可以看到有很多个td标签,那怎么选择我们要的标签呢。从页面可以看到13-14赛季杜兰特的出场次数是81场,我们找到有81的td标签,这个标签就是我们要的。为了唯一提取这个标签,我们需要观察这个标签跟其他标签有什么不同。通过观察可以得出,出场次数这个标签有一个g的class,这是其它td没有的,因此可以通过这个class来唯一获取这个数据。其它数据项类似,大家自己练习。

  至此,我们的数据提取方案就确立了。

  既然已经确立好了提取方案,那么就可以开始提取数据了。这里用到python的requests、bs4进行抓取数据,所以大家要先安装这两个库。

  抓取步骤是这样的:访问网页-->获取网站返回内容-->转往网页位beatifulsoup对象-->根据前面的提取方案提取数据-->将数据存储到变量中去。

  代码如下:

  tags ={"player_name_out": "球员名称", "g": "出场次数", "mp": "场均出场时间", "fgper": "投篮命中率", "fga": "场均出手",

  "threepper": "三分命中率", "threepa": "三分出手", "ftper": "罚球命中率", "fta": "场均罚球", "trb": "场均篮板",

  "ast": "场均助攻", "stl": "场均抢断 ", "pts": "场均得分"}

  def get_content():

  """爬取数据"""

  url = ""

  headers ={

  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

  }# 模仿一个标题头,这是爬虫最简单的策略

  r = requests.get(url=url, headers=headers)

  html = r.content

  bs_obj = BeautifulSoup(html, 'html.parser')

  base_table = bs_obj.find_all("table", class_="stat_box")[0]# 获取得分王第一个表格

  temp_result =[]

  for tag in tags.keys():

  temp_result.append(extract_data(tag, base_table))

  print(temp_result)

  return temp_result

  def extract_data(class_tag, table):

  """

  提取数据

  """

  all_td = table.find_all("td", class_=class_tag) # 得分

  rows =[]

  for td in all_td:

  try:

  ratio = td.text.strip()

  ratio = float(ratio[-1]) if ratio[-1]== "%" else float(

  ratio) # 过滤调%符号并转换为浮点型

  except Exception:

  continue;

  finally:

  rows.append(ratio)

  rows = rows[:20]# 只需要近20年的数据

  rows = list(reversed(rows))

  return rows

  通过上面的代码,就把历届得分王的数据拔下来了,然后我们可以对数据进行排序了。

  这里要比较的数据项比较多,所以为了简便,就借助了pandas库的dataframe的排序函数进行排序,因为它在排序的时候,可以把索引也排序好,我就省了找球员名字的步骤。其实有更好的办法,比如直接自己写一个冒泡排序,但是,我懒。。。

  排序代码比较简单,直接看:

  def get_max(core_data):

  """

  获取各项数据之最

  :return:

  """

  i = 1

  for k, v in tags.items():

  if k == "player_name_out":

  continue

  print(v)

  df = DataFrame(core_data[i], index=core_data[0])

  df.sort_values(by=0, inplace=True, ascending=False)

  print(df.index[0])

  print(df[0][0])

  print("\\n")

  i += 1

  主要是用球员名字做索引,然后将待排序的数据做列。然后排序就可以得到该数据项的最大值了。最后输出索引就知道是谁的数据了。

  NBA历史上的得分王无疑都是顶级巨星,比如迈克尔乔丹、科比布莱恩特。我们对得分王的印象往往是得分很高效,能carry比赛,很少关注其它数据。恰巧今天我想看看这么多得分王中,各项数据之最,所以就顺带输出了这篇文章。

  通过上面的代码,控制台已经将近20年来得分王中各项数据之最的结果排序好并输出了,如下,看热闹的看官,请看:

  出场次数

  凯文-杜兰特

  82.0

  场均出场时间

  阿伦-艾弗森

  43.7

  投篮命中率

  沙奎尔-奥尼尔

  57.4%

  场均出手

  阿伦-艾弗森

  27.8

  三分命中率

  斯蒂芬-库里

  45.4%

  三分出手

  詹姆斯-哈登

  13.2

  罚球命中率

  斯蒂芬-库里

  90.8%

  场均罚球

  詹姆斯-哈登

  11.0

  场均篮板

  沙奎尔-奥尼尔

  13.6

  场均助攻

  拉塞尔-威斯布鲁克

  10.4

  场均抢断

  阿伦-艾弗森

  2.8

  场均得分

  詹姆斯-哈登

  36.1

  综合分析:

  出场次数最多的是凯文杜兰特,居然是满的82场,这个真没想到,我以为会是詹姆斯。毕竟阿杜受过大伤。场均出产时间达到了43.7分钟,铁人艾佛森被操的够狠的。得分王也不能这么用吧,一场比赛歇4分钟,严重透支。投篮命中率最高的是奥尼尔。这个真没想到,不查数据还不知道奥尼尔拿过得分王。既然他是内线,命中率高很正常。场均出手最多的是艾佛森,看来艾佛森的确受身高限制,虽然利用时间差可以获得出手空间,但毕竟矮,只能用高出手换高分。三分命中率最高的是库里,这个可以预料。库日天那个赛季太爆炸了。三分出手最多的是哈登,这个嘛,嗯...没预料到,看了下是本赛季出手的,看来后撤步已经魔怔了。罚球命中率还是库里,这个也没有预料到,以为是很稳的哈登。场均罚球是哈登,哈哈这个没意义,造犯规好手,人间流传着非常多的称号,比如景德镇王子啥的哈哈场均篮板是奥尼尔。嗯史诗级的内线,没什么好讨论的。场均助攻是威少,威少这几年的三双确实牛逼。助攻也是好看的很。场均抢断是艾佛森,居然有2.8个我的天,不亏是艾佛森。场均得分是哈登,这个赛季的36.1分已经超过科比的35.4了,确实不可思议。

  如果你喜欢我的文章,可以关注我的主页或者公众号:

  python戏说NBA--NBA得分王各项数据之最

  另外,请顺手点个赞(写这个就是为了赞)。可怜哟。

  最后,下载链接: