石晓玲,杨立功
(泰州职业技术学院,江苏 泰州 225300)
在日常工作中,对学生成绩进行分析和可视化处理最常用的软件是Excel。利用Excel 里的数据透视功能,可以对学生成绩进行简单的统计操作,如计算平均分、计算方差、进行横向或纵向比较,并最终生成可视化图表。但是在处理大量数据时,Excel 的操作十分繁琐,人为操作的标准化程度较低且易发生错误。而利用Python 可以自动实现数据的统计分析,能大大提高工作效率。本文将利用Python 及第三方库Requests、BeautifulSoup、NumPy 和Matplotlib 将全校学生期末各科成绩的原始数据进行处理,并进行可视化分析。
数据处理流程如图1 所示。首先从教务系统中爬取每个学生的各科成绩,计算出个人总成绩;然后通过个人成绩计算班级成绩;最后对班级成绩进行分析和可视化。
图1 数据处理流程
第三方库Requests 是利用Python 语言编写的网络爬虫工具,是一个能够自动爬取网站内容的开源爬虫应用框架。只需要给出网址和爬取规则,就可以快速获得网站上的大量信息。BeautifulSoup库是Python 语言开源的网络信息处理第三方库,能够获取某个特定标签下的字段信息,有助于快速从大量信息中筛选有效部分。在获取并处理信息之后,将学生的成绩写入csv 文件。爬取教务网站上学生成绩信息的特征代码如下:
爬取网站上所有的信息:
import requests
url=’http://example.io’
r=request.get(url)
对爬取的信息进行字段处理:
from bs4 importBeautifulSoup
soup=BeautifulSoup(r,url)
score=[]
for inf in soup.find_all(‘score’):
if len(inf)>1:
socre.append(inf)
数据清理是指检查和清理数据库中的无效或者冗杂数据,并进行修正、替换或者直接删除。
2.2.1 发现冗杂数据
在上一步的爬取过程中,我们获取了所有score 标签下的数据,这必然造成多余的数据被写入文件,在下一步的数据处理中会导致算力和内存空间的浪费。而随着数据量的增长,这种浪费会大大影响程序运行的效率,甚至导致分析结果的错误。对于这些冗杂数据可以进行清洗处理。
2.2.2 处理数据结构
数据结构包括数据本身以及数据之间的关系。为了方便下面的处理,需要选取一种索引方便、易于遍历的数据格式,且不同学生的成绩之间应该分区储存。这对数据格式要求较高。
2.2.3 存储有效数据
通常的数据存储格式有txt 和csv,这里采用csv 格式。csv 文件是一种国际通用的二维数据存储格式,Excel 也可以便捷地导入或导出。更重要的是NumPy 内置了读取csv 文件的方法,可以简便地根据文件自动生成一个ndarrry 数组对象并将每一行的数据储存在不同维度上,以便下面的操作。
Python 语言提供了多种用来处理数据的第三方库,如NumPy、Scipy、Django、Pandas 等,且这些库与计算机底层的操作逻辑有很好的交互,因此运行效率相对较高。其中,使用率较高的是NumPy和Pandas 库,本文使用NumPy。
NumPy 是Python 开源的数据处理第三方库,提供了多种数据处理的方法,包括矩阵和向量的处理、傅立叶变换和多种可用于精密运算的库。其核心功能是对自定义数组ndarry 的处理。Excel 中也提供相关的数组运算功能,但NumPy 相对于Excel 的数组运算有两点优势:第一,ndarry 数组提供了更高的数据储存维度;第二,NumPy 对数组的处理是将其作为一个整体,无需关心其中每一个元素的处理过程。因此使用NumPy 处理数据可以得到更快的处理速度和更高的处理效率。
使用NumPy 读取数据后可以自动生成一个数组对象,后面的处理都基于此数组进行。数据读取代码如下:
import numpy as np
a=np. loadtxt(score.csv,dtype=np. float,delimiter=’,’)
3.2.1 计算每个学生的平均学分绩并输出
这里利用NumPy 提供的average 函数进行加权平均,完毕后将得到一个秩为1 的ndarry 数组,将其储存在csv 文件中,作为各个学生的期末成绩。代码如下:
s=np. average(a,axis=1,weights=weight)
#weight 为各科成绩的权重
3.2.2 根据学生成绩计算各班的平均分、方差、最高分和不及格学生人数
首先将各班学生的分数存储在不同的轴上,进行分析。代码如下:
b=s. reshape(x,y)
f=np. mean(b,axis=1)
v=np. var(b,axis=1)
m=np. max(b,axis=1)
c=np. sum(b<60,axis=1)
g=np. unravel_index(np.agrmax(b),b.shape)
#获取最高分的班级学号
这样就获得了各班考试成绩的数据,将其再次储存在csv 文件中,继续进行处理,也可以导入Excel 工作簿。
Matplotlib 库是Python 语言中优秀的第三方库,其提供了许多绘制可视化图形的子库,使用其中的pyplot 库对以上分析结果进行可视化处理。在数据分析中较为常用的两种图表是饼图和频数分布直方图,下面以这两种图表为例,利用matplotlib 绘制各班不及格学生占比的饼图和全校所有学生成绩的频数分布直方图,如图2 所示。代码如下:
importmatplotlib.pyplot as plt
c=c.tolist()
labels=’class one’,’classtwo’,’classthree’,’class four’
sizes=c
plt.subplot(211)
plt.pie(sizes,labels=labels,autopct=’%1.1f%%’,shadow=False,startangle=90)
plt.title(‘Failed Students’)
plt.show() #绘制饼图
plt.subplot(212)
plt.xlabel(‘score’)
plt.ylabel(‘number‘)
plt.hist(s,40,normed=0,histtype=’stepfilled’,
facecolor=’b’,alpha=0.75)
plt.show()
运行结果见图2。
图2 利用matplotlib 绘制的学生成绩频数分布直方图和各班不及格学生占比饼图
样本为4 个班的1200 个成绩数据。运行之后可以直观地发现全校学生的成绩分布大致符合正态分布的规律,且每个分数段的学生人数都较为直观。在实际操作中,可以通过修改部分参数绘制出某班学生的成绩分布等多种图形。由此可见,利用Python 进行可视化,有着高度自动化、可重复利用、运算速度快、导出图片方便等优点,在批量处理大规模复杂数据时优势明显。当原数据发生改变时能够实现信息的自动更新,方便使用者直观感受和理解数据的变化。
随着信息技术的发展,目前几乎所有学校都实现了教务系统的信息自动化,但对成绩数据的处理方式较为落后。本文利用Python 的网络爬取功能和数据处理功能,提出了自动获取数据—处理数据—输出结果的一体化结构框架,使批量处理学生成绩数据成为可能,其应用减轻了教学管理人员在处理学生成绩时的工作量。在大数据蓬勃发展的时代背景下,探究Python 的数据处理功能在各个领域的应用,意义十分明显,也能让Python 语言在各行各业焕发光彩。