excel高级工具箱_用python分析保存在excel学生成绩通俗讲解之一

Python处理数据是很方便的,用来分析学生成绩,生成成绩报告还是方便的。其实只要认真找一本Python科学计算的书籍,认真学一遍就知道怎么办了,但是系统学习成本太高,所以尽管网上免费的资源汗牛充栋,我还是要重复造轮子,也记录自己学习的过程。

成绩分析Python库的选择xlrd&xlwtopenpyxlopenpyxl的安装pandas处理excel文件的打开和关闭文件的修改单元格值的读取和修改小结练习

对于数据科学家或者专业的程序员来说,处理excel这种事其实非常小儿科,但是成绩分析不在他们的业务范围内,所以面向教务员、信息技术老师的python成绩分析的教程相对比较少;学校里相当一部分办公室人员、行政人员、教务员都是信息技术教师担任的,很多数理老师学习编程能力也很强或者本身有编程基础,而数理老师担任班主任的挺多,也有成绩分析的需求,从这部分老师的使用场景出发,来分析python处理成绩应该怎么做,甚至扩展到办公自动化的需求。

e187b80ce20ca7acfd00379b62196471.png

成绩分析

实际上现在成绩分析已经容易多了,装备了智学网、全通等各种网络阅卷系统的学校,如果是网上阅卷,很容易就能够根据自己的需求得到需要的成绩分析报告,平均分最高分,三线一律,分数段分析等等,除了数据还能够给出丰富的图表;也有的考试系统,虽然给出了洋洋洒洒数页的分析报告,但是不能定制,不能提供学科老师关注的成绩分析的点;至于这些成绩分析,能否给出更加详细的知识点掌握情况的反馈,这个不在本文讨论之列,本文只讨论每科最终得分;有的学校是由教务员或者信息技术老师用Excel或者成绩分析软件进行分析,但是多年的成绩数据往往不能够形成数据库,相对来说比较分散。

能够购买网上阅卷系统或者成绩分析软件的学校其实还是少数,大部分都是自己用Excel进行分析,如果是单个班级单个学科,用Excel进行成绩分析并不复杂,但是如果涉及到任教的所有班级、整个年级甚至整个学校,用Excel进行成绩分析的工作就会相当繁重,大大超过了学会python再来进行成绩分析的工作量。所以无论是因为缺乏必要的软件工具,还是用Excel太复杂又或者不能胜任,学习用python来进行成绩分析和处理都是有必要的,无论是对于当前在校的老师还是还在学校的师范生。疫情当前,生活本来就很难,提高工作效率,会有更多的时间放空和养生,毕竟无论什么时候养生都是第一位呢。

当然用python来处理一个年级的成绩,需要所有的成绩表格式一致,不一致的话需要进行预处理也就是所谓的数据清洗,这样写程序会避免写一些额外的代码,毕竟大家都知道代码其实并不智能,你要写的很智能,就要增加非常度的开发量,但是这些开发量可以通过统一格式来避免;有的学校统计成绩用钉钉的在线表格或者金山在线文档,格式会一致,这样就会方便很多;很多高大上的功能,在实际中并不是很重要,甚至我们不处理异常,更多的我们写的是一次性的脚本或者程序,运行一次之后就“丢弃了”,当然了成绩分析这种事,年年有,每个学期有,花费心思定制属于自己的成绩分析软件是值得的,毕竟大部分老的教师职业生涯都要三四十年,从这个角度学习python,在现有软件不能满足需求,学校自己不足的情况下,开发自己的成绩分析软件,用的顺手的软件是很赚的。

事情做多了,手熟了,就会有自己的一套方法,把这套方法用程序表示出来,并渐渐的能够兼容很多乱七八糟的情况,属于自己的软件就成了。从这个角度,我很佩服以前工作的学校的一个体育老师,自己从零开始学习,开发了青岛市运动会管理系统,从这个角度,他比我厉害。

Python库的选择

其实用Python进行成绩分析,Pandas无疑是最强大的,然后才是其他的Excel相关的第三方库,比如xlrd&xlwt、openpyxl、xlxwriter等,但是情境的不同需要选择的库也不同。

xlrd&xlwt

xlrd的作用是读取Excel文件,xlwt是修改Excel文件。不管悲催的是,想要既要读取又修改&吸入Excel,还需要第三方库的支持。相对来说修改并保存Excel的逻辑比较复杂,所以只有仅需读取excel的时候,用xlrd。

openpyxl

这个库不支持2003版本的excel,excel 2010之后的都是支持的,现在一般电脑自带的excel版本都比较新,所以用这个库不会遇到太多的兼容性问题;即便是偏远地区,薄弱校,excel的版本大多是2007或者wps,实在不行,如果真的是excel2003,装个wps也能解决问题。

openpyxl的API设计的比xlrd合理,跟我们日常使用excel的逻辑是一致的,读取并写入excel也很优雅流程,跟我们用excel打开文件,然后保存一样简单。甚至openpyxl还支持公式等操作,但是其实,我们只需要用到数据的读取就好了。

如果是用xlrd&xlwt类似的库来读取写入excel,进行成绩分析,成绩分析的算法需要自行实现,好比你买了一套工具比较少的工具箱,能够满足基本需求,但是高级的需求要自己实现,毕竟只有一把锉刀也可以造锤子,但是如果有机床肯定更加方便。但是如果是用pandas库进行成绩分析,那么就好比从传统木工工具上升到了机床,直接数控开榫,效率大大提高。pandas求总分、平均分,六选三不同组合的分是很简单的,几乎跟用excel公式没有差别,但是相对来说openpyxl稍微麻烦点,pandas处理数据是按照矢量来的,跟openpyxl是不同的。不过对于初学者pandas更加容易理解,就像小孩子在学习小乌龟编程,宁愿复制命令,也不会主动的用循环或者函数简化代码,要么不会,要么掌握的不够熟练。

openpyxl的安装

安装非常简单,只需要在python中的命令行提示符中

1python -m pip install openpyxl

或者更简单一点

1pip install openpyxl

pandas

pandas无疑是强大的,坦白的讲,我自己也不熟悉,当然这也是我写文章的原因,记录自己学习的过程,健身学习印象。

处理excel

文件的打开和关闭

其实,分析成绩最常见的工作流就是:打开文件,编辑excl文件,保存文件。这个流程用excel来做旧比较简单。

 1from openpyxl import load_workbook
2
3# 打开excel文件
4wb = load_workbook('iamhappy.xlsx')
5
6# 选择第1个工作表sheet
7ws = wb.active 
8
9# 修改A1单元格的值
10ws['A1'] = '苟日新,日日新'
11
12# 保存文件
13wb.save('iamhappy.xlsx') 

首先从openpyxl库中导入加载(打开)excel文件要用到的方法(工具)load_workbook,然后调用,相当于在excel通过打开菜单,打开文件;而wb.active其实就是选择默认激活的工作表,在excel中默认激活的excel一般是第一个,当然你修改了就不是了,这个在处理excel的时候是需要注意的。

5a301bcb2014d8e7889f1331272767bf.png
选择工作簿中激活的工作表

这个是用wps创建的默认只有一个sheet,而excel老版本创建的工作簿默认有3个sheet(工作表),现在最新的excel 365也是一个了。而运行ws = wb.active就相当于,用鼠标单击了Sheet1,意味着要在这个工作表中处理数据。

注意我们平时说的excel文件术语是工作簿,也就是英文的worksheet,习惯性缩写为wb;而工作表就是sheet,也就是worksheet这个词,习惯性缩写为ws;日常生活中一般很少用工作簿或者工作表,除非是写书,一般说excel文件和sheet。**还需要注意的是,在excel打开的情况下,python程序无法操纵excel文件的,需要在文件关闭的状态下进行。

文件的修改

打开关闭文件只是准备工作,对数据修改才是核心,也就是数据的插入、修改、删除、复制、计算、格式等操作,我们慢慢讲来。

在这里需要赘述下excel中的基本概念,单元格,单元格的值,单元格的行标和列标,以及单元格的格式,单元格值的修改;然后是行的概念,列的概念,表头;然后是公式;这是一些基础的概念,想要用python处理excel,就要知道在python的第三方库xlrd、openpyxl以及pandas,这些操作是如何完成的,掌握了这些知识,就可以愉快的用python进行数据处理了。所以从这个角度来看,python处理数据其实很简单的。

以前陪朋友去咨询古筝课程,说学习古筝有两种学习方法,一种是为了考级那就非常系统的学习,一种是老头老太太,学会弹奏一两首就行了,这两种学习目的不同的人,教学方式也不同,就像有人看了陈情令,买了笛子就只想学会不羁是一样的。

单元格值的读取和修改

可以说无论是什么水平的excel使用者,大部分时间都花在了跟单元格打交道上,夸张点说,只要我们知道了如何读取单元格,如何设置、修改单元格的值,我们就已经可以使用excel了,同样可以用python处理excel了,因为无非是python读取数据,编写处理数据处理的程序,然后把处理的结果输出到excel,所以学会处理excel的值是最重要的。

而openpyxl的API显然是经过了非常良好的设计,可以方便的读取工作簿(英文单词是哪个?)中工作表中的单元格的值。

75b5f71600cd4468a13a4d9bc4520c41.png
选中B4单元格

日常使用excel的时候,描述一个单元格,往往会说B4单元格,在excel中,行的序号是字母以及字母的组合,列的序号是阿拉伯数字。而openpyxl库的作者利用python提供的一些魔术方法,使得我们在用这个库访问excel单元格的数据的时候,跟我们日常习惯相同。所以从语法上看ws["A1"]是在访问字典ws中键为A1的元素,实际上,得益于魔术方法,访问的是ws中第1列第1行的数据,ws在openpyxl中,可以看做是一个具有二维数组特性的类,当然扩展了很多属性,这种实现是很妙的,得益于python良好的语言架构,如果你读过《流畅的Python》这本书就更能领会优雅精妙之处了,由于python提供的魔术方法,我们可以像操作python自带的数据结构一样操作自定义的类,比如这个中括号运算,真的是非常的方便了。

既然知道了怎么修改了,其实读取值也是一样的,还是ws["A1"].value或者ws["B4"].value,如果想要输出单元格的值,只要

 1from openpyxl import load_workbook
2
3# 打开excel文件
4wb = load_workbook('iamhappy.xlsx')
5
6# 选择第1个工作表sheet
7ws = wb.active 
8
9# # 修改A1单元格的值
10# ws['A1'] = '苟日新,日日新'
11
12# 读取单元格的值
13print(ws["A1"].value)
14# 保存文件
15wb.save('iamhappy.xlsx') 

小结

所以到这里,我们已经理解了如何打开、保存excel,读取和修改单元格的值,这就可以用excel处理需求了,可以这是用python处理excel数据需要学习的最简单的技巧了。写这些一方面是想学习,一方面也是打发时间,还有一些说不清道不明的原因,反正就是写点总比不写好。虽然我打算写的是针对学校场景中的信息技术老师、教务员以及想用python分析成绩的学科老师的内容,但是其他应用场景下的无产阶级兄弟们也是可以学习借鉴,只不过力求通俗(懒)所以写的很是臃肿啰嗦,近乎于培训讲座的逐字稿。

练习

你可以试着安装下openpyxl库,然后用openpyxl打开(这里不用读取用打开其实是为了与日常使用excel的体验一致)一个已有的excel文件,

  • 读取单元格的数据,用print函数打印出来,显示在命令行中;

  • 修改excel中某个单元格的值

  • 打开一个成绩表,求几个学生的总分,当然所有学生的总分需要用到循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文介绍的是利用Python语言,做成绩分析并生成成绩分析动态图表。Python语言可以利用Pandas、Pyecharts等各种类库,进行数据分析。 本文介绍的成绩分析大体分为三步: 一、拼合单科成绩,合成学年成绩,计算总分,按总分成绩排名次,然后由学年成绩筛选出各个班级的成绩,将学年成绩,各班级成绩存入一个Excel文件中,工作表分别命名为学年成绩,高三(1)班……等 二、利用生成的第一步生成的Excel文件,做成绩分析保存成绩分析表格。 三、利用成绩分析表格,做成绩分析动态图。 下面是部分源代码: 1、成绩整理与合并 import glob import os import pandas as pd from functools import reduce inputPath="./原始成绩/" writer_lk = pd.ExcelWriter('./整理后的成绩/2020一模理科总成绩及各班级成绩.xlsx') writer_wk = pd.ExcelWriter('./整理后的成绩/2020一模文科总成绩及各班级成绩.xlsx') inputWorkbook=glob.glob(os.path.join(inputPath,"*.xls")) #====================读取全部学生的所有科目成绩=================================== yw_score = pd.read_excel(inputWorkbook[2]) sxlk_score = pd.read_excel(inputWorkbook[1]) sxwk_score = pd.read_excel(inputWorkbook[0]) yy_score = pd.read_excel(inputWorkbook[5]) yy_score['英语'] = (yy_score['英语'] * 1.25).round(0)#英语成绩不计算听力成绩*1.25 lkzh_score = pd.read_excel(inputWorkbook[4]) wkzh_score = pd.read_excel(inputWorkbook[3]) #======================================================================= #====================整理出理科成绩及分班成绩、计算总分、总分排名、班级排名============================= lk_class = ['高三(1)班','高三(2)班','高三(3)班','高三(4)班'] wk_class = ['高三(5)班','高三(6)班'] lk_yw = yw_score.loc[(yw_score.班级.isin(lk_class)), ['班级','姓名','语文']] lk_sx = sxlk_score[['姓名','数学']] lk_yy = yy_score.loc[(yy_score.班级.isin(lk_class)), ['姓名','英语']] lk_k3 = lkzh_score[['姓名','物理','化学','生物','理综']] lk_list = [lk_yw, lk_sx, lk_yy, lk_k3] score_lk = (reduce(lambda left, right: pd.merge(left, right, on='姓名'), lk_list)) score_lk['总分'] = (score_lk['语文'] + score_lk['数学'] + score_lk['英语'] + score_lk['理综']).round(0) def sort_grade(score): score_sort = score.sort_values(by=['总分'], ascending=False) score_sort['年级排名'] = score_sort['总分'].rank(ascending=0,method='min') return score_sort def sort_class_lk(score_garde,name): class_sort = score_garde.loc[score_garde.班级 == name, :] class_sort = class_sort.sort_values(by=['总分'], ascending=False) class_sort['班级排名'] = class_sort['总分'].rank(ascending=0,method='min') class_sort.to_excel(writer_lk, index=None, sheet_name=name) lk_grade_sort = sort_grade(score_lk) lk_grade_sort.to_excel(writer_lk, index=None, sheet_name='学年成绩') for lk in lk_class: class_sort = sort_class_lk(score_lk, lk) writer_lk.save() writer_lk.close() # #============整理出文科成绩及分班成绩、计算总分、总分排名、班级排名================== wk_yw = yw_score.loc[(yw_score.班级.isin(wk_class)), ['班级','姓名','语文']] wk_sx = sxwk_score[['姓名','数学']] wk_yy = yy_score.loc[(yy_score.班级.isin(wk_class)), ['姓名','英语']] wk_k3 = wkzh_score[['姓名','政治','历史','地理','文综']] wk_list = [wk_yw, wk_sx, wk_yy, wk_k3] score_wk = (reduce(lambda left, right: pd.merge(left, right, on='姓名'), wk_list)) score_wk['总分'] = (score_wk['语文'] + score_wk['数学'] + score_wk['英语'] + score_wk['文综']).round(0) def sort_class_wk(score_garde,name): class_sort = score_garde.loc[score_garde.班级 == name, :] class_sort = class_sort.sort_values(by=['总分'], ascending=False) class_sort['班级排名'] = class_sort['总分'].rank(ascending=0,method='min') class_sort.to_excel(writer_wk, index=None, sheet_name=name) wk_grade_sort = sort_grade(score_wk) wk_grade_sort.to_excel(writer_wk, index=None, sheet_name='学年成绩') for wk in wk_class: class_sort = sort_class_wk(wk_grade_sort, wk) writer_wk.save() writer_wk.close() 2、成绩区间分割与统计 #coding:utf-8 import numpy as np import pandas as pd from functools import reduce fpath_lk="./整理后的成绩/2020一模理科总成绩及各班级成绩.xlsx" fpath_wk="./整理后的成绩/2020一模文科总成绩及各班级成绩.xlsx" writer_lk = pd.ExcelWriter('./整理后的成绩/2020一模理科成绩区间分布统计.xlsx') writer_wk = pd.ExcelWriter('./整理后的成绩/2020一模文科成绩区间分布统计.xlsx') lk = pd.read_excel(fpath_lk, None) #获取表格中的所有工作表的内容 wk = pd.read_excel(fpath_wk, None) #===================1.定义区间分割函数===================================== def cut_750(score_750,len): bins_750= [0,370,380,390,400,410,420,430,440,450,460,470,480,490,500,510,520,530,540,550,560,570,580,590,600,620,640,660,750] labels_750 = ['0-370','370-379','380-389','390-399','400-409','410-419','420-429','430-439','440-449','450-459','460-469','470-479','480-489','490-499','500-509','510-519','520-529','530-539','540-549','550-559','560-569','570-579','580-589','590-599','600-619','620-639','640-659','660-750'] cut_750 = pd.cut(score_750, bins_750, labels=labels_750, right=False) qj = pd.DataFrame({'区间':pd.value_counts(cut_750).index,'人数':pd.value_counts(cut_750),'百分比':((pd.value_counts(cut_750))/len).round(3).apply(lambda x: format(x, '.2%'))}).sort_values(by='区间', ascending=False) qj = qj.reset_index(drop=True) return qj def cut_150(score_150,len): bins_150 = [0,30,60,90,120,150] labels_150 = ['0-30', '30-60', '60-90', '90-120', '120-150'] cut_150 = pd.cut(score_150, bins_150, labels=labels_150, right=False) qj = pd.DataFrame({'区间':pd.value_counts(cut_150).index,'人数':pd.value_counts(cut_150),'百分比':((pd.value_counts(cut_150))/len).round(3).apply(lambda x: format(x, '.2%'))}).sort_values(by='区间') 其他源代码及始数据已上传,欢迎各位借鉴,第一次编程,希望网友们能指点不足之处,联系qq:912182988

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值