此文主要介绍如何用pyhton抓取网页中的表格,以中超联赛各球队统计为例,并通过雷达图对前三名的球队进行比较。
雷达图(radar chart),又称蜘蛛图、星图、极坐标图等,是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。2017年,全球首次用雷达图球员数据进行比较。
python编程语言的pandas可扩展程序库中的read_html可从网页中抓取表格。但python的可视化可扩展程序库matplotlib和seaborn没有均没有现成的雷达图函数,需要我们自己来制作一下,不过也并不复杂。
下面开始一步步实现我们的任务,下载数据、数据预处理和制作雷达图。
第一步 下载数据
#************************ 导入所需的python库 **********************#
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#******************************************************************#
# 用pandas库的read_html读取网页中的表格,非常方便 #
# 读取后的结果为包含一个或几个dataframe的列表(list) #
# 此处以网易体育的中超各球队统计为例,该网页中仅含有一个表格 #
#******************************************************************#
注意 该网页中#北京国安#的统计信息有误。
2019中超联赛球队统计
df_list = pd.read_html(r"http://cs.sports.163.com/stat/team/")
#****************** 查看一下这个列表中有几个表格 ******************#
len(df_list)
#************ 读取该表格并获得各统计信息(列名或表头)************#
df = df_list[0] #读取表格
colnames = df.columns.values #获得表头信息如球队,比赛场次等
print(colnames)
df
# 该部分将输出从网页抓取的表格
第二步 数据预处理
#**** 调整各列顺序,将与进攻相关的参数放在前面,防守相关的放在后面 ****#
newcol = ['球队','比赛', '进球数', '射正', '助攻数', '角球',
'任意球', '犯规', '越位', '黄牌', '红牌']
df = df[newcol]
colname_chart = list(newcol[1:])
print(colname_chart)
df.head(3) #查看一下修改顺序后的表格(仅显示前三行)
# 该部分将输出
调整各统计信息位置
#******************************************************************#
#因各参数范围差别较大,先将各个参数缩放(scaling)至0-1的范围#
#******************************************************************#
data = df.iloc[:,1:] #第一列为球队名称,无需处理
data = round(data/data.max(),3) #将各列数据分别除以该列的最大值
#*** 重新将球队名称与其他数据结合,并查看数据缩放后的新表格 ***#
df = pd.concat([df["球队"],data], axis=1)
df
#该部分将输出
数据缩放之后
#***** 获得参数个数以方便后续雷达图的制作,不需要球队名称信息列 *****#
# 只统计各球队的比赛,进球数,射正,助攻数,犯规,越位,角球,任意球#
# 黄牌和红牌信息等十个参数 #
#*************************************************************************#
paras=list(df)[1:]
N = len(paras)
print(N) #共十个指标
#************ 将圆周2π划分为N等份作为雷达图各轴的角度 *************#
angles = [n / float(N) * 2 * np.pi for n in range(N)]
angles += angles[:1]
print(angles)
#该部分输出
[0.0, 0.6283185307179586, 1.2566370614359172, 1.8849555921538759, 2.5132741228718345, 3.141592653589793, 3.7699111843077517, 4.39822971502571, 5.026548245743669, 5.654866776461628, 0.0]
第三步 制作雷达图
#***** 此行代码是为了能够在图中显示中文,否则中文将显示为方框 *****#
plt.rcParams['font.sans-serif']=['SimHei']
#************************* 下面开始做雷达图 *************************#
plt.figure(figsize=(10,8))
ax = plt.subplot(111, polar=True)
#**************** 为每一个参数添加坐标轴和相应标签 ***************#
plt.xticks(angles[:-1], colname_chart, color='orangered', size=15)
#*********************** 添加y坐标轴和刻度 ***********************#
ax.set_rlabel_position(0)
plt.yticks([0.2,0.4,0.6,0.8], ["0.2","0.4","0.6","0.8"], color="grey", size=15)
plt.ylim(0,1) #设置y坐标轴范围为0-1
#**下面我们将各个球队的信息添加至雷达图,此文只添加前三名球队****#
#***********因球队太多时,会显得比较乱,反而效果比较差************#
#***************** 首先添加第一名广州恒大的信息 ********************#
values=df.loc[0].drop('球队').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',
color="red", label="广州恒大")
# ax.fill(angles, values, 'b', alpha=0.1) #填充雷达图,此文中未填充
#**************** 其次添加第二名广州富力的信息 *****************#
values=df.loc[1].drop('球队').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',
color="blue", label="广州富力")
#**************** 其次添加第三名上海上港的信息 *****************#
values=df.loc[2].drop('球队').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',
color="green", label="上海上港")
#***************** 添加图例并设置其位置和大小 *****************#
plt.legend(loc='center left',bbox_to_anchor=(1.1, 0.5),
prop={'size': 15})
#************************* 保存雷达图 *************************#
plt.savefig(r"C:\Users\Feng\Desktop\中超.png", dpi=300,
bbox_inches='tight')
广州恒大、广州富力与上海上港各统计数据对比
通过雷达图我们可以清晰看出 广州恒大进球数比较多,犯规较少,黄牌也较少,但越位次数最多;广州富力各个参数比较均衡;上海上港任意球数比较多,犯规也较多,但越位次数比较少。
大家如果有兴趣也可以从网页抓取一些其他表格,如政府报告或者购物网站中的数据,然后比较分析,说不定也能挖掘出有意思的信息呢。
如果您喜欢这篇文章,希望您能花一秒时间留下您的小手印 Thanks♪(・ω・)ノ