我的学区要求我根据学生的年级水平安排明年的非选修课程。不幸的是,我们无法使用一些可以自动执行此操作的简洁的日程安排应用程序。我想尝试使用 Python,而不是手动对每个学生进行排班。我之前编写过代码来加快一些低级管理任务的速度,但这比我预期的更具挑战性。
我的代码需要执行以下操作:
这是我想看到的输出示例:
1 类第 1 部分 | 第 1 类第 2 部分 |
---|---|
学生1 | 学生3 |
学生2 | 学生4 |
这是我的代码可以生成的另一种格式:
学生们 | 第一期 | 第二期 |
---|---|---|
学生1 | 课程 1 第 1 部分 | 课程 3 第 2 部分 |
学生2 | 课程 2 第 1 部分 | 课程 4 第 1 部分 |
学生3 | 课程 3 第 1 部分 | 课程 1 第 2 部分 |
我有一个包含 500 名学生的 CSV(出于保密原因,姓名替换为“学生 X”)及其相关年级。我已将此 CSV 转换为 Pandas DataFrame 并编写了以下代码。我的方向是将每门课程(例如英语 1、代数 1 等)制作成一个 Pandas 系列,并将其连接到一个更大的 DataFrame。对于这个例子,我将其限制为仅一种课程类型(英语 1,又名“ELA 1”)作为测试:
import pandas as pd
s_test = 'schedule_test.csv' # Roster of students and grade levels
df_s_test = pd.read_csv(s_test)
class_size_limit = 30
stop = 0
df_shuffle = df_s_test.sample(frac=1)
ela1 = {'ELA Section 1':[],'ELA Section 2':[],'ELA Section 3':[],'ELA Section 4':[],'ELA Section 5':[],'ELA Section 6':[]}
sections = ['Section 1','Section 2','Section 3','Section 4','Section 5','Section 6']
for s in df_shuffle.index:
for sec in sections:
if df_shuffle.loc[s,'Grade Level']=='9th':
if stop==0:
if df_shuffle.loc[s,'Student'] not in ela1[sec]:
if len(ela1[sec]) < class_size_limit:
ela1[sec]+=[df_shuffle.loc[s,'Student']]
stop+=1
stop = 0
ela1 =pd.Series(ela1)
df_ela1 = pd.DataFrame({})
df_ela1 = pd.concat([df_ela1,ela1.to_frame().T],ignore_index=True)
df_ela1.to_csv('test.csv',index=False)
不幸的是,我生成的 DataFrame 由列表而不是学生的单个字符串组成:
ELA 第 1 部分 | ELA 第 2 部分 |
---|---|
[学生1,学生4...] | [10号学生,152号学生……] |
目前还没有办法阻止学生被编入与他们已经所在的部分冲突的部分。例如,我的代码必须防止学生 1 被放入代数 1 第 1 部分,因为它发生与 ELA 第 1 部分同一时期。
这让我觉得我应该按每个时期的班级部分(例如,所有 9 年级第 1 节课、所有 9 年级第 2 节课等)而不是每个班级类型的部分(例如,所有 ELA 课程、所有代数课程等)。
我感谢您提供的任何帮助或指导。
我认为最简单的方法是拥有一个数据框架,其中包含所有学生及其将参加的所有课程的信息。一旦您有了这样的数据框架,您就可以获得有关课程参加情况的任何信息,例如哪些学生参加“课程 1,第 1 部分”或某个学生参加哪些课程。 最终数据框将如下所示:
Student Name Grade course 1 course 2 course 3
3 Student 4 9 Section 1 Section 1 Section 1
18 Student 19 9 Section 1 Section 1 Section 1
21 Student 22 9 Section 1 Section 1 Section 1
24 Student 25 9 Section 1 Section 1 Section 1
37 Student 38 9 Section 1 Section 1 Section 1
41 Student 42 9 Section 1 Section 1 Section 1
42 Student 43 9 Section 1 Section 1 Section 1
94 Student 95 9 Section 1 Section 1 Section 1
您可以从那里获取参加课程 1 的学生的信息第 1 部分:
Student Name
3 Student 4
18 Student 19
21 Student 22
24 Student 25
37 Student 38
41 Student 42
42 Student 43
94 Student 95
代码
import pandas as pd
import random
#maximum number of grades
max_grade = 10
#create an example dataframe
students = pd.DataFrame({"Student Name": ["Student " + str(i+1) for i in range (100)], "Grade": [random.randint(1,
max_grade) for
i in range (100)]})
courses = ["course 1", "course 2", "course 3"]
sections = ['Section 1','Section 2','Section 3', "Section 4"]
grades = [i+1 for i in range(max_grade)]
class_size_limit = 30
#create columns with names of the courses and assign initial value "None"
for course in courses:
students[course] = "None"
#randomly assign students of grade 9 to different courses and different sections
for course in courses:
for sec in sections:
not_assigned_students = students[(students["Grade"] == 9) & (students[course] == "None")]
if class_size_limit < not_assigned_students.shape[0]:
sample_indexes = not_assigned_students.sample(n=class_size_limit).index
students.loc[sample_indexes, course] = sec
else:
sample_indexes = not_assigned_students.index
students.loc[sample_indexes, course] = sec
#get students assigned to the "Course1, Section 1"
students[students["course 1"]=="Section 1"][["Student Name"]]
#get number of students assigned to the "Course1, Section 1"
students[students["course 1"]=="Section 1"]["Student Name"].shape[0]