Мой школьный округ попросил меня запланировать учащихся на факультативные занятия в следующем году в зависимости от их уровня обучения. К сожалению, у нас нет доступа к некоторым удобным приложениям для планирования, которые могут делать это автоматически. Вместо того чтобы вручную записывать каждого студента, я решил попробовать использовать Python. Раньше я писал код, чтобы ускорить некоторые задачи администрирования низкого уровня, но это оказалось гораздо сложнее, чем я ожидал.
Мой код должен сделать следующее:
Вот пример вывода, который я хотел бы увидеть:
Вот еще один формат, который может создать мой код:
У меня есть CSV из 500 учеников (имена заменены на «Студент X» по соображениям конфиденциальности) и соответствующий им уровень успеваемости. Я преобразовал этот CSV в DataFrame Pandas и написал следующий код. Я пошел в том направлении, чтобы превратить каждый курс (например, «Английский 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 состоит из списков, а не отдельных строк студентов:
В настоящее время также нет способа предотвратить попадание студента в раздел, который конфликтует с разделом, в котором он уже находится. Например, мой код должен предотвратить помещение Студента 1 в Раздел 1 Алгебры 1, потому что это происходит во время тот же период, что и Раздел 1 ELA.
Это заставляет меня думать, что мне следует организовать свою серию Pandas по разделам класса в каждом периоде (например, все классы 1-го класса для 9-го класса, все классы для 2-го класса для 9-го класса и т. д.), а не по разделам в каждом типе урока (например, все классы 9-го класса). курсы 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]
Отлично! Я не думал превращать весь курс в столбец DataFrame. Ваш код также помог мне узнать больше о DataFrames в целом. Спасибо!
это действительно интересный способ писать
df_ela1 = pd.DataFrame(ela1)