唐新彩 胡燕



摘要:為充分培養學生的信息素養,提升高中生的信息意識,多方面地培養學生學習興趣,高中學校普遍會給學生開設校本課或者創新選修模塊課。課程涉及多個科目和全年級的學生,學生按興趣選擇對應課程,但人工處理學生的選課結果耗時耗力,本文給出基于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.