唐新彩 胡燕
摘要:为充分培养学生的信息素养,提升高中生的信息意识,多方面地培养学生学习兴趣,高中学校普遍会给学生开设校本课或者创新选修模块课。课程涉及多个科目和全年级的学生,学生按兴趣选择对应课程,但人工处理学生的选课结果耗时耗力,本文给出基于Python的第三方数据分析处理库pandas的模块课分班软件,大大提高了分班效率,帮助教师快速获取学生的选课结果,充分体现了信息技术的优势。
关键词:数据处理;python;pandas;DataFrame;选课分班
中图分类号:G434 文献标识码:A 论文编号:1674-2117(2021)18-0070-04
● 问题描述
笔者所在学校的每位教师都会根据自己的特长及学校规划、学生学习兴趣,针对高二学生开设创新选修模块课程,课程科目每年都会更新,主要是科学与技术学科类的拓展课程。历年开设过的课程如下页表所示。
高二全年级学生根据自己的学习能力和兴趣特长从中选择一门课程拓展学习。技术科组教师需要根据学生的选课志愿、教室情况以及课程硬件设备(如平板电脑数量)情况来分配学生的选课结果。手动人工处理这些数据耗时耗力,给技术科组教师带来了较大负担。而Python在数据处理和分析方面有很大的优势,笔者发现基于Python 的pandas库编写的模块课选课分班软件,可以帮助教师快速获取选课结果,在解放教师的同时也体现了信息技术的魅力。
● 准备工作
编写软件前需先采集好学生的选课志愿以及搭建好编写软件的平台。
(1)首先确定好开设的课程和对应的授课教师、授课地点、授课人数、可容纳学生数等信息,把这些信息放在“课程设置.xlsx”文件中,作为选课分班的一个输入文件。目前用到的测试文件有两组,其中一组的“课程设置.xlsx”的内容如下页图1所示,列表项“可容纳学生数”的值“平均数”是指当同一上课时间内的学生数减去60后刚好能被3整除,那这个平均数就真的是平均数,但若不能整除,若余下1个,就放在课程1中,若余下2个,就放在课程1和课程2中。
(2)采集数据。将以上第一步信息制作成选课单,然后在问卷星上以调查问卷的形式,让学生填写,填好后下载结果,并存放在“高二模块课选课结果.xlsx”文件中。这也作为选课分班的一个输入文件。部分选课结果展示如下页图2所示。
(3)根据学校安排的课表把班级的上课时间制作成Excel文件,文件名为“上课时间.xlsx”。这也作为选课分班的一个输入文件,如下页图3所示。
(4)软硬件环境如下。
①建议使用安装了win7或以上操作系统的计算机。
②安装了pandas库的Python编辑器:PyCharm、IDLE、Spyder (anaconda3)、海龟编辑器等。笔者使用的是Spyder(anaconda3)。
(5)将“课程设置.xlsx”“高二模块课选课结果.xlsx”“上课时间.xlsx”三个输入文件与实现分班的Python软件包放在同一个目录下。
● 软件设计分析
1.选课分班原则
①以学生角度。优先按第一志愿分班,再按第二志愿分班。如果第一志愿和第二志愿的课程人数都已经达到了可容纳学生数,再被随机分配到其他班。
②以课程角度。优先从第一志愿的学生中选择,再从第二志愿的学生中選择。如果第一志愿和第二志愿的学生加起来还不够课程的可容纳学生数,则随机选择学生。
2.软件数据结构分析
①最主要的数据结构是DataFrame,不管是读入三个输入文件后的信息的保存,还是分班中途数据的存储和分班后结果的存放都存放在DataFrame中,再把DataFrame数据保存到excel文件中。
②字符串、列表、集合:集合用来去重,列表用得非常多,很多信息都是放在列表中的,如由字符串组成的列表、由DataFrame组成的列表等。
● 软件设计具体操作
第一步,读入“课程设置.xlsx”“高二模块课选课结果.xlsx”“上课时间.xlsx”三个文件。
第二步,将同一上课时间的学生信息存储在一个DataFrame中,如7~10班为周一第六节课,就把这四个班级的学生信息存储在同一个DataFrame中,并标注上课时间。接着,将整理好的多个DataFrame放在一个列表中,如文件中高二一周一共有5次课,那么列表就由5个DataFrame构成。
第三步,学生分班,即对每个DataFrame中的学生,根据课程数及课程的可容纳学生数将学生分班,如有5个课程及每个课程可容纳的学生数,就把DataFrame中的学生分成5个小的DataFrame,且对应5个班及5个课程,并满足每个课程的可容纳学生数。分班是整个程序实现最重要的一步,分班的具体算法如下:
①把每个课程第一志愿的学生和第二志愿的学生都选出来(选出来的是一个DataFrame),分别放在不同的列表中。
②根据每个课程第一志愿的学生数和第二志愿的学生数与可容纳学生数的关系,把课程序号存放在不同的列表中。
列表dadao1:存放第一志愿就达到可容纳学生数的课程序号。
列表weidadao1:存放第一志愿未达到可容纳学生数的课程序号。
列表dadao2:存放第一志愿加上第二志愿达到可容纳学生数的课程序号。
列表weidadao2:存放第一志愿加上第二志愿仍未达到可容纳学生数的课程序号。
③优先为列表dadao1中的课程选择学生。因为这些课程第一志愿学生数多于可容纳学生数,就从这些第一志愿的学生中选出可容纳学生数的学生量(优先不选择第二志愿的课程序号在列表weidadao2中的学生)。
④为列表weidadao1中的课程选择学生。如果第一志愿加上第二志愿的学生数仍小于可容纳学生数,则直接把第二志愿的学生加到第一志愿的学生中就行;如果第一志愿加上第二志愿的学生超过了可容纳学生数,则要从第二志愿中随机选择(可容纳学生数-第一志愿学生数)学生个数出来,完成此课程的学生分配。
⑤为未达到可容纳学生数的课程在剩下的未分班的学生中随机分配需要的学生。剩下的未分班学生可能是未填选课单的学生,也可能是第一志愿或第二志愿的学生数量很多的课程中的学生,还可能是在前面随机选择时没有被第一志愿或第二志愿的课程选中的学生。
⑥在经过前几步分班后的结果中加入各个学生的选课结果和上课地点,并把同一上课时间的分好班的所有学生放到一个DataFrame中。
⑦把分班结果写入Excel文件,并分两个文件存储:一个是给教师的文件——把学生按上课时间分成多个工作表存放;另一个是给学生的文件——把所有学生放在一个工作表中,按班级和课程排序,便于通知学生。
⑧把编写好的Python文件打包成可执行文件.exe文件。这样以后每次需要分班时,只要计算机上有该.exe文件和3个准备好的输入文件,不管计算机上有没有安装Python编辑器,都可以运行,实现分班的功能,脱离了对平台的依赖。
● 软件的主要代码
图4为选择出每门课程第一志愿的学生和第二志愿的学生的代码。
图5是优先给列表dadao1中的课程分配学生的代码。
图6是列表weidadao1中的课程选择学生的代码。
图7是还没选好学生的课程随机分配学生的代码。
● 软件测试运行
首先,把“课程设置.xlsx”“高二模块课选课结果.xlsx”“上課时间.xlsx”作为输入文件输入,运行.exe可执行文件,得到的结果存放在output文件夹(在运行软件之前,在软件的同一目录下先新建一个output文件夹)中,其中包含以下两个输出文件:output.xlsx和zongbiao.xlsx。
①output.xlsx:按上课时间把学生分放在多个工作表中。
②zongbiao.xlsx:把所有学生都放在一个工作表中,按班级和选课结果排序,以便通知学生。
接着,查看结果,每个课程都是优先选择了第一志愿的学生,再去选择第二志愿的学生,如果还不满足可容纳学生数,最后才选择其他的学生。另外,学生的选课结果也可以做修改,将学生数减少到200多人,还是19个班,学生只有4个课程可以选择,上课时间还是没变,运行软件,让其实现分班,然后查看分班结果,同样也达到了理想的效果。
总之,笔者所在学校通过多组数据测试分析软件的可行性,均达到了满意的效果,既尽可能地满足了学生对第一志愿课程学习的需要,又解放了教师。
参考文献:
王晓华.基于Python的程序评分软件的设计与实现[J].技术与应用,2021(02):77-79.