TimeTable / timetable.py
aneesqumar's picture
Update timetable.py
acffcd2 verified
Raw
History Blame Contribute Delete
2.34 kB
import pandas as pd
import random
from collections import defaultdict
TIME_SLOTS = ["9:00-10:30", "10:30-12:00", "12:00-1:30", "1:30-3:00"]
DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
def generate_timetable(courses_file, rooms_file):
courses_df = pd.read_csv(courses_file, skipinitialspace=True)
courses_df.columns = courses_df.columns.str.strip()
rooms_df = pd.read_csv(rooms_file, skipinitialspace=True)
rooms_df.columns = rooms_df.columns.str.strip()
rooms_list = rooms_df["Room"].tolist()
timetable_dict = {}
for cls in courses_df["Class"].unique():
cls_courses = courses_df[courses_df["Class"] == cls].copy()
# Prepare empty timetable
timetable = {day: {slot: None for slot in TIME_SLOTS} for day in DAYS}
# Keep track of teacher and room occupancy to avoid conflicts
teacher_schedule = {day: [] for day in DAYS}
room_schedule = {day: [] for day in DAYS}
for idx, row in cls_courses.iterrows():
course = row["Course"]
hours = int(row["Hours"])
teacher = row["Teacher"]
# How many 1.5-hour slots required
slots_needed = hours // 1.5
if hours % 1.5 != 0:
slots_needed += 1
slots_assigned = 0
attempts = 0
while slots_assigned < slots_needed and attempts < 100:
day = random.choice(DAYS)
slot = random.choice(TIME_SLOTS)
# Check conflicts
if timetable[day][slot] is None and teacher not in teacher_schedule[day] and len(room_schedule[day]) < len(rooms_list):
room = random.choice([r for r in rooms_list if r not in room_schedule[day]])
timetable[day][slot] = {
"Course": course,
"Teacher": teacher,
"Room": room
}
teacher_schedule[day].append(teacher)
room_schedule[day].append(room)
slots_assigned += 1
attempts += 1
timetable_dict[cls] = timetable
return timetable_dict