唐新彩 胡燕
摘要:為充分培養(yǎng)學(xué)生的信息素養(yǎng),提升高中生的信息意識(shí),多方面地培養(yǎng)學(xué)生學(xué)習(xí)興趣,高中學(xué)校普遍會(huì)給學(xué)生開設(shè)校本課或者創(chuàng)新選修模塊課。課程涉及多個(gè)科目和全年級(jí)的學(xué)生,學(xué)生按興趣選擇對(duì)應(yīng)課程,但人工處理學(xué)生的選課結(jié)果耗時(shí)耗力,本文給出基于Python的第三方數(shù)據(jù)分析處理庫(kù)pandas的模塊課分班軟件,大大提高了分班效率,幫助教師快速獲取學(xué)生的選課結(jié)果,充分體現(xiàn)了信息技術(shù)的優(yōu)勢(shì)。
關(guān)鍵詞:數(shù)據(jù)處理;python;pandas;DataFrame;選課分班
中圖分類號(hào):G434? 文獻(xiàn)標(biāo)識(shí)碼:A? 論文編號(hào):1674-2117(2021)18-0070-04
● 問(wèn)題描述
筆者所在學(xué)校的每位教師都會(huì)根據(jù)自己的特長(zhǎng)及學(xué)校規(guī)劃、學(xué)生學(xué)習(xí)興趣,針對(duì)高二學(xué)生開設(shè)創(chuàng)新選修模塊課程,課程科目每年都會(huì)更新,主要是科學(xué)與技術(shù)學(xué)科類的拓展課程。歷年開設(shè)過(guò)的課程如下頁(yè)表所示。
高二全年級(jí)學(xué)生根據(jù)自己的學(xué)習(xí)能力和興趣特長(zhǎng)從中選擇一門課程拓展學(xué)習(xí)。技術(shù)科組教師需要根據(jù)學(xué)生的選課志愿、教室情況以及課程硬件設(shè)備(如平板電腦數(shù)量)情況來(lái)分配學(xué)生的選課結(jié)果。手動(dòng)人工處理這些數(shù)據(jù)耗時(shí)耗力,給技術(shù)科組教師帶來(lái)了較大負(fù)擔(dān)。而Python在數(shù)據(jù)處理和分析方面有很大的優(yōu)勢(shì),筆者發(fā)現(xiàn)基于Python 的pandas庫(kù)編寫的模塊課選課分班軟件,可以幫助教師快速獲取選課結(jié)果,在解放教師的同時(shí)也體現(xiàn)了信息技術(shù)的魅力。
● 準(zhǔn)備工作
編寫軟件前需先采集好學(xué)生的選課志愿以及搭建好編寫軟件的平臺(tái)。
(1)首先確定好開設(shè)的課程和對(duì)應(yīng)的授課教師、授課地點(diǎn)、授課人數(shù)、可容納學(xué)生數(shù)等信息,把這些信息放在“課程設(shè)置.xlsx”文件中,作為選課分班的一個(gè)輸入文件。目前用到的測(cè)試文件有兩組,其中一組的“課程設(shè)置.xlsx”的內(nèi)容如下頁(yè)圖1所示,列表項(xiàng)“可容納學(xué)生數(shù)”的值“平均數(shù)”是指當(dāng)同一上課時(shí)間內(nèi)的學(xué)生數(shù)減去60后剛好能被3整除,那這個(gè)平均數(shù)就真的是平均數(shù),但若不能整除,若余下1個(gè),就放在課程1中,若余下2個(gè),就放在課程1和課程2中。
(2)采集數(shù)據(jù)。將以上第一步信息制作成選課單,然后在問(wèn)卷星上以調(diào)查問(wèn)卷的形式,讓學(xué)生填寫,填好后下載結(jié)果,并存放在“高二模塊課選課結(jié)果.xlsx”文件中。這也作為選課分班的一個(gè)輸入文件。部分選課結(jié)果展示如下頁(yè)圖2所示。
(3)根據(jù)學(xué)校安排的課表把班級(jí)的上課時(shí)間制作成Excel文件,文件名為“上課時(shí)間.xlsx”。這也作為選課分班的一個(gè)輸入文件,如下頁(yè)圖3所示。
(4)軟硬件環(huán)境如下。
①建議使用安裝了win7或以上操作系統(tǒng)的計(jì)算機(jī)。
②安裝了pandas庫(kù)的Python編輯器:PyCharm、IDLE、Spyder (anaconda3)、海龜編輯器等。筆者使用的是Spyder(anaconda3)。
(5)將“課程設(shè)置.xlsx”“高二模塊課選課結(jié)果.xlsx”“上課時(shí)間.xlsx”三個(gè)輸入文件與實(shí)現(xiàn)分班的Python軟件包放在同一個(gè)目錄下。
● 軟件設(shè)計(jì)分析
1.選課分班原則
①以學(xué)生角度。優(yōu)先按第一志愿分班,再按第二志愿分班。如果第一志愿和第二志愿的課程人數(shù)都已經(jīng)達(dá)到了可容納學(xué)生數(shù),再被隨機(jī)分配到其他班。
②以課程角度。優(yōu)先從第一志愿的學(xué)生中選擇,再?gòu)牡诙驹傅膶W(xué)生中選擇。如果第一志愿和第二志愿的學(xué)生加起來(lái)還不夠課程的可容納學(xué)生數(shù),則隨機(jī)選擇學(xué)生。
2.軟件數(shù)據(jù)結(jié)構(gòu)分析
①最主要的數(shù)據(jù)結(jié)構(gòu)是DataFrame,不管是讀入三個(gè)輸入文件后的信息的保存,還是分班中途數(shù)據(jù)的存儲(chǔ)和分班后結(jié)果的存放都存放在DataFrame中,再把DataFrame數(shù)據(jù)保存到excel文件中。
②字符串、列表、集合:集合用來(lái)去重,列表用得非常多,很多信息都是放在列表中的,如由字符串組成的列表、由DataFrame組成的列表等。
● 軟件設(shè)計(jì)具體操作
第一步,讀入“課程設(shè)置.xlsx”“高二模塊課選課結(jié)果.xlsx”“上課時(shí)間.xlsx”三個(gè)文件。
第二步,將同一上課時(shí)間的學(xué)生信息存儲(chǔ)在一個(gè)DataFrame中,如7~10班為周一第六節(jié)課,就把這四個(gè)班級(jí)的學(xué)生信息存儲(chǔ)在同一個(gè)DataFrame中,并標(biāo)注上課時(shí)間。接著,將整理好的多個(gè)DataFrame放在一個(gè)列表中,如文件中高二一周一共有5次課,那么列表就由5個(gè)DataFrame構(gòu)成。
第三步,學(xué)生分班,即對(duì)每個(gè)DataFrame中的學(xué)生,根據(jù)課程數(shù)及課程的可容納學(xué)生數(shù)將學(xué)生分班,如有5個(gè)課程及每個(gè)課程可容納的學(xué)生數(shù),就把DataFrame中的學(xué)生分成5個(gè)小的DataFrame,且對(duì)應(yīng)5個(gè)班及5個(gè)課程,并滿足每個(gè)課程的可容納學(xué)生數(shù)。分班是整個(gè)程序?qū)崿F(xiàn)最重要的一步,分班的具體算法如下:
①把每個(gè)課程第一志愿的學(xué)生和第二志愿的學(xué)生都選出來(lái)(選出來(lái)的是一個(gè)DataFrame),分別放在不同的列表中。
②根據(jù)每個(gè)課程第一志愿的學(xué)生數(shù)和第二志愿的學(xué)生數(shù)與可容納學(xué)生數(shù)的關(guān)系,把課程序號(hào)存放在不同的列表中。
列表dadao1:存放第一志愿就達(dá)到可容納學(xué)生數(shù)的課程序號(hào)。
列表weidadao1:存放第一志愿未達(dá)到可容納學(xué)生數(shù)的課程序號(hào)。
列表dadao2:存放第一志愿加上第二志愿達(dá)到可容納學(xué)生數(shù)的課程序號(hào)。
列表weidadao2:存放第一志愿加上第二志愿仍未達(dá)到可容納學(xué)生數(shù)的課程序號(hào)。
③優(yōu)先為列表dadao1中的課程選擇學(xué)生。因?yàn)檫@些課程第一志愿學(xué)生數(shù)多于可容納學(xué)生數(shù),就從這些第一志愿的學(xué)生中選出可容納學(xué)生數(shù)的學(xué)生量(優(yōu)先不選擇第二志愿的課程序號(hào)在列表weidadao2中的學(xué)生)。
④為列表weidadao1中的課程選擇學(xué)生。如果第一志愿加上第二志愿的學(xué)生數(shù)仍小于可容納學(xué)生數(shù),則直接把第二志愿的學(xué)生加到第一志愿的學(xué)生中就行;如果第一志愿加上第二志愿的學(xué)生超過(guò)了可容納學(xué)生數(shù),則要從第二志愿中隨機(jī)選擇(可容納學(xué)生數(shù)-第一志愿學(xué)生數(shù))學(xué)生個(gè)數(shù)出來(lái),完成此課程的學(xué)生分配。
⑤為未達(dá)到可容納學(xué)生數(shù)的課程在剩下的未分班的學(xué)生中隨機(jī)分配需要的學(xué)生。剩下的未分班學(xué)生可能是未填選課單的學(xué)生,也可能是第一志愿或第二志愿的學(xué)生數(shù)量很多的課程中的學(xué)生,還可能是在前面隨機(jī)選擇時(shí)沒(méi)有被第一志愿或第二志愿的課程選中的學(xué)生。
⑥在經(jīng)過(guò)前幾步分班后的結(jié)果中加入各個(gè)學(xué)生的選課結(jié)果和上課地點(diǎn),并把同一上課時(shí)間的分好班的所有學(xué)生放到一個(gè)DataFrame中。
⑦把分班結(jié)果寫入Excel文件,并分兩個(gè)文件存儲(chǔ):一個(gè)是給教師的文件——把學(xué)生按上課時(shí)間分成多個(gè)工作表存放;另一個(gè)是給學(xué)生的文件——把所有學(xué)生放在一個(gè)工作表中,按班級(jí)和課程排序,便于通知學(xué)生。
⑧把編寫好的Python文件打包成可執(zhí)行文件.exe文件。這樣以后每次需要分班時(shí),只要計(jì)算機(jī)上有該.exe文件和3個(gè)準(zhǔn)備好的輸入文件,不管計(jì)算機(jī)上有沒(méi)有安裝Python編輯器,都可以運(yùn)行,實(shí)現(xiàn)分班的功能,脫離了對(duì)平臺(tái)的依賴。
● 軟件的主要代碼
圖4為選擇出每門課程第一志愿的學(xué)生和第二志愿的學(xué)生的代碼。
圖5是優(yōu)先給列表dadao1中的課程分配學(xué)生的代碼。
圖6是列表weidadao1中的課程選擇學(xué)生的代碼。
圖7是還沒(méi)選好學(xué)生的課程隨機(jī)分配學(xué)生的代碼。
● 軟件測(cè)試運(yùn)行
首先,把“課程設(shè)置.xlsx”“高二模塊課選課結(jié)果.xlsx”“上課時(shí)間.xlsx”作為輸入文件輸入,運(yùn)行.exe可執(zhí)行文件,得到的結(jié)果存放在output文件夾(在運(yùn)行軟件之前,在軟件的同一目錄下先新建一個(gè)output文件夾)中,其中包含以下兩個(gè)輸出文件:output.xlsx和zongbiao.xlsx。
①output.xlsx:按上課時(shí)間把學(xué)生分放在多個(gè)工作表中。
②zongbiao.xlsx:把所有學(xué)生都放在一個(gè)工作表中,按班級(jí)和選課結(jié)果排序,以便通知學(xué)生。
接著,查看結(jié)果,每個(gè)課程都是優(yōu)先選擇了第一志愿的學(xué)生,再去選擇第二志愿的學(xué)生,如果還不滿足可容納學(xué)生數(shù),最后才選擇其他的學(xué)生。另外,學(xué)生的選課結(jié)果也可以做修改,將學(xué)生數(shù)減少到200多人,還是19個(gè)班,學(xué)生只有4個(gè)課程可以選擇,上課時(shí)間還是沒(méi)變,運(yùn)行軟件,讓其實(shí)現(xiàn)分班,然后查看分班結(jié)果,同樣也達(dá)到了理想的效果。
總之,筆者所在學(xué)校通過(guò)多組數(shù)據(jù)測(cè)試分析軟件的可行性,均達(dá)到了滿意的效果,既盡可能地滿足了學(xué)生對(duì)第一志愿課程學(xué)習(xí)的需要,又解放了教師。
參考文獻(xiàn):
王曉華.基于Python的程序評(píng)分軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].技術(shù)與應(yīng)用,2021(02):77-79.