Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| import json | |
| import streamlit as st | |
| from ConsoleApp import main | |
| # from ConsoleApp import main_filter | |
| # from ConsoleApp import get_filter | |
| import sys | |
| import hashlib | |
| import json | |
| import ast | |
| import traceback | |
| import hashlib | |
| from PIL import Image | |
| from itertools import chain | |
| from bs4 import BeautifulSoup | |
| # from session_state import SessionState | |
| def load_file(df2, df_room): | |
| list_course = [] | |
| index_count_course_id = 0 | |
| list_prof = [] | |
| index_count_prof_id = 0 | |
| for index1, row1 in df2.iterrows(): | |
| if row1['Course_Name'] not in list_course: | |
| df2.at[index1, 'Course_id'] = index_count_course_id + 1 | |
| index_count_course_id += 1 | |
| list_course.append(row1['Course_Name']) | |
| else: | |
| df2.at[index1, 'Course_id'] = index_count_course_id | |
| if row1['Prof_Name'] not in list_prof: | |
| df2.at[index1, 'Prof_id'] = index_count_prof_id + 1 | |
| index_count_prof_id += 1 | |
| list_prof.append(row1['Prof_Name']) | |
| else: | |
| df2.at[index1, 'Prof_id'] = index_count_prof_id | |
| # create list of dictionaries representing each object in the JSON file | |
| objects = [] | |
| for index, row in df2.iterrows(): | |
| if row['Prof_id'] != '': | |
| # create professor object | |
| prof = { | |
| "prof": { | |
| "id": row['Prof_id'], | |
| "name": row['Prof_Name'] | |
| } | |
| } | |
| if prof not in objects: | |
| objects.append(prof) | |
| if row['Course_id'] != '': | |
| # create course object | |
| course = { | |
| "course": { | |
| "id": row['Course_id'], | |
| "name": row['Course_Name'] | |
| } | |
| } | |
| if course not in objects: | |
| objects.append(course) | |
| if row['Group_id'] != '': | |
| # create group object | |
| group = { | |
| "group": { | |
| "id": row['Group_id'], | |
| "size": row['Size_Course'] | |
| } | |
| } | |
| # if group not in objects: | |
| objects.append(group) | |
| if row['Prof_id'] != '' and row['Course_id'] != '': | |
| # create class object | |
| class_ = { | |
| "class": { | |
| "professor": row['Prof_id'], | |
| "course": row['Course_id'], | |
| "duration": row['Duration'], | |
| "group": row['Group_id'], | |
| "lab": row['Lab'] | |
| } | |
| } | |
| if class_ not in objects: | |
| objects.append(class_) | |
| for index, row in df_room.iterrows(): | |
| if row['Room'] != '': | |
| # create room object | |
| room = { | |
| "room": { | |
| "name": row['Room'], | |
| "lab": row['Lab'], | |
| "size": row['Size_Room'] | |
| } | |
| } | |
| objects.append(room) | |
| # create JSON object with list of objects | |
| json_data = json.dumps(objects, sort_keys=False) | |
| # write JSON object to file | |
| with open('GaSchedule1.json', 'w') as f: | |
| f.write(json_data) | |
| file_name = "/GaSchedule1.json" | |
| return file_name | |
| def for_stu(): | |
| df_stu = pd.read_csv("data_stu.csv") | |
| df_ctdt = pd.read_csv("ctdt_ds.csv") | |
| df_ctdt = df_ctdt[['MaMH', 'Course Name', 'Sem', 'Expect Year', 'Credits', 'Elective']] | |
| df_stu = df_stu[['MaSV', 'NHHK', 'HK', 'MaMH', 'TenMH', 'SoTinChi', 'DiemHP']] | |
| df_stu = df_stu.dropna() | |
| df_stu['NHHK'] = df_stu['NHHK'].astype(str).str[:-1] | |
| input = st.text_input("Type Student ID", value="") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| if input: | |
| # Convert 'DiemHP' column to numeric type, ignoring non-numeric values | |
| df_stu['DiemHP'] = pd.to_numeric(df_stu['DiemHP'], errors='coerce') | |
| list_subject_have_done = df_stu.loc[(df_stu['MaSV'].str.lower() == input.lower()) & (df_stu['DiemHP'].gt(50))] | |
| list_subject_have_done[''] = np.arange(1, len(list_subject_have_done) + 1) | |
| list_subject_have_done = list_subject_have_done.reindex(columns=['', 'MaMH', 'TenMH','HK', 'NHHK', 'SoTinChi']) | |
| list_subject_have_done = list_subject_have_done.rename(columns={'NHHK': 'Actual Year', 'HK': 'Sem', 'TenMH': 'Course Name', 'SoTinChi': 'Credits'}) | |
| with st.expander("List of subjects have done"): | |
| st.dataframe(list_subject_have_done.set_index('')) | |
| with col2: | |
| if input: | |
| list_subject_havent_done_yet = df_ctdt[~df_ctdt['MaMH'].isin(list_subject_have_done['MaMH'])] | |
| list_subject_havent_done_yet['Expect Year'] = list_subject_havent_done_yet['Expect Year'].astype(str) | |
| list_subject_havent_done_yet['Elective'] = list_subject_havent_done_yet['Elective'].astype(bool) | |
| list_subject_havent_done_yet[''] = np.arange(1, len(list_subject_havent_done_yet) + 1) | |
| list_subject_havent_done_yet = list_subject_havent_done_yet.reindex(columns=['', 'MaMH', 'Course Name', 'Credits', 'Elective', 'Expect Year', 'Sem']) | |
| with st.expander("List of subjects haven't done yet"): | |
| st.dataframe(list_subject_havent_done_yet.set_index('')) | |
| with col3: | |
| if input: | |
| df_unique = df2[df2['Group_Lab'] == 1.0] | |
| df_unique = df_unique[['MaMH', 'Course_Name', 'Prof_Name', 'Duration', 'Group_Lab', 'Size_Course']] | |
| list_recommend_subjects = df_unique[df_unique['MaMH'].isin(list_subject_havent_done_yet['MaMH'])] | |
| list_recommend_subjects[''] = np.arange(1, len(list_recommend_subjects) + 1) | |
| list_recommend_subjects = list_recommend_subjects.reindex(columns=['', 'MaMH', 'Course_Name', 'Prof_Name', 'Duration', 'Group_Lab', 'Size_Course']) | |
| with st.expander("List of recommend subjects in this semester"): | |
| st.dataframe(list_recommend_subjects.set_index('')) | |
| def get_filter(html, list_filter): | |
| # Parse the HTML | |
| soup = BeautifulSoup(html, 'html.parser') | |
| # Find all div elements with id starting with 'room_' | |
| div_elements = soup.find_all('div', id=lambda x: x and x.startswith('room_')) | |
| # Filter and display the schedule for specific rooms | |
| filtered = "" | |
| for div in div_elements: | |
| room_id = div['id'].replace('room_', '') # Extract the room ID from the div's id attribute | |
| if room_id in list_filter: | |
| filtered += str(div) | |
| return filtered | |
| def data_display(): | |
| uploaded_file = st.file_uploader('') | |
| if uploaded_file is not None: | |
| df = pd.read_csv(uploaded_file) | |
| else: | |
| df = [['Data Mining', 1, 35, 4, 'Nguyen Thi Thanh Sang', 'IT132IU'], | |
| ['Analytics for Observational Data', 2, 35, 4, 'Nguyen Thi Thanh Sang', 'IT142IU'], | |
| ['Fundamentals of Programming', 0, 90, 3, 'Dao Tran Hoang Chau', 'IT149IU'], | |
| ['Object-Oriented Analysis and Design', 0, 90, 4, 'Ha Viet Uyen Synh', 'IT090IU']] | |
| room_columns = ['TenMH', 'ToTH', 'TongSoSV', 'SoTiet', 'TenDayDuNV', 'MaMH'] | |
| df = pd.DataFrame(df, columns=room_columns) | |
| df1 = df[['TenMH', 'ToTH', 'TongSoSV', 'SoTiet', 'TenDayDuNV', 'MaMH']] | |
| df1 = df1.rename(columns={'TenMH': 'Course_Name', 'ToTH': 'Group_Lab', 'TongSoSV': 'Size_Course', 'SoTiet': 'Duration', 'TenDayDuNV': 'Prof_Name', 'MaMH': 'MaMH'}) | |
| df1['Lab'] = df1['Group_Lab'] | |
| # df1['Lab'] = df1['Lab'].astype(str) | |
| for index, row in df1.iterrows(): | |
| if row['Lab'] == 1 or row['Lab'] == 2 or row['Lab'] == 3 or row['Lab'] == 4: | |
| df1.at[index, 'Lab'] = 'True' | |
| else: | |
| df1.at[index, 'Lab'] = '' | |
| df1['Lab'] = df1['Lab'].astype(bool) | |
| ## create default room | |
| room_default = [['A1.309', 90, 0], | |
| ['L107', 90, 0], | |
| ['LA1.605', 60, 1], | |
| ['La1.607', 60, 1] | |
| ] | |
| room_columns = ['Room', 'Size_Room', 'Lab'] | |
| df_room = pd.DataFrame(room_default, columns=room_columns) | |
| df_room['Lab'] = df_room['Lab'].astype(str) | |
| for index, row in df_room.iterrows(): | |
| if row['Lab'] == '1': | |
| df_room.at[index, 'Lab'] = 'True' | |
| else: | |
| df_room.at[index, 'Lab'] = '' | |
| df_room['Lab'] = df_room['Lab'].astype(bool) | |
| # col1, col2, col3, col4 = st.columns([0.5,7,2.4,0.5]) | |
| col1, col2 = st.columns([9,4]) | |
| with col1: | |
| df2 = st.experimental_data_editor(df1, num_rows="dynamic") | |
| df2['Size_Course'] = df2['Size_Course'].astype(int) | |
| df2['Duration'] = df2['Duration'].astype(int) | |
| df2['Group_id'] = np.arange(1, len(df2) + 1) | |
| df_prof_filter = df2['Prof_Name'].drop_duplicates().tolist() | |
| with col2: | |
| df_room = st.experimental_data_editor(df_room, num_rows="dynamic") | |
| df_room['Size_Room'] = df_room['Size_Room'].astype(int) | |
| filter = df_room['Room'].to_list() | |
| # df_room_filter = df_room[df_room['Room'].isin(list_filter)] | |
| return df2, df_room, filter, df_prof_filter | |
| st.set_page_config(layout="wide") | |
| if __name__ == "__main__": | |
| st.markdown("<h1 style='text-align: center; color: white;'>Time Scheduling Engine</h1>", unsafe_allow_html=True) | |
| image = Image.open('logo-vector-IU-01.png') | |
| st.sidebar.image(image, width=240) | |
| tab1, tab2 = st.tabs(["Schedule", "Student"]) | |
| with tab1: | |
| df2, df_room, filter, df_prof_filter = data_display() | |
| file_name = load_file(df2, df_room) | |
| # html_result_filter = main_filter(file_name) | |
| html_result = main(file_name) | |
| if 'html_result' not in st.session_state: | |
| st.session_state.html_result = [] | |
| list_room_filter = st.sidebar.multiselect('Room Filter', filter, filter) | |
| # list_prof_filter = st.sidebar.multiselect('Prof Filter', df_prof_filter, df_prof_filter) | |
| if st.button('Generate'): | |
| st.session_state.html_result = html_result | |
| st.markdown(st.session_state.html_result, unsafe_allow_html=True) | |
| if st.sidebar.button('Room Filter'): | |
| filtered1 = get_filter(st.session_state.html_result, list_room_filter) | |
| st.markdown(filtered1, unsafe_allow_html=True) | |
| # if len(sys.argv) > 1: | |
| # file_name = sys.argv[1] | |
| # try: | |
| # if st.button('Generate'): | |
| # temp = session_state['html_result'] | |
| # filtered1 = get_filter(temp, list_filter) | |
| # st.markdown(filtered1, unsafe_allow_html=True) | |
| # except: | |
| # traceback.print_exc() | |
| with tab2: | |
| for_stu() | |