Spaces:
Sleeping
Sleeping
Upload 12 files
Browse files- ConsoleApp.py +23 -0
- GaSchedule.json +29 -0
- GaSchedule1.json +317 -0
- HtmlOutput.py +181 -0
- LICENSE +21 -0
- ctdt_ds.csv +58 -0
- data_stu.csv +0 -0
- logo-vector-IU-01.png +0 -0
- processing.py +271 -0
- reprocessing.ipynb +589 -0
- requirements.txt +5 -0
- session_state.py +105 -0
ConsoleApp.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pathlib
|
| 2 |
+
import time
|
| 3 |
+
from model.Configuration import Configuration
|
| 4 |
+
from algorithm.NsgaII import NsgaII
|
| 5 |
+
import streamlit as st
|
| 6 |
+
|
| 7 |
+
from HtmlOutput import HtmlOutput
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
def main(file_name):
|
| 11 |
+
start_time = int(round(time.time() * 1000))
|
| 12 |
+
configuration = Configuration()
|
| 13 |
+
target_file = str(pathlib.Path().absolute()) + file_name
|
| 14 |
+
configuration.parseFile(target_file)
|
| 15 |
+
alg = NsgaII(configuration)
|
| 16 |
+
# alg = Hgasso(configuration)
|
| 17 |
+
alg.run()
|
| 18 |
+
html_result = HtmlOutput.getResult(alg.result)
|
| 19 |
+
# st.markdown(html_result, unsafe_allow_html=True)
|
| 20 |
+
seconds = (int(round(time.time() * 1000)) - start_time) / 1000.0
|
| 21 |
+
st.write("\nCompleted in {} secs.\n".format(seconds))
|
| 22 |
+
return html_result
|
| 23 |
+
|
GaSchedule.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"prof": {
|
| 4 |
+
"id": 84,
|
| 5 |
+
"name": "Le Hai Duong"
|
| 6 |
+
}
|
| 7 |
+
},
|
| 8 |
+
{
|
| 9 |
+
"course": {
|
| 10 |
+
"id": 1,
|
| 11 |
+
"name": "Operating Systems"
|
| 12 |
+
}
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"group": {
|
| 16 |
+
"id": 1,
|
| 17 |
+
"size": 80
|
| 18 |
+
}
|
| 19 |
+
},
|
| 20 |
+
{
|
| 21 |
+
"class": {
|
| 22 |
+
"professor": 84,
|
| 23 |
+
"course": 1,
|
| 24 |
+
"duration": 3,
|
| 25 |
+
"group": 1,
|
| 26 |
+
"lab": false
|
| 27 |
+
}
|
| 28 |
+
}
|
| 29 |
+
]
|
GaSchedule1.json
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"prof": {
|
| 4 |
+
"id": 174,
|
| 5 |
+
"name": "Dao Tran Hoang Chau"
|
| 6 |
+
}
|
| 7 |
+
},
|
| 8 |
+
{
|
| 9 |
+
"course": {
|
| 10 |
+
"id": 1,
|
| 11 |
+
"name": "Functional Programming"
|
| 12 |
+
}
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"group": {
|
| 16 |
+
"id": 1,
|
| 17 |
+
"size": 10
|
| 18 |
+
}
|
| 19 |
+
},
|
| 20 |
+
{
|
| 21 |
+
"class": {
|
| 22 |
+
"professor": 174,
|
| 23 |
+
"course": 1,
|
| 24 |
+
"duration": 3,
|
| 25 |
+
"group": 1,
|
| 26 |
+
"lab": false
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
"prof": {
|
| 31 |
+
"id": 119,
|
| 32 |
+
"name": "Tran Manh Ha"
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"course": {
|
| 37 |
+
"id": 2,
|
| 38 |
+
"name": "Operating Systems"
|
| 39 |
+
}
|
| 40 |
+
},
|
| 41 |
+
{
|
| 42 |
+
"group": {
|
| 43 |
+
"id": 2,
|
| 44 |
+
"size": 90
|
| 45 |
+
}
|
| 46 |
+
},
|
| 47 |
+
{
|
| 48 |
+
"class": {
|
| 49 |
+
"professor": 119,
|
| 50 |
+
"course": 2,
|
| 51 |
+
"duration": 3,
|
| 52 |
+
"group": 2,
|
| 53 |
+
"lab": false
|
| 54 |
+
}
|
| 55 |
+
},
|
| 56 |
+
{
|
| 57 |
+
"group": {
|
| 58 |
+
"id": 3,
|
| 59 |
+
"size": 30
|
| 60 |
+
}
|
| 61 |
+
},
|
| 62 |
+
{
|
| 63 |
+
"class": {
|
| 64 |
+
"professor": 119,
|
| 65 |
+
"course": 2,
|
| 66 |
+
"duration": 4,
|
| 67 |
+
"group": 3,
|
| 68 |
+
"lab": true
|
| 69 |
+
}
|
| 70 |
+
},
|
| 71 |
+
{
|
| 72 |
+
"prof": {
|
| 73 |
+
"id": 213,
|
| 74 |
+
"name": "Nguyen Tien Dung"
|
| 75 |
+
}
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
"group": {
|
| 79 |
+
"id": 4,
|
| 80 |
+
"size": 30
|
| 81 |
+
}
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"class": {
|
| 85 |
+
"professor": 213,
|
| 86 |
+
"course": 2,
|
| 87 |
+
"duration": 4,
|
| 88 |
+
"group": 4,
|
| 89 |
+
"lab": true
|
| 90 |
+
}
|
| 91 |
+
},
|
| 92 |
+
{
|
| 93 |
+
"group": {
|
| 94 |
+
"id": 5,
|
| 95 |
+
"size": 30
|
| 96 |
+
}
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
"class": {
|
| 100 |
+
"professor": 213,
|
| 101 |
+
"course": 2,
|
| 102 |
+
"duration": 4,
|
| 103 |
+
"group": 5,
|
| 104 |
+
"lab": true
|
| 105 |
+
}
|
| 106 |
+
},
|
| 107 |
+
{
|
| 108 |
+
"prof": {
|
| 109 |
+
"id": 74,
|
| 110 |
+
"name": "Nguyen Van Sinh"
|
| 111 |
+
}
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"course": {
|
| 115 |
+
"id": 3,
|
| 116 |
+
"name": "IT Project Management"
|
| 117 |
+
}
|
| 118 |
+
},
|
| 119 |
+
{
|
| 120 |
+
"group": {
|
| 121 |
+
"id": 6,
|
| 122 |
+
"size": 35
|
| 123 |
+
}
|
| 124 |
+
},
|
| 125 |
+
{
|
| 126 |
+
"class": {
|
| 127 |
+
"professor": 74,
|
| 128 |
+
"course": 3,
|
| 129 |
+
"duration": 3,
|
| 130 |
+
"group": 6,
|
| 131 |
+
"lab": false
|
| 132 |
+
}
|
| 133 |
+
},
|
| 134 |
+
{
|
| 135 |
+
"group": {
|
| 136 |
+
"id": 7,
|
| 137 |
+
"size": 35
|
| 138 |
+
}
|
| 139 |
+
},
|
| 140 |
+
{
|
| 141 |
+
"class": {
|
| 142 |
+
"professor": 74,
|
| 143 |
+
"course": 3,
|
| 144 |
+
"duration": 4,
|
| 145 |
+
"group": 7,
|
| 146 |
+
"lab": true
|
| 147 |
+
}
|
| 148 |
+
},
|
| 149 |
+
{
|
| 150 |
+
"prof": {
|
| 151 |
+
"id": 84,
|
| 152 |
+
"name": "Le Hai Duong"
|
| 153 |
+
}
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"course": {
|
| 157 |
+
"id": 4,
|
| 158 |
+
"name": "Introduction to Computing"
|
| 159 |
+
}
|
| 160 |
+
},
|
| 161 |
+
{
|
| 162 |
+
"group": {
|
| 163 |
+
"id": 8,
|
| 164 |
+
"size": 35
|
| 165 |
+
}
|
| 166 |
+
},
|
| 167 |
+
{
|
| 168 |
+
"class": {
|
| 169 |
+
"professor": 84,
|
| 170 |
+
"course": 4,
|
| 171 |
+
"duration": 3,
|
| 172 |
+
"group": 8,
|
| 173 |
+
"lab": false
|
| 174 |
+
}
|
| 175 |
+
},
|
| 176 |
+
{
|
| 177 |
+
"prof": {
|
| 178 |
+
"id": 19,
|
| 179 |
+
"name": "Huynh Kha Tu"
|
| 180 |
+
}
|
| 181 |
+
},
|
| 182 |
+
{
|
| 183 |
+
"course": {
|
| 184 |
+
"id": 5,
|
| 185 |
+
"name": "Digital Logic Design"
|
| 186 |
+
}
|
| 187 |
+
},
|
| 188 |
+
{
|
| 189 |
+
"group": {
|
| 190 |
+
"id": 9,
|
| 191 |
+
"size": 90
|
| 192 |
+
}
|
| 193 |
+
},
|
| 194 |
+
{
|
| 195 |
+
"class": {
|
| 196 |
+
"professor": 19,
|
| 197 |
+
"course": 5,
|
| 198 |
+
"duration": 3,
|
| 199 |
+
"group": 9,
|
| 200 |
+
"lab": false
|
| 201 |
+
}
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"prof": {
|
| 205 |
+
"id": 182,
|
| 206 |
+
"name": "Tran Thanh Tung"
|
| 207 |
+
}
|
| 208 |
+
},
|
| 209 |
+
{
|
| 210 |
+
"course": {
|
| 211 |
+
"id": 6,
|
| 212 |
+
"name": "Object-Oriented Programming"
|
| 213 |
+
}
|
| 214 |
+
},
|
| 215 |
+
{
|
| 216 |
+
"group": {
|
| 217 |
+
"id": 10,
|
| 218 |
+
"size": 90
|
| 219 |
+
}
|
| 220 |
+
},
|
| 221 |
+
{
|
| 222 |
+
"class": {
|
| 223 |
+
"professor": 182,
|
| 224 |
+
"course": 6,
|
| 225 |
+
"duration": 3,
|
| 226 |
+
"group": 10,
|
| 227 |
+
"lab": false
|
| 228 |
+
}
|
| 229 |
+
},
|
| 230 |
+
{
|
| 231 |
+
"group": {
|
| 232 |
+
"id": 11,
|
| 233 |
+
"size": 30
|
| 234 |
+
}
|
| 235 |
+
},
|
| 236 |
+
{
|
| 237 |
+
"class": {
|
| 238 |
+
"professor": 213,
|
| 239 |
+
"course": 6,
|
| 240 |
+
"duration": 4,
|
| 241 |
+
"group": 11,
|
| 242 |
+
"lab": true
|
| 243 |
+
}
|
| 244 |
+
},
|
| 245 |
+
{
|
| 246 |
+
"group": {
|
| 247 |
+
"id": 12,
|
| 248 |
+
"size": 30
|
| 249 |
+
}
|
| 250 |
+
},
|
| 251 |
+
{
|
| 252 |
+
"class": {
|
| 253 |
+
"professor": 213,
|
| 254 |
+
"course": 6,
|
| 255 |
+
"duration": 4,
|
| 256 |
+
"group": 12,
|
| 257 |
+
"lab": true
|
| 258 |
+
}
|
| 259 |
+
},
|
| 260 |
+
{
|
| 261 |
+
"group": {
|
| 262 |
+
"id": 13,
|
| 263 |
+
"size": 30
|
| 264 |
+
}
|
| 265 |
+
},
|
| 266 |
+
{
|
| 267 |
+
"class": {
|
| 268 |
+
"professor": 213,
|
| 269 |
+
"course": 6,
|
| 270 |
+
"duration": 4,
|
| 271 |
+
"group": 13,
|
| 272 |
+
"lab": true
|
| 273 |
+
}
|
| 274 |
+
},
|
| 275 |
+
{
|
| 276 |
+
"room": {
|
| 277 |
+
"name": "A1.309",
|
| 278 |
+
"lab": false,
|
| 279 |
+
"size": "90"
|
| 280 |
+
}
|
| 281 |
+
},
|
| 282 |
+
{
|
| 283 |
+
"room": {
|
| 284 |
+
"name": "L107",
|
| 285 |
+
"lab": false,
|
| 286 |
+
"size": 40
|
| 287 |
+
}
|
| 288 |
+
},
|
| 289 |
+
{
|
| 290 |
+
"room": {
|
| 291 |
+
"name": "A2.401",
|
| 292 |
+
"lab": false,
|
| 293 |
+
"size": 40
|
| 294 |
+
}
|
| 295 |
+
},
|
| 296 |
+
{
|
| 297 |
+
"room": {
|
| 298 |
+
"name": "LA1.605",
|
| 299 |
+
"lab": true,
|
| 300 |
+
"size": 35
|
| 301 |
+
}
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"room": {
|
| 305 |
+
"name": "LA1.607",
|
| 306 |
+
"lab": true,
|
| 307 |
+
"size": 35
|
| 308 |
+
}
|
| 309 |
+
},
|
| 310 |
+
{
|
| 311 |
+
"room": {
|
| 312 |
+
"name": "La1.606",
|
| 313 |
+
"lab": true,
|
| 314 |
+
"size": 35
|
| 315 |
+
}
|
| 316 |
+
}
|
| 317 |
+
]
|
HtmlOutput.py
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from model.Constant import Constant
|
| 2 |
+
from model.Reservation import Reservation
|
| 3 |
+
from collections import defaultdict
|
| 4 |
+
import streamlit as st
|
| 5 |
+
import json
|
| 6 |
+
class HtmlOutput:
|
| 7 |
+
ROOM_COLUMN_NUMBER = Constant.DAYS_NUM + 1
|
| 8 |
+
ROOM_ROW_NUMBER = Constant.DAY_HOURS + 1
|
| 9 |
+
# COLOR1 = "#319378"
|
| 10 |
+
# COLOR2 = "#CE0000"
|
| 11 |
+
CRITERIAS = ('R', 'S', 'L', 'P', 'G')
|
| 12 |
+
# CRITERIAS_DESCR = ("Current room has {any}overlapping", "Current room has {any}enough seats",
|
| 13 |
+
# "Current room with {any}enough computers if they are required",
|
| 14 |
+
# "Professors have {any}overlapping classes", "Student groups has {any}overlapping classes")
|
| 15 |
+
PERIODS = (
|
| 16 |
+
"","8 - 8h50", "8h50 - 9h40", "9h40 - 10h30", "10h35 - 11h25", "11h25 - 12h15", "12h15 - 13h05", "13h15 - 14h05", "14h05 - 14h55", "14h55 - 15h45", "15h50 - 16h40", "16h40 - 17h30")
|
| 17 |
+
WEEK_DAYS = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
|
| 18 |
+
|
| 19 |
+
@staticmethod
|
| 20 |
+
def getCourseClass(cc, criterias, ci):
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
sb = []
|
| 26 |
+
sb.append(" <span style='color:#00FFFF' title=''> <b>MH: <b/> </span>")
|
| 27 |
+
sb.append(cc.Course.Name)
|
| 28 |
+
sb.append("<br /> <span style='color:#00FFFF' title=''> <b>GV: <b/> </span>")
|
| 29 |
+
sb.append(cc.Professor.Name)
|
| 30 |
+
sb.append("<br /> <span style='color:#00FFFF' title=''> <b>Room: <b/> </span>")
|
| 31 |
+
# sb.append(room.Name)
|
| 32 |
+
# sb.append("/".join(map(lambda grp: grp.Name, cc.Groups)),)
|
| 33 |
+
|
| 34 |
+
if cc.LabRequired:
|
| 35 |
+
sb.append(" <br /><span style='color:#00FFFF' title=''> <b>Lab <b/> </span>")
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
return sb
|
| 39 |
+
|
| 40 |
+
@staticmethod
|
| 41 |
+
def generateTimeTable(solution, slot_table):
|
| 42 |
+
ci = 0
|
| 43 |
+
|
| 44 |
+
time_table = defaultdict(list)
|
| 45 |
+
items = solution.classes.items
|
| 46 |
+
ROOM_COLUMN_NUMBER = HtmlOutput.ROOM_COLUMN_NUMBER
|
| 47 |
+
getCourseClass = HtmlOutput.getCourseClass
|
| 48 |
+
|
| 49 |
+
for cc, reservation_index in items():
|
| 50 |
+
reservation = Reservation.parse(reservation_index)
|
| 51 |
+
# coordinate of time-space slot
|
| 52 |
+
dayId = reservation.Day + 1
|
| 53 |
+
dur = cc.Duration
|
| 54 |
+
periodId = reservation.Time + 1
|
| 55 |
+
if dur == 3:
|
| 56 |
+
if 3 < periodId <= 6:
|
| 57 |
+
periodId = 4
|
| 58 |
+
elif 1 <= periodId <= 3:
|
| 59 |
+
periodId = 1
|
| 60 |
+
else:
|
| 61 |
+
periodId = 7
|
| 62 |
+
elif dur == 4 or dur == 5:
|
| 63 |
+
if periodId <= 6:
|
| 64 |
+
periodId = 1
|
| 65 |
+
else:
|
| 66 |
+
periodId = 7
|
| 67 |
+
else:
|
| 68 |
+
periodId = 1
|
| 69 |
+
roomId = reservation.Room
|
| 70 |
+
key = (periodId, roomId)
|
| 71 |
+
|
| 72 |
+
if key in slot_table:
|
| 73 |
+
room_duration = slot_table[key]
|
| 74 |
+
else:
|
| 75 |
+
room_duration = ROOM_COLUMN_NUMBER * [0]
|
| 76 |
+
slot_table[key] = room_duration
|
| 77 |
+
room_duration[dayId] = dur
|
| 78 |
+
|
| 79 |
+
for m in range(1, dur):
|
| 80 |
+
next_key = (periodId + m, roomId)
|
| 81 |
+
if next_key not in slot_table:
|
| 82 |
+
slot_table[next_key] = ROOM_COLUMN_NUMBER * [0]
|
| 83 |
+
if slot_table[next_key][dayId] < 1:
|
| 84 |
+
slot_table[next_key][dayId] = -1
|
| 85 |
+
|
| 86 |
+
if key in time_table:
|
| 87 |
+
room_schedule = time_table[key]
|
| 88 |
+
else:
|
| 89 |
+
room_schedule = ROOM_COLUMN_NUMBER * [None]
|
| 90 |
+
time_table[key] = room_schedule
|
| 91 |
+
|
| 92 |
+
room_schedule[dayId] = "".join(getCourseClass(cc, solution.criteria, ci))
|
| 93 |
+
ci += len(HtmlOutput.CRITERIAS)
|
| 94 |
+
return time_table
|
| 95 |
+
|
| 96 |
+
@staticmethod
|
| 97 |
+
def getHtmlCell(content, rowspan):
|
| 98 |
+
if rowspan == 0:
|
| 99 |
+
return "<td></td>"
|
| 100 |
+
|
| 101 |
+
if content is None:
|
| 102 |
+
return ""
|
| 103 |
+
sb = []
|
| 104 |
+
if rowspan > 1:
|
| 105 |
+
sb.append("<td style='border: .25em solid white; padding: .25em' rowspan='")
|
| 106 |
+
sb.append(rowspan)
|
| 107 |
+
sb.append("'>")
|
| 108 |
+
else:
|
| 109 |
+
sb.append("<td style='border: .25em solid white; padding: .25em'>")
|
| 110 |
+
sb.append(content)
|
| 111 |
+
sb.append("</td>")
|
| 112 |
+
return "".join(str(v) for v in sb)
|
| 113 |
+
|
| 114 |
+
@staticmethod
|
| 115 |
+
def getResult(solution):
|
| 116 |
+
configuration = solution.configuration
|
| 117 |
+
nr = configuration.numberOfRooms
|
| 118 |
+
getRoomById = configuration.getRoomById
|
| 119 |
+
|
| 120 |
+
slot_table = defaultdict(list)
|
| 121 |
+
time_table = HtmlOutput.generateTimeTable(solution, slot_table) # Tuple[0] = time, Tuple[1] = roomId
|
| 122 |
+
# st.markdown(slot_table)
|
| 123 |
+
if not slot_table or not time_table:
|
| 124 |
+
return ""
|
| 125 |
+
|
| 126 |
+
sb = []
|
| 127 |
+
for roomId in range(nr):
|
| 128 |
+
temp = []
|
| 129 |
+
room = getRoomById(roomId)
|
| 130 |
+
for periodId in range(HtmlOutput.ROOM_ROW_NUMBER):
|
| 131 |
+
if periodId == 0:
|
| 132 |
+
temp.append("<div id='room_")
|
| 133 |
+
temp.append(room.Name)
|
| 134 |
+
temp.append("' style='padding: 0.5em'>\n")
|
| 135 |
+
temp.append("<table style=' border: .25em solid white; text-align: center; width: 100%'>\n")
|
| 136 |
+
temp.append(HtmlOutput.getTableHeader(room))
|
| 137 |
+
else:
|
| 138 |
+
key = (periodId, roomId)
|
| 139 |
+
room_duration = slot_table[key] if key in slot_table.keys() else None
|
| 140 |
+
room_schedule = time_table[key] if key in time_table.keys() else None
|
| 141 |
+
temp.append("<tr>")
|
| 142 |
+
for dayId in range(HtmlOutput.ROOM_COLUMN_NUMBER):
|
| 143 |
+
if dayId == 0:
|
| 144 |
+
temp.append("<th style='color: #00FFFF; border: .25em solid white; text-align: center; padding: .25em' scope='row' colspan='2'>")
|
| 145 |
+
temp.append(HtmlOutput.PERIODS[periodId])
|
| 146 |
+
temp.append("</th>\n")
|
| 147 |
+
continue
|
| 148 |
+
|
| 149 |
+
if room_schedule is None and room_duration is None:
|
| 150 |
+
continue
|
| 151 |
+
|
| 152 |
+
content = room_schedule[dayId] if room_schedule is not None else None
|
| 153 |
+
temp.append(HtmlOutput.getHtmlCell(content, room_duration[dayId]))
|
| 154 |
+
temp.append("</tr>\n")
|
| 155 |
+
|
| 156 |
+
if periodId == HtmlOutput.ROOM_ROW_NUMBER - 1:
|
| 157 |
+
temp.append("</table>\n</div>\n")
|
| 158 |
+
temp = json.dumps(temp).replace(" <b>Room: <b/> </span>", "<b> <b>Room: <b/> </span>{}".format(room.Name))
|
| 159 |
+
temp = json.loads(temp)
|
| 160 |
+
sb = sb + temp
|
| 161 |
+
return "".join(str(v) for v in sb)
|
| 162 |
+
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
@staticmethod
|
| 166 |
+
def getTableHeader(room):
|
| 167 |
+
sb = ["<tr><th style='color:#00FFFF; border: .25em solid white' scope='col' colspan='2'>Room: ", room.Name, "</th>\n"]
|
| 168 |
+
for weekDay in HtmlOutput.WEEK_DAYS:
|
| 169 |
+
sb.append("<th style='color: #00FFFF; border: .25em solid white; padding: .25em; width: 15%; text-align: center' scope='col' rowspan='2'>")
|
| 170 |
+
sb.append(weekDay)
|
| 171 |
+
sb.append("</th>\n")
|
| 172 |
+
sb.append("</tr>\n")
|
| 173 |
+
sb.append("<tr>\n")
|
| 174 |
+
sb.append("<th style='color:#00FFFF; border: .25em solid white; padding: .25em'>Lab: ")
|
| 175 |
+
sb.append("Yes" if room.Lab else "No")
|
| 176 |
+
sb.append("</th>\n")
|
| 177 |
+
sb.append("<th style='color:#00FFFF; border: .25em solid white; padding: .25em'>Seats: ")
|
| 178 |
+
sb.append(room.NumberOfSeats)
|
| 179 |
+
sb.append("</th>\n")
|
| 180 |
+
sb.append("</tr>\n")
|
| 181 |
+
return "".join(str(v) for v in sb)
|
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2020 Miller Cy Chan
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
ctdt_ds.csv
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
STT,MaMH,Course Name,Credits,Số TCHP,Expect Year,Sem,Elective,Đã học
|
| 2 |
+
1,EN072IU,Reading & Writing IE1,11,11,2019,1,FALSE,X
|
| 3 |
+
2,EN073IU,Listening & Speaking IE1,11,11,2019,1,FALSE,X
|
| 4 |
+
3,PT001IU,Physical Training 1,3,3,2019,1,FALSE,X
|
| 5 |
+
4,EN074IU,Reading & Writing IE2,8,8,2019,2,FALSE,X
|
| 6 |
+
5,EN075IU,Listening & Speaking IE2,8,8,2019,2,FALSE,X
|
| 7 |
+
6,PT002IU,Physical Training 2,3,3,2019,2,FALSE,X
|
| 8 |
+
7,IT149IU,Fundamentals of Programming,4,4,2019,2,FALSE,IT116IU
|
| 9 |
+
8,MA001IU,Calculus 1,4,4,2019,3,FALSE,X
|
| 10 |
+
9,IT135IU,Introduction to Data Science,3,3,2019,3,FALSE,X
|
| 11 |
+
10,PE015IU,Philosophy of Marxism and Leninism,3,3,2019,3,FALSE,X
|
| 12 |
+
11,PE016IU,Political economics of Marxism and Leninism,2,2,2019,3,FALSE,X
|
| 13 |
+
12,CH011IU,Chemistry for Engineers,3,3,2020,1,FALSE,X
|
| 14 |
+
13,IT069IU,Object-Oriented Programming,4,4,2020,1,FALSE,X
|
| 15 |
+
14,PE017IU,Scientific socialism,2,2,2020,1,FALSE,X
|
| 16 |
+
15,CH012IU,Chemistry Laboratory,1,1,2020,1,FALSE,X
|
| 17 |
+
16,PH013IU,Physics 1,2,2,2020,1,FALSE,X
|
| 18 |
+
17,MA003IU,Calculus 2,4,4,2020,1,FALSE,X
|
| 19 |
+
18,IT137IU,Data Analysis,4,4,2020,1,FALSE,X
|
| 20 |
+
19,IT013IU,Algorithms & Data Structures,4,4,2020,2,FALSE,X
|
| 21 |
+
20,IT090IU,Object-Oriented Analysis and Design,4,4,2020,2,FALSE,X
|
| 22 |
+
21,IT079IU,Principles of Database Management,4,4,2020,2,FALSE,X
|
| 23 |
+
22,IT136IU,Regression Analysis,4,4,2020,2,FALSE,X
|
| 24 |
+
23,IT138IU,Data Science and Data Visualization,4,4,2020,2,FALSE,X
|
| 25 |
+
24,IT151IU,Statistical Methods,3,3,2020,2,FALSE,X
|
| 26 |
+
25,EN008IU,Listening AE1,2,2,2020,3,FALSE,X
|
| 27 |
+
26,PH014IU,Physics 2,2,2,2020,3,FALSE,X
|
| 28 |
+
27,PE018IU,History of Vietnamese Communist Party,2,2,2020,3,FALSE,X
|
| 29 |
+
28,EN007IU,Writing AE1,2,2,2020,3,FALSE,X
|
| 30 |
+
29,EN012IU,Speaking AE2,2,2,2021,1,FALSE,X
|
| 31 |
+
30,EN011IU,Writing AE2,2,2,2021,1,FALSE,X
|
| 32 |
+
31,IT139IU,Scalable and Distributed Computing,4,4,2021,1,FALSE,X
|
| 33 |
+
32,IT140IU,Fundamental Concepts of Data Security,4,4,2021,1,FALSE,X
|
| 34 |
+
33,MA026IU,"Probability, Statistic & Random Process",3,3,2021,1,FALSE,X
|
| 35 |
+
34,PE008IU,Critical Thinking,3,3,2021,1,FALSE,X
|
| 36 |
+
35,PE019IU,Ho Chi Minh's Thoughts,2,2,2021,1,FALSE,X
|
| 37 |
+
36,IT154IU,Linear Algebra,3,3,2021,1,FALSE,X
|
| 38 |
+
37,IT097IU,Introduction to Artificial Intelligence,4,4,2021,2,FALSE,X
|
| 39 |
+
38,IT142IU,Analytics for Observational Data,4,4,2021,2,FALSE,X
|
| 40 |
+
39,IT132IU,Introduction to Data Mining,4,4,2021,2,FALSE,X
|
| 41 |
+
40,IT082IU,Internship,3,3,2021,3,FALSE,X
|
| 42 |
+
41,PE014IU,Environmental Science,3,3,2022,1,FALSE,X
|
| 43 |
+
42,IS021IU,Deterministic models in Operations Research,3,3,2022,1,TRUE,
|
| 44 |
+
43,IT145IU,Decision Support System,4,4,2022,1,TRUE,X
|
| 45 |
+
44,IT083IU,Special Study of the Field,3,3,2022,1,FALSE,X
|
| 46 |
+
45,IT144IU,Business Process Analysis,4,4,2022,1,TRUE,
|
| 47 |
+
46,IT146IU,Theory of Networks,4,4,2022,1,TRUE,
|
| 48 |
+
47,IT143IU,Fundamentals of Big Data Technology,4,4,2022,1,FALSE,X
|
| 49 |
+
48,IT148IU,Experimental Design,4,4,2022,2,TRUE,
|
| 50 |
+
49,IT150IU,Blockchain,4,4,2022,2,TRUE,
|
| 51 |
+
50,ISME105IU,Optimization,3,3,2022,2,TRUE,
|
| 52 |
+
51,IT058IU,Thesis,10,10,2022,2,FALSE,X
|
| 53 |
+
52,IT094IU,Information System Management,4,4,2022,2,TRUE,X
|
| 54 |
+
53,IT120IU,Entrepreneurship,3,3,2022,2,TRUE,X
|
| 55 |
+
54,IT141IU,Big Data Applications: Machine Learning at Scale,4,4,2022,2,TRUE,
|
| 56 |
+
55,IT056IU,IT Project Management,4,4,2022,2,TRUE,
|
| 57 |
+
56,IT152IU,Data Mining for IoT,4,4,2022,2,TRUE,
|
| 58 |
+
57,IT147IU,Mobile Cloud Computing,4,4,2022,2,TRUE,
|
data_stu.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
logo-vector-IU-01.png
ADDED
|
processing.py
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import numpy as np
|
| 3 |
+
import json
|
| 4 |
+
import streamlit as st
|
| 5 |
+
from ConsoleApp import main
|
| 6 |
+
# from ConsoleApp import main_filter
|
| 7 |
+
|
| 8 |
+
# from ConsoleApp import get_filter
|
| 9 |
+
import sys
|
| 10 |
+
import hashlib
|
| 11 |
+
import json
|
| 12 |
+
import ast
|
| 13 |
+
import traceback
|
| 14 |
+
import hashlib
|
| 15 |
+
from PIL import Image
|
| 16 |
+
from itertools import chain
|
| 17 |
+
from bs4 import BeautifulSoup
|
| 18 |
+
# from session_state import SessionState
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def load_file(df2, df_room):
|
| 23 |
+
|
| 24 |
+
list_course = []
|
| 25 |
+
index_count_course_id = 0
|
| 26 |
+
list_prof = []
|
| 27 |
+
index_count_prof_id = 0
|
| 28 |
+
for index1, row1 in df2.iterrows():
|
| 29 |
+
if row1['Course_Name'] not in list_course:
|
| 30 |
+
df2.at[index1, 'Course_id'] = index_count_course_id + 1
|
| 31 |
+
index_count_course_id += 1
|
| 32 |
+
list_course.append(row1['Course_Name'])
|
| 33 |
+
else:
|
| 34 |
+
df2.at[index1, 'Course_id'] = index_count_course_id
|
| 35 |
+
|
| 36 |
+
if row1['Prof_Name'] not in list_prof:
|
| 37 |
+
df2.at[index1, 'Prof_id'] = index_count_prof_id + 1
|
| 38 |
+
index_count_prof_id += 1
|
| 39 |
+
list_prof.append(row1['Prof_Name'])
|
| 40 |
+
else:
|
| 41 |
+
df2.at[index1, 'Prof_id'] = index_count_prof_id
|
| 42 |
+
|
| 43 |
+
# create list of dictionaries representing each object in the JSON file
|
| 44 |
+
objects = []
|
| 45 |
+
for index, row in df2.iterrows():
|
| 46 |
+
if row['Prof_id'] != '':
|
| 47 |
+
# create professor object
|
| 48 |
+
prof = {
|
| 49 |
+
"prof": {
|
| 50 |
+
"id": row['Prof_id'],
|
| 51 |
+
"name": row['Prof_Name']
|
| 52 |
+
}
|
| 53 |
+
}
|
| 54 |
+
if prof not in objects:
|
| 55 |
+
objects.append(prof)
|
| 56 |
+
if row['Course_id'] != '':
|
| 57 |
+
# create course object
|
| 58 |
+
course = {
|
| 59 |
+
"course": {
|
| 60 |
+
"id": row['Course_id'],
|
| 61 |
+
"name": row['Course_Name']
|
| 62 |
+
}
|
| 63 |
+
}
|
| 64 |
+
if course not in objects:
|
| 65 |
+
objects.append(course)
|
| 66 |
+
if row['Group_id'] != '':
|
| 67 |
+
# create group object
|
| 68 |
+
group = {
|
| 69 |
+
"group": {
|
| 70 |
+
"id": row['Group_id'],
|
| 71 |
+
"size": row['Size_Course']
|
| 72 |
+
}
|
| 73 |
+
}
|
| 74 |
+
# if group not in objects:
|
| 75 |
+
objects.append(group)
|
| 76 |
+
if row['Prof_id'] != '' and row['Course_id'] != '':
|
| 77 |
+
# create class object
|
| 78 |
+
class_ = {
|
| 79 |
+
"class": {
|
| 80 |
+
"professor": row['Prof_id'],
|
| 81 |
+
"course": row['Course_id'],
|
| 82 |
+
"duration": row['Duration'],
|
| 83 |
+
"group": row['Group_id'],
|
| 84 |
+
"lab": row['Lab']
|
| 85 |
+
}
|
| 86 |
+
}
|
| 87 |
+
if class_ not in objects:
|
| 88 |
+
objects.append(class_)
|
| 89 |
+
|
| 90 |
+
for index, row in df_room.iterrows():
|
| 91 |
+
if row['Room'] != '':
|
| 92 |
+
# create room object
|
| 93 |
+
room = {
|
| 94 |
+
"room": {
|
| 95 |
+
"name": row['Room'],
|
| 96 |
+
"lab": row['Lab'],
|
| 97 |
+
"size": row['Size_Room']
|
| 98 |
+
}
|
| 99 |
+
}
|
| 100 |
+
objects.append(room)
|
| 101 |
+
|
| 102 |
+
# create JSON object with list of objects
|
| 103 |
+
json_data = json.dumps(objects, sort_keys=False)
|
| 104 |
+
# write JSON object to file
|
| 105 |
+
with open('GaSchedule1.json', 'w') as f:
|
| 106 |
+
f.write(json_data)
|
| 107 |
+
file_name = "/GaSchedule1.json"
|
| 108 |
+
return file_name
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
def for_stu():
|
| 114 |
+
df_stu = pd.read_csv("time-scheduling/data_stu.csv")
|
| 115 |
+
df_ctdt = pd.read_csv("time-scheduling/ctdt_ds.csv")
|
| 116 |
+
|
| 117 |
+
df_ctdt = df_ctdt[['MaMH', 'Course Name', 'Sem', 'Expect Year', 'Credits', 'Elective']]
|
| 118 |
+
|
| 119 |
+
df_stu = df_stu[['MaSV', 'NHHK', 'HK', 'MaMH', 'TenMH', 'SoTinChi', 'DiemHP']]
|
| 120 |
+
df_stu = df_stu.dropna()
|
| 121 |
+
df_stu['NHHK'] = df_stu['NHHK'].astype(str).str[:-1]
|
| 122 |
+
input = st.text_input("Type Student ID", value="")
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
|
| 126 |
+
|
| 127 |
+
col1, col2, col3 = st.columns(3)
|
| 128 |
+
with col1:
|
| 129 |
+
if input:
|
| 130 |
+
|
| 131 |
+
# Convert 'DiemHP' column to numeric type, ignoring non-numeric values
|
| 132 |
+
df_stu['DiemHP'] = pd.to_numeric(df_stu['DiemHP'], errors='coerce')
|
| 133 |
+
|
| 134 |
+
list_subject_have_done = df_stu.loc[(df_stu['MaSV'].str.lower() == input.lower()) & (df_stu['DiemHP'].gt(50))]
|
| 135 |
+
list_subject_have_done[''] = np.arange(1, len(list_subject_have_done) + 1)
|
| 136 |
+
list_subject_have_done = list_subject_have_done.reindex(columns=['', 'MaMH', 'TenMH','HK', 'NHHK', 'SoTinChi'])
|
| 137 |
+
list_subject_have_done = list_subject_have_done.rename(columns={'NHHK': 'Actual Year', 'HK': 'Sem', 'TenMH': 'Course Name', 'SoTinChi': 'Credits'})
|
| 138 |
+
|
| 139 |
+
with st.expander("List of subjects have done"):
|
| 140 |
+
st.dataframe(list_subject_have_done.set_index(''))
|
| 141 |
+
with col2:
|
| 142 |
+
if input:
|
| 143 |
+
list_subject_havent_done_yet = df_ctdt[~df_ctdt['MaMH'].isin(list_subject_have_done['MaMH'])]
|
| 144 |
+
list_subject_havent_done_yet['Expect Year'] = list_subject_havent_done_yet['Expect Year'].astype(str)
|
| 145 |
+
list_subject_havent_done_yet['Elective'] = list_subject_havent_done_yet['Elective'].astype(bool)
|
| 146 |
+
list_subject_havent_done_yet[''] = np.arange(1, len(list_subject_havent_done_yet) + 1)
|
| 147 |
+
list_subject_havent_done_yet = list_subject_havent_done_yet.reindex(columns=['', 'MaMH', 'Course Name', 'Credits', 'Elective', 'Expect Year', 'Sem'])
|
| 148 |
+
|
| 149 |
+
with st.expander("List of subjects haven't done yet"):
|
| 150 |
+
st.dataframe(list_subject_havent_done_yet.set_index(''))
|
| 151 |
+
|
| 152 |
+
with col3:
|
| 153 |
+
if input:
|
| 154 |
+
df_unique = df2[df2['Group_Lab'] == 1.0]
|
| 155 |
+
df_unique = df_unique[['MaMH', 'Course_Name', 'Prof_Name', 'Duration', 'Group_Lab', 'Size_Course']]
|
| 156 |
+
list_recommend_subjects = df_unique[df_unique['MaMH'].isin(list_subject_havent_done_yet['MaMH'])]
|
| 157 |
+
list_recommend_subjects[''] = np.arange(1, len(list_recommend_subjects) + 1)
|
| 158 |
+
list_recommend_subjects = list_recommend_subjects.reindex(columns=['', 'MaMH', 'Course_Name', 'Prof_Name', 'Duration', 'Group_Lab', 'Size_Course'])
|
| 159 |
+
with st.expander("List of recommend subjects in this semester"):
|
| 160 |
+
st.dataframe(list_recommend_subjects.set_index(''))
|
| 161 |
+
|
| 162 |
+
def get_filter(html, list_filter):
|
| 163 |
+
# Parse the HTML
|
| 164 |
+
soup = BeautifulSoup(html, 'html.parser')
|
| 165 |
+
|
| 166 |
+
# Find all div elements with id starting with 'room_'
|
| 167 |
+
div_elements = soup.find_all('div', id=lambda x: x and x.startswith('room_'))
|
| 168 |
+
# Filter and display the schedule for specific rooms
|
| 169 |
+
filtered = ""
|
| 170 |
+
for div in div_elements:
|
| 171 |
+
room_id = div['id'].replace('room_', '') # Extract the room ID from the div's id attribute
|
| 172 |
+
if room_id in list_filter:
|
| 173 |
+
filtered += str(div)
|
| 174 |
+
return filtered
|
| 175 |
+
|
| 176 |
+
def data_display():
|
| 177 |
+
|
| 178 |
+
uploaded_file = st.file_uploader('')
|
| 179 |
+
if uploaded_file is not None:
|
| 180 |
+
df = pd.read_csv(uploaded_file)
|
| 181 |
+
|
| 182 |
+
else:
|
| 183 |
+
df = [['Data Mining', 1, 35, 4, 'Nguyen Thi Thanh Sang', 'IT132IU'],
|
| 184 |
+
['Analytics for Observational Data', 2, 35, 4, 'Nguyen Thi Thanh Sang', 'IT142IU'],
|
| 185 |
+
['Fundamentals of Programming', 0, 90, 3, 'Dao Tran Hoang Chau', 'IT149IU'],
|
| 186 |
+
['Object-Oriented Analysis and Design', 0, 90, 4, 'Ha Viet Uyen Synh', 'IT090IU']]
|
| 187 |
+
room_columns = ['TenMH', 'ToTH', 'TongSoSV', 'SoTiet', 'TenDayDuNV', 'MaMH']
|
| 188 |
+
df = pd.DataFrame(df, columns=room_columns)
|
| 189 |
+
|
| 190 |
+
df1 = df[['TenMH', 'ToTH', 'TongSoSV', 'SoTiet', 'TenDayDuNV', 'MaMH']]
|
| 191 |
+
df1 = df1.rename(columns={'TenMH': 'Course_Name', 'ToTH': 'Group_Lab', 'TongSoSV': 'Size_Course', 'SoTiet': 'Duration', 'TenDayDuNV': 'Prof_Name', 'MaMH': 'MaMH'})
|
| 192 |
+
df1['Lab'] = df1['Group_Lab']
|
| 193 |
+
# df1['Lab'] = df1['Lab'].astype(str)
|
| 194 |
+
for index, row in df1.iterrows():
|
| 195 |
+
if row['Lab'] == 1 or row['Lab'] == 2 or row['Lab'] == 3 or row['Lab'] == 4:
|
| 196 |
+
df1.at[index, 'Lab'] = 'True'
|
| 197 |
+
else:
|
| 198 |
+
df1.at[index, 'Lab'] = ''
|
| 199 |
+
df1['Lab'] = df1['Lab'].astype(bool)
|
| 200 |
+
|
| 201 |
+
|
| 202 |
+
## create default room
|
| 203 |
+
room_default = [['A1.309', 90, 0],
|
| 204 |
+
['L107', 90, 0],
|
| 205 |
+
['LA1.605', 60, 1],
|
| 206 |
+
['La1.607', 60, 1]
|
| 207 |
+
]
|
| 208 |
+
room_columns = ['Room', 'Size_Room', 'Lab']
|
| 209 |
+
df_room = pd.DataFrame(room_default, columns=room_columns)
|
| 210 |
+
df_room['Lab'] = df_room['Lab'].astype(str)
|
| 211 |
+
for index, row in df_room.iterrows():
|
| 212 |
+
if row['Lab'] == '1':
|
| 213 |
+
df_room.at[index, 'Lab'] = 'True'
|
| 214 |
+
else:
|
| 215 |
+
df_room.at[index, 'Lab'] = ''
|
| 216 |
+
df_room['Lab'] = df_room['Lab'].astype(bool)
|
| 217 |
+
|
| 218 |
+
|
| 219 |
+
col1, col2, col3, col4 = st.columns([0.5,7,2.4,0.5])
|
| 220 |
+
|
| 221 |
+
with col2:
|
| 222 |
+
df2 = st.experimental_data_editor(df1, num_rows="dynamic")
|
| 223 |
+
df2['Size_Course'] = df2['Size_Course'].astype(int)
|
| 224 |
+
df2['Duration'] = df2['Duration'].astype(int)
|
| 225 |
+
df2['Group_id'] = np.arange(1, len(df2) + 1)
|
| 226 |
+
df_prof_filter = df2['Prof_Name'].drop_duplicates().tolist()
|
| 227 |
+
|
| 228 |
+
with col3:
|
| 229 |
+
df_room = st.experimental_data_editor(df_room, num_rows="dynamic")
|
| 230 |
+
df_room['Size_Room'] = df_room['Size_Room'].astype(int)
|
| 231 |
+
filter = df_room['Room'].to_list()
|
| 232 |
+
# df_room_filter = df_room[df_room['Room'].isin(list_filter)]
|
| 233 |
+
|
| 234 |
+
return df2, df_room, filter, df_prof_filter
|
| 235 |
+
|
| 236 |
+
st.set_page_config(layout="wide")
|
| 237 |
+
if __name__ == "__main__":
|
| 238 |
+
|
| 239 |
+
st.markdown("<h1 style='text-align: center; color: white;'>Time Scheduling Engine</h1>", unsafe_allow_html=True)
|
| 240 |
+
image = Image.open('time-scheduling/logo-vector-IU-01.png')
|
| 241 |
+
st.sidebar.image(image, width=240)
|
| 242 |
+
tab1, tab2 = st.tabs(["Schedule", "Student"])
|
| 243 |
+
with tab1:
|
| 244 |
+
df2, df_room, filter, df_prof_filter = data_display()
|
| 245 |
+
file_name = load_file(df2, df_room)
|
| 246 |
+
# html_result_filter = main_filter(file_name)
|
| 247 |
+
html_result = main(file_name)
|
| 248 |
+
if 'html_result' not in st.session_state:
|
| 249 |
+
st.session_state.html_result = []
|
| 250 |
+
list_room_filter = st.sidebar.multiselect('Room Filter', filter, filter)
|
| 251 |
+
# list_prof_filter = st.sidebar.multiselect('Prof Filter', df_prof_filter, df_prof_filter)
|
| 252 |
+
if st.button('Generate'):
|
| 253 |
+
st.session_state.html_result = html_result
|
| 254 |
+
st.markdown(st.session_state.html_result, unsafe_allow_html=True)
|
| 255 |
+
if st.sidebar.button('Room Filter'):
|
| 256 |
+
filtered1 = get_filter(st.session_state.html_result, list_room_filter)
|
| 257 |
+
st.markdown(filtered1, unsafe_allow_html=True)
|
| 258 |
+
|
| 259 |
+
# if len(sys.argv) > 1:
|
| 260 |
+
# file_name = sys.argv[1]
|
| 261 |
+
# try:
|
| 262 |
+
# if st.button('Generate'):
|
| 263 |
+
# temp = session_state['html_result']
|
| 264 |
+
# filtered1 = get_filter(temp, list_filter)
|
| 265 |
+
# st.markdown(filtered1, unsafe_allow_html=True)
|
| 266 |
+
|
| 267 |
+
# except:
|
| 268 |
+
# traceback.print_exc()
|
| 269 |
+
|
| 270 |
+
with tab2:
|
| 271 |
+
for_stu()
|
reprocessing.ipynb
ADDED
|
@@ -0,0 +1,589 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "3745035b",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"data": {
|
| 11 |
+
"text/html": [
|
| 12 |
+
"<div>\n",
|
| 13 |
+
"<style scoped>\n",
|
| 14 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 15 |
+
" vertical-align: middle;\n",
|
| 16 |
+
" }\n",
|
| 17 |
+
"\n",
|
| 18 |
+
" .dataframe tbody tr th {\n",
|
| 19 |
+
" vertical-align: top;\n",
|
| 20 |
+
" }\n",
|
| 21 |
+
"\n",
|
| 22 |
+
" .dataframe thead th {\n",
|
| 23 |
+
" text-align: right;\n",
|
| 24 |
+
" }\n",
|
| 25 |
+
"</style>\n",
|
| 26 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 27 |
+
" <thead>\n",
|
| 28 |
+
" <tr style=\"text-align: right;\">\n",
|
| 29 |
+
" <th></th>\n",
|
| 30 |
+
" <th>MaMH</th>\n",
|
| 31 |
+
" <th>TenMH</th>\n",
|
| 32 |
+
" <th>NhomTo</th>\n",
|
| 33 |
+
" <th>ToTH</th>\n",
|
| 34 |
+
" <th>TenLop</th>\n",
|
| 35 |
+
" <th>TongSoSV</th>\n",
|
| 36 |
+
" <th>ThuKieuSo</th>\n",
|
| 37 |
+
" <th>TietBD</th>\n",
|
| 38 |
+
" <th>SoTiet</th>\n",
|
| 39 |
+
" <th>MaPH</th>\n",
|
| 40 |
+
" <th>DSTuanHoc</th>\n",
|
| 41 |
+
" <th>MaNV</th>\n",
|
| 42 |
+
" <th>TenDayDuNV</th>\n",
|
| 43 |
+
" <th>IsTKBDaXep</th>\n",
|
| 44 |
+
" <th>MaDV</th>\n",
|
| 45 |
+
" <th>TenDV</th>\n",
|
| 46 |
+
" <th>TenDVEg</th>\n",
|
| 47 |
+
" <th>NgayBD</th>\n",
|
| 48 |
+
" <th>NgayKT</th>\n",
|
| 49 |
+
" </tr>\n",
|
| 50 |
+
" </thead>\n",
|
| 51 |
+
" <tbody>\n",
|
| 52 |
+
" <tr>\n",
|
| 53 |
+
" <th>0</th>\n",
|
| 54 |
+
" <td>1</td>\n",
|
| 55 |
+
" <td>Functional Programming</td>\n",
|
| 56 |
+
" <td>1</td>\n",
|
| 57 |
+
" <td>NaN</td>\n",
|
| 58 |
+
" <td>ITIT16UN11, ITIT16UN21</td>\n",
|
| 59 |
+
" <td>10</td>\n",
|
| 60 |
+
" <td>2</td>\n",
|
| 61 |
+
" <td>1</td>\n",
|
| 62 |
+
" <td>3</td>\n",
|
| 63 |
+
" <td>LA1.605</td>\n",
|
| 64 |
+
" <td>-2345678901234567---</td>\n",
|
| 65 |
+
" <td>174</td>\n",
|
| 66 |
+
" <td>Dao Tran Hoang Chau</td>\n",
|
| 67 |
+
" <td>0</td>\n",
|
| 68 |
+
" <td>IT IT</td>\n",
|
| 69 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 70 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 71 |
+
" <td>42989</td>\n",
|
| 72 |
+
" <td>43094</td>\n",
|
| 73 |
+
" </tr>\n",
|
| 74 |
+
" <tr>\n",
|
| 75 |
+
" <th>1</th>\n",
|
| 76 |
+
" <td>2</td>\n",
|
| 77 |
+
" <td>Operating Systems</td>\n",
|
| 78 |
+
" <td>1</td>\n",
|
| 79 |
+
" <td>NaN</td>\n",
|
| 80 |
+
" <td>ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31</td>\n",
|
| 81 |
+
" <td>90</td>\n",
|
| 82 |
+
" <td>6</td>\n",
|
| 83 |
+
" <td>6</td>\n",
|
| 84 |
+
" <td>3</td>\n",
|
| 85 |
+
" <td>A1.309</td>\n",
|
| 86 |
+
" <td>-2345678901234567---</td>\n",
|
| 87 |
+
" <td>119</td>\n",
|
| 88 |
+
" <td>Tran Manh Ha</td>\n",
|
| 89 |
+
" <td>0</td>\n",
|
| 90 |
+
" <td>IT IT</td>\n",
|
| 91 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 92 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 93 |
+
" <td>42993</td>\n",
|
| 94 |
+
" <td>43098</td>\n",
|
| 95 |
+
" </tr>\n",
|
| 96 |
+
" <tr>\n",
|
| 97 |
+
" <th>2</th>\n",
|
| 98 |
+
" <td>2</td>\n",
|
| 99 |
+
" <td>Operating Systems</td>\n",
|
| 100 |
+
" <td>1</td>\n",
|
| 101 |
+
" <td>1.0</td>\n",
|
| 102 |
+
" <td>ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31</td>\n",
|
| 103 |
+
" <td>30</td>\n",
|
| 104 |
+
" <td>2</td>\n",
|
| 105 |
+
" <td>6</td>\n",
|
| 106 |
+
" <td>4</td>\n",
|
| 107 |
+
" <td>LA1.605</td>\n",
|
| 108 |
+
" <td>-----678901234------</td>\n",
|
| 109 |
+
" <td>119</td>\n",
|
| 110 |
+
" <td>Tran Manh Ha</td>\n",
|
| 111 |
+
" <td>0</td>\n",
|
| 112 |
+
" <td>IT IT</td>\n",
|
| 113 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 114 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 115 |
+
" <td>43017</td>\n",
|
| 116 |
+
" <td>43073</td>\n",
|
| 117 |
+
" </tr>\n",
|
| 118 |
+
" <tr>\n",
|
| 119 |
+
" <th>3</th>\n",
|
| 120 |
+
" <td>2</td>\n",
|
| 121 |
+
" <td>Operating Systems</td>\n",
|
| 122 |
+
" <td>1</td>\n",
|
| 123 |
+
" <td>2.0</td>\n",
|
| 124 |
+
" <td>ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31</td>\n",
|
| 125 |
+
" <td>30</td>\n",
|
| 126 |
+
" <td>2</td>\n",
|
| 127 |
+
" <td>1</td>\n",
|
| 128 |
+
" <td>4</td>\n",
|
| 129 |
+
" <td>LA1.608</td>\n",
|
| 130 |
+
" <td>-----678901234------</td>\n",
|
| 131 |
+
" <td>213</td>\n",
|
| 132 |
+
" <td>Nguyen Tien Dung</td>\n",
|
| 133 |
+
" <td>0</td>\n",
|
| 134 |
+
" <td>IT IT</td>\n",
|
| 135 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 136 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 137 |
+
" <td>43017</td>\n",
|
| 138 |
+
" <td>43073</td>\n",
|
| 139 |
+
" </tr>\n",
|
| 140 |
+
" <tr>\n",
|
| 141 |
+
" <th>4</th>\n",
|
| 142 |
+
" <td>2</td>\n",
|
| 143 |
+
" <td>Operating Systems</td>\n",
|
| 144 |
+
" <td>1</td>\n",
|
| 145 |
+
" <td>3.0</td>\n",
|
| 146 |
+
" <td>ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31</td>\n",
|
| 147 |
+
" <td>30</td>\n",
|
| 148 |
+
" <td>2</td>\n",
|
| 149 |
+
" <td>6</td>\n",
|
| 150 |
+
" <td>4</td>\n",
|
| 151 |
+
" <td>LA1.607</td>\n",
|
| 152 |
+
" <td>-----678901234------</td>\n",
|
| 153 |
+
" <td>213</td>\n",
|
| 154 |
+
" <td>Nguyen Tien Dung</td>\n",
|
| 155 |
+
" <td>0</td>\n",
|
| 156 |
+
" <td>IT IT</td>\n",
|
| 157 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 158 |
+
" <td>Computer Science & Engineering</td>\n",
|
| 159 |
+
" <td>43017</td>\n",
|
| 160 |
+
" <td>43073</td>\n",
|
| 161 |
+
" </tr>\n",
|
| 162 |
+
" </tbody>\n",
|
| 163 |
+
"</table>\n",
|
| 164 |
+
"</div>"
|
| 165 |
+
],
|
| 166 |
+
"text/plain": [
|
| 167 |
+
" MaMH TenMH NhomTo ToTH \\\n",
|
| 168 |
+
"0 1 Functional Programming 1 NaN \n",
|
| 169 |
+
"1 2 Operating Systems 1 NaN \n",
|
| 170 |
+
"2 2 Operating Systems 1 1.0 \n",
|
| 171 |
+
"3 2 Operating Systems 1 2.0 \n",
|
| 172 |
+
"4 2 Operating Systems 1 3.0 \n",
|
| 173 |
+
"\n",
|
| 174 |
+
" TenLop TongSoSV ThuKieuSo TietBD \\\n",
|
| 175 |
+
"0 ITIT16UN11, ITIT16UN21 10 2 1 \n",
|
| 176 |
+
"1 ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31 90 6 6 \n",
|
| 177 |
+
"2 ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31 30 2 6 \n",
|
| 178 |
+
"3 ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31 30 2 1 \n",
|
| 179 |
+
"4 ITIT15CS1, ITIT15IU11, ITIT15IU21, ITIT15IU31 30 2 6 \n",
|
| 180 |
+
"\n",
|
| 181 |
+
" SoTiet MaPH DSTuanHoc MaNV TenDayDuNV \\\n",
|
| 182 |
+
"0 3 LA1.605 -2345678901234567--- 174 Dao Tran Hoang Chau \n",
|
| 183 |
+
"1 3 A1.309 -2345678901234567--- 119 Tran Manh Ha \n",
|
| 184 |
+
"2 4 LA1.605 -----678901234------ 119 Tran Manh Ha \n",
|
| 185 |
+
"3 4 LA1.608 -----678901234------ 213 Nguyen Tien Dung \n",
|
| 186 |
+
"4 4 LA1.607 -----678901234------ 213 Nguyen Tien Dung \n",
|
| 187 |
+
"\n",
|
| 188 |
+
" IsTKBDaXep MaDV TenDV \\\n",
|
| 189 |
+
"0 0 IT IT Computer Science & Engineering \n",
|
| 190 |
+
"1 0 IT IT Computer Science & Engineering \n",
|
| 191 |
+
"2 0 IT IT Computer Science & Engineering \n",
|
| 192 |
+
"3 0 IT IT Computer Science & Engineering \n",
|
| 193 |
+
"4 0 IT IT Computer Science & Engineering \n",
|
| 194 |
+
"\n",
|
| 195 |
+
" TenDVEg NgayBD NgayKT \n",
|
| 196 |
+
"0 Computer Science & Engineering 42989 43094 \n",
|
| 197 |
+
"1 Computer Science & Engineering 42993 43098 \n",
|
| 198 |
+
"2 Computer Science & Engineering 43017 43073 \n",
|
| 199 |
+
"3 Computer Science & Engineering 43017 43073 \n",
|
| 200 |
+
"4 Computer Science & Engineering 43017 43073 "
|
| 201 |
+
]
|
| 202 |
+
},
|
| 203 |
+
"execution_count": 1,
|
| 204 |
+
"metadata": {},
|
| 205 |
+
"output_type": "execute_result"
|
| 206 |
+
}
|
| 207 |
+
],
|
| 208 |
+
"source": [
|
| 209 |
+
"import pandas as pd\n",
|
| 210 |
+
"import numpy as np\n",
|
| 211 |
+
"df = pd.read_csv(\"TKB HKI 2017-2018.csv\")\n",
|
| 212 |
+
"df.head()"
|
| 213 |
+
]
|
| 214 |
+
},
|
| 215 |
+
{
|
| 216 |
+
"cell_type": "code",
|
| 217 |
+
"execution_count": 2,
|
| 218 |
+
"id": "a605911f",
|
| 219 |
+
"metadata": {},
|
| 220 |
+
"outputs": [
|
| 221 |
+
{
|
| 222 |
+
"data": {
|
| 223 |
+
"text/html": [
|
| 224 |
+
"<div>\n",
|
| 225 |
+
"<style scoped>\n",
|
| 226 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 227 |
+
" vertical-align: middle;\n",
|
| 228 |
+
" }\n",
|
| 229 |
+
"\n",
|
| 230 |
+
" .dataframe tbody tr th {\n",
|
| 231 |
+
" vertical-align: top;\n",
|
| 232 |
+
" }\n",
|
| 233 |
+
"\n",
|
| 234 |
+
" .dataframe thead th {\n",
|
| 235 |
+
" text-align: right;\n",
|
| 236 |
+
" }\n",
|
| 237 |
+
"</style>\n",
|
| 238 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 239 |
+
" <thead>\n",
|
| 240 |
+
" <tr style=\"text-align: right;\">\n",
|
| 241 |
+
" <th></th>\n",
|
| 242 |
+
" <th>group_id</th>\n",
|
| 243 |
+
" <th>course_id</th>\n",
|
| 244 |
+
" <th>course_name</th>\n",
|
| 245 |
+
" <th>Lab</th>\n",
|
| 246 |
+
" <th>size</th>\n",
|
| 247 |
+
" <th>duration</th>\n",
|
| 248 |
+
" <th>room</th>\n",
|
| 249 |
+
" <th>prof_id</th>\n",
|
| 250 |
+
" <th>prof_name</th>\n",
|
| 251 |
+
" </tr>\n",
|
| 252 |
+
" </thead>\n",
|
| 253 |
+
" <tbody>\n",
|
| 254 |
+
" <tr>\n",
|
| 255 |
+
" <th>0</th>\n",
|
| 256 |
+
" <td>1</td>\n",
|
| 257 |
+
" <td>1</td>\n",
|
| 258 |
+
" <td>Functional Programming</td>\n",
|
| 259 |
+
" <td>False</td>\n",
|
| 260 |
+
" <td>10</td>\n",
|
| 261 |
+
" <td>3</td>\n",
|
| 262 |
+
" <td>LA1.605</td>\n",
|
| 263 |
+
" <td>174</td>\n",
|
| 264 |
+
" <td>Dao Tran Hoang Chau</td>\n",
|
| 265 |
+
" </tr>\n",
|
| 266 |
+
" <tr>\n",
|
| 267 |
+
" <th>1</th>\n",
|
| 268 |
+
" <td>2</td>\n",
|
| 269 |
+
" <td>2</td>\n",
|
| 270 |
+
" <td>Operating Systems</td>\n",
|
| 271 |
+
" <td>False</td>\n",
|
| 272 |
+
" <td>90</td>\n",
|
| 273 |
+
" <td>3</td>\n",
|
| 274 |
+
" <td>A1.309</td>\n",
|
| 275 |
+
" <td>119</td>\n",
|
| 276 |
+
" <td>Tran Manh Ha</td>\n",
|
| 277 |
+
" </tr>\n",
|
| 278 |
+
" <tr>\n",
|
| 279 |
+
" <th>2</th>\n",
|
| 280 |
+
" <td>3</td>\n",
|
| 281 |
+
" <td>2</td>\n",
|
| 282 |
+
" <td>Operating Systems</td>\n",
|
| 283 |
+
" <td>True</td>\n",
|
| 284 |
+
" <td>30</td>\n",
|
| 285 |
+
" <td>4</td>\n",
|
| 286 |
+
" <td>LA1.605</td>\n",
|
| 287 |
+
" <td>119</td>\n",
|
| 288 |
+
" <td>Tran Manh Ha</td>\n",
|
| 289 |
+
" </tr>\n",
|
| 290 |
+
" <tr>\n",
|
| 291 |
+
" <th>3</th>\n",
|
| 292 |
+
" <td>4</td>\n",
|
| 293 |
+
" <td>2</td>\n",
|
| 294 |
+
" <td>Operating Systems</td>\n",
|
| 295 |
+
" <td>True</td>\n",
|
| 296 |
+
" <td>30</td>\n",
|
| 297 |
+
" <td>4</td>\n",
|
| 298 |
+
" <td>LA1.608</td>\n",
|
| 299 |
+
" <td>213</td>\n",
|
| 300 |
+
" <td>Nguyen Tien Dung</td>\n",
|
| 301 |
+
" </tr>\n",
|
| 302 |
+
" <tr>\n",
|
| 303 |
+
" <th>4</th>\n",
|
| 304 |
+
" <td>5</td>\n",
|
| 305 |
+
" <td>2</td>\n",
|
| 306 |
+
" <td>Operating Systems</td>\n",
|
| 307 |
+
" <td>True</td>\n",
|
| 308 |
+
" <td>30</td>\n",
|
| 309 |
+
" <td>4</td>\n",
|
| 310 |
+
" <td>LA1.607</td>\n",
|
| 311 |
+
" <td>213</td>\n",
|
| 312 |
+
" <td>Nguyen Tien Dung</td>\n",
|
| 313 |
+
" </tr>\n",
|
| 314 |
+
" </tbody>\n",
|
| 315 |
+
"</table>\n",
|
| 316 |
+
"</div>"
|
| 317 |
+
],
|
| 318 |
+
"text/plain": [
|
| 319 |
+
" group_id course_id course_name Lab size duration \\\n",
|
| 320 |
+
"0 1 1 Functional Programming False 10 3 \n",
|
| 321 |
+
"1 2 2 Operating Systems False 90 3 \n",
|
| 322 |
+
"2 3 2 Operating Systems True 30 4 \n",
|
| 323 |
+
"3 4 2 Operating Systems True 30 4 \n",
|
| 324 |
+
"4 5 2 Operating Systems True 30 4 \n",
|
| 325 |
+
"\n",
|
| 326 |
+
" room prof_id prof_name \n",
|
| 327 |
+
"0 LA1.605 174 Dao Tran Hoang Chau \n",
|
| 328 |
+
"1 A1.309 119 Tran Manh Ha \n",
|
| 329 |
+
"2 LA1.605 119 Tran Manh Ha \n",
|
| 330 |
+
"3 LA1.608 213 Nguyen Tien Dung \n",
|
| 331 |
+
"4 LA1.607 213 Nguyen Tien Dung "
|
| 332 |
+
]
|
| 333 |
+
},
|
| 334 |
+
"execution_count": 2,
|
| 335 |
+
"metadata": {},
|
| 336 |
+
"output_type": "execute_result"
|
| 337 |
+
}
|
| 338 |
+
],
|
| 339 |
+
"source": [
|
| 340 |
+
"df = pd.DataFrame(df)\n",
|
| 341 |
+
"df1 = df[['MaMH', 'TenMH', 'ToTH', 'TongSoSV', 'SoTiet', 'MaPH','MaNV', 'TenDayDuNV']]\n",
|
| 342 |
+
"df1 = df1.rename(columns={'MaMH': 'course_id', 'TenMH': 'course_name','ToTH': 'Lab', 'TongSoSV': 'size', 'SoTiet': 'duration', 'MaPH': 'room', 'MaNV': 'prof_id', 'TenDayDuNV': 'prof_name' })\n",
|
| 343 |
+
"df1['Lab'] = df1['Lab'].fillna(0)\n",
|
| 344 |
+
"df1['Lab'] = df1['Lab'].astype(str)\n",
|
| 345 |
+
"df1['prof_id'] = df1['prof_id'].astype(int)\n",
|
| 346 |
+
"df1['course_id'] = df1['course_id'].astype(int)\n",
|
| 347 |
+
"\n",
|
| 348 |
+
"for index, row in df1.iterrows():\n",
|
| 349 |
+
" if row['Lab'] == '1.0' or row['Lab'] == '2.0' or row['Lab'] == '3.0' or row['Lab'] == '4.0':\n",
|
| 350 |
+
" df1.at[index, 'Lab'] = 'True'\n",
|
| 351 |
+
" else:\n",
|
| 352 |
+
" df1.at[index, 'Lab'] = ''\n",
|
| 353 |
+
" \n",
|
| 354 |
+
"df1['Lab'] = df1['Lab'].astype(bool)\n",
|
| 355 |
+
"df1.reset_index(inplace=True)\n",
|
| 356 |
+
"df1 = df1.rename(columns={'index': 'group_id'})\n",
|
| 357 |
+
"df1['group_id'] = np.arange(1, len(df) + 1)\n",
|
| 358 |
+
"df1.head()"
|
| 359 |
+
]
|
| 360 |
+
},
|
| 361 |
+
{
|
| 362 |
+
"cell_type": "code",
|
| 363 |
+
"execution_count": 3,
|
| 364 |
+
"id": "80f6ef63",
|
| 365 |
+
"metadata": {},
|
| 366 |
+
"outputs": [
|
| 367 |
+
{
|
| 368 |
+
"data": {
|
| 369 |
+
"text/html": [
|
| 370 |
+
"<div>\n",
|
| 371 |
+
"<style scoped>\n",
|
| 372 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 373 |
+
" vertical-align: middle;\n",
|
| 374 |
+
" }\n",
|
| 375 |
+
"\n",
|
| 376 |
+
" .dataframe tbody tr th {\n",
|
| 377 |
+
" vertical-align: top;\n",
|
| 378 |
+
" }\n",
|
| 379 |
+
"\n",
|
| 380 |
+
" .dataframe thead th {\n",
|
| 381 |
+
" text-align: right;\n",
|
| 382 |
+
" }\n",
|
| 383 |
+
"</style>\n",
|
| 384 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 385 |
+
" <thead>\n",
|
| 386 |
+
" <tr style=\"text-align: right;\">\n",
|
| 387 |
+
" <th></th>\n",
|
| 388 |
+
" <th>room</th>\n",
|
| 389 |
+
" <th>size</th>\n",
|
| 390 |
+
" <th>Lab</th>\n",
|
| 391 |
+
" </tr>\n",
|
| 392 |
+
" </thead>\n",
|
| 393 |
+
" <tbody>\n",
|
| 394 |
+
" <tr>\n",
|
| 395 |
+
" <th>0</th>\n",
|
| 396 |
+
" <td>A1.309</td>\n",
|
| 397 |
+
" <td>90</td>\n",
|
| 398 |
+
" <td>False</td>\n",
|
| 399 |
+
" </tr>\n",
|
| 400 |
+
" <tr>\n",
|
| 401 |
+
" <th>1</th>\n",
|
| 402 |
+
" <td>L107</td>\n",
|
| 403 |
+
" <td>40</td>\n",
|
| 404 |
+
" <td>False</td>\n",
|
| 405 |
+
" </tr>\n",
|
| 406 |
+
" <tr>\n",
|
| 407 |
+
" <th>2</th>\n",
|
| 408 |
+
" <td>LA1.605</td>\n",
|
| 409 |
+
" <td>35</td>\n",
|
| 410 |
+
" <td>True</td>\n",
|
| 411 |
+
" </tr>\n",
|
| 412 |
+
" <tr>\n",
|
| 413 |
+
" <th>3</th>\n",
|
| 414 |
+
" <td>LA1.607</td>\n",
|
| 415 |
+
" <td>35</td>\n",
|
| 416 |
+
" <td>True</td>\n",
|
| 417 |
+
" </tr>\n",
|
| 418 |
+
" </tbody>\n",
|
| 419 |
+
"</table>\n",
|
| 420 |
+
"</div>"
|
| 421 |
+
],
|
| 422 |
+
"text/plain": [
|
| 423 |
+
" room size Lab\n",
|
| 424 |
+
"0 A1.309 90 False\n",
|
| 425 |
+
"1 L107 40 False\n",
|
| 426 |
+
"2 LA1.605 35 True\n",
|
| 427 |
+
"3 LA1.607 35 True"
|
| 428 |
+
]
|
| 429 |
+
},
|
| 430 |
+
"execution_count": 3,
|
| 431 |
+
"metadata": {},
|
| 432 |
+
"output_type": "execute_result"
|
| 433 |
+
}
|
| 434 |
+
],
|
| 435 |
+
"source": [
|
| 436 |
+
"room_default = [['A1.309', 90, 0],\n",
|
| 437 |
+
" ['L107', 40, 0],\n",
|
| 438 |
+
" ['LA1.605', 35, 1],\n",
|
| 439 |
+
" ['LA1.607', 35, 1],\n",
|
| 440 |
+
"]\n",
|
| 441 |
+
"room_columns = ['room', 'size', 'Lab']\n",
|
| 442 |
+
"df_room = pd.DataFrame(room_default, columns=room_columns)\n",
|
| 443 |
+
"df_room['Lab'] = df_room['Lab'].astype(str)\n",
|
| 444 |
+
"for index, row in df_room.iterrows():\n",
|
| 445 |
+
" if row['Lab'] == '1':\n",
|
| 446 |
+
" df_room.at[index, 'Lab'] = 'True'\n",
|
| 447 |
+
" else:\n",
|
| 448 |
+
" df_room.at[index, 'Lab'] = ''\n",
|
| 449 |
+
"df_room['Lab'] = df_room['Lab'].astype(bool)\n",
|
| 450 |
+
"df_room"
|
| 451 |
+
]
|
| 452 |
+
},
|
| 453 |
+
{
|
| 454 |
+
"cell_type": "code",
|
| 455 |
+
"execution_count": 4,
|
| 456 |
+
"id": "d6b5b6a2",
|
| 457 |
+
"metadata": {},
|
| 458 |
+
"outputs": [],
|
| 459 |
+
"source": [
|
| 460 |
+
"import json\n",
|
| 461 |
+
"\n",
|
| 462 |
+
"# create list of dictionaries representing each object in the JSON file\n",
|
| 463 |
+
"objects = []\n",
|
| 464 |
+
"\n",
|
| 465 |
+
"for index, row in df1.iterrows():\n",
|
| 466 |
+
" if row['prof_id'] != '':\n",
|
| 467 |
+
" # create professor object\n",
|
| 468 |
+
" prof = {\n",
|
| 469 |
+
" \"prof\": {\n",
|
| 470 |
+
" \"id\": row['prof_id'],\n",
|
| 471 |
+
" \"name\": row['prof_name']\n",
|
| 472 |
+
" }\n",
|
| 473 |
+
" }\n",
|
| 474 |
+
" if prof not in objects:\n",
|
| 475 |
+
" objects.append(prof)\n",
|
| 476 |
+
"\n",
|
| 477 |
+
" if row['course_id'] != '':\n",
|
| 478 |
+
" # create course object\n",
|
| 479 |
+
" course = {\n",
|
| 480 |
+
" \"course\": {\n",
|
| 481 |
+
" \"id\": row['course_id'],\n",
|
| 482 |
+
" \"name\": row['course_name']\n",
|
| 483 |
+
" }\n",
|
| 484 |
+
" }\n",
|
| 485 |
+
" if course not in objects:\n",
|
| 486 |
+
" objects.append(course)\n",
|
| 487 |
+
"\n",
|
| 488 |
+
" if row['group_id'] != '':\n",
|
| 489 |
+
" # create room object\n",
|
| 490 |
+
" group = {\n",
|
| 491 |
+
" \"group\": {\n",
|
| 492 |
+
" \"id\": row['group_id'],\n",
|
| 493 |
+
" \"size\": row['size']\n",
|
| 494 |
+
" }\n",
|
| 495 |
+
" }\n",
|
| 496 |
+
" if group not in objects:\n",
|
| 497 |
+
" objects.append(group)\n",
|
| 498 |
+
" \n",
|
| 499 |
+
" if row['prof_id'] != '' and row['course_id'] != '':\n",
|
| 500 |
+
" # create class object\n",
|
| 501 |
+
" class_ = {\n",
|
| 502 |
+
" \"class\": {\n",
|
| 503 |
+
" \"professor\": row['prof_id'],\n",
|
| 504 |
+
" \"course\": row['course_id'],\n",
|
| 505 |
+
" \"duration\": row['duration'],\n",
|
| 506 |
+
" \"group\": row['group_id'],\n",
|
| 507 |
+
" \"lab\": row['Lab']\n",
|
| 508 |
+
" }\n",
|
| 509 |
+
" }\n",
|
| 510 |
+
" if class_ not in objects:\n",
|
| 511 |
+
" objects.append(class_)\n",
|
| 512 |
+
" \n",
|
| 513 |
+
"for index, row in df_room.iterrows():\n",
|
| 514 |
+
" if row['room'] != '':\n",
|
| 515 |
+
" # create room object\n",
|
| 516 |
+
" room = {\n",
|
| 517 |
+
" \"room\": {\n",
|
| 518 |
+
" \"name\": row['room'],\n",
|
| 519 |
+
" \"lab\": row['Lab'],\n",
|
| 520 |
+
" \"size\": row['size']\n",
|
| 521 |
+
" }\n",
|
| 522 |
+
" }\n",
|
| 523 |
+
" objects.append(room) \n",
|
| 524 |
+
" \n",
|
| 525 |
+
"# create JSON object with list of objects\n",
|
| 526 |
+
"json_data = json.dumps(objects, sort_keys=False)\n",
|
| 527 |
+
"\n",
|
| 528 |
+
"# write JSON object to file\n",
|
| 529 |
+
"with open('GaSchedule3.json', 'w') as f:\n",
|
| 530 |
+
" f.write(json_data)"
|
| 531 |
+
]
|
| 532 |
+
},
|
| 533 |
+
{
|
| 534 |
+
"cell_type": "code",
|
| 535 |
+
"execution_count": 5,
|
| 536 |
+
"id": "f7a33b15",
|
| 537 |
+
"metadata": {},
|
| 538 |
+
"outputs": [
|
| 539 |
+
{
|
| 540 |
+
"data": {
|
| 541 |
+
"text/plain": [
|
| 542 |
+
"'[{\"prof\": {\"id\": 174, \"name\": \"Dao Tran Hoang Chau\"}}, {\"course\": {\"id\": 1, \"name\": \"Functional Programming\"}}, {\"group\": {\"id\": 1, \"size\": 10}}, {\"class\": {\"professor\": 174, \"course\": 1, \"duration\": 3, \"group\": 1, \"lab\": false}}, {\"prof\": {\"id\": 119, \"name\": \"Tran Manh Ha\"}}, {\"course\": {\"id\": 2, \"name\": \"Operating Systems\"}}, {\"group\": {\"id\": 2, \"size\": 90}}, {\"class\": {\"professor\": 119, \"course\": 2, \"duration\": 3, \"group\": 2, \"lab\": false}}, {\"group\": {\"id\": 3, \"size\": 30}}, {\"class\": {\"professor\": 119, \"course\": 2, \"duration\": 4, \"group\": 3, \"lab\": true}}, {\"prof\": {\"id\": 213, \"name\": \"Nguyen Tien Dung\"}}, {\"group\": {\"id\": 4, \"size\": 30}}, {\"class\": {\"professor\": 213, \"course\": 2, \"duration\": 4, \"group\": 4, \"lab\": true}}, {\"group\": {\"id\": 5, \"size\": 30}}, {\"class\": {\"professor\": 213, \"course\": 2, \"duration\": 4, \"group\": 5, \"lab\": true}}, {\"prof\": {\"id\": 74, \"name\": \"Nguyen Van Sinh\"}}, {\"course\": {\"id\": 3, \"name\": \"IT Project Management\"}}, {\"group\": {\"id\": 6, \"size\": 35}}, {\"class\": {\"professor\": 74, \"course\": 3, \"duration\": 3, \"group\": 6, \"lab\": false}}, {\"group\": {\"id\": 7, \"size\": 35}}, {\"class\": {\"professor\": 74, \"course\": 3, \"duration\": 4, \"group\": 7, \"lab\": true}}, {\"prof\": {\"id\": 84, \"name\": \"Le Hai Duong\"}}, {\"course\": {\"id\": 4, \"name\": \"Introduction to Computing\"}}, {\"group\": {\"id\": 8, \"size\": 35}}, {\"class\": {\"professor\": 84, \"course\": 4, \"duration\": 3, \"group\": 8, \"lab\": false}}, {\"prof\": {\"id\": 19, \"name\": \"Huynh Kha Tu\"}}, {\"course\": {\"id\": 5, \"name\": \"Digital Logic Design\"}}, {\"group\": {\"id\": 9, \"size\": 90}}, {\"class\": {\"professor\": 19, \"course\": 5, \"duration\": 3, \"group\": 9, \"lab\": false}}, {\"prof\": {\"id\": 182, \"name\": \"Tran Thanh Tung\"}}, {\"course\": {\"id\": 6, \"name\": \"Object-Oriented Programming\"}}, {\"group\": {\"id\": 10, \"size\": 90}}, {\"class\": {\"professor\": 182, \"course\": 6, \"duration\": 3, \"group\": 10, \"lab\": false}}, {\"group\": {\"id\": 11, \"size\": 30}}, {\"class\": {\"professor\": 213, \"course\": 6, \"duration\": 4, \"group\": 11, \"lab\": true}}, {\"group\": {\"id\": 12, \"size\": 30}}, {\"class\": {\"professor\": 213, \"course\": 6, \"duration\": 4, \"group\": 12, \"lab\": true}}, {\"group\": {\"id\": 13, \"size\": 30}}, {\"class\": {\"professor\": 213, \"course\": 6, \"duration\": 4, \"group\": 13, \"lab\": true}}, {\"prof\": {\"id\": 349, \"name\": \"Nguyen Thi Thanh Sang\"}}, {\"course\": {\"id\": 7, \"name\": \"Software Engineering\"}}, {\"group\": {\"id\": 14, \"size\": 70}}, {\"class\": {\"professor\": 349, \"course\": 7, \"duration\": 3, \"group\": 14, \"lab\": false}}, {\"group\": {\"id\": 15, \"size\": 35}}, {\"class\": {\"professor\": 349, \"course\": 7, \"duration\": 4, \"group\": 15, \"lab\": true}}, {\"group\": {\"id\": 16, \"size\": 35}}, {\"class\": {\"professor\": 349, \"course\": 7, \"duration\": 4, \"group\": 16, \"lab\": true}}, {\"prof\": {\"id\": 62, \"name\": \"Vo Thi Luu Phuong\"}}, {\"course\": {\"id\": 8, \"name\": \"Computer Networks\"}}, {\"group\": {\"id\": 17, \"size\": 70}}, {\"class\": {\"professor\": 62, \"course\": 8, \"duration\": 3, \"group\": 17, \"lab\": false}}, {\"group\": {\"id\": 18, \"size\": 35}}, {\"class\": {\"professor\": 62, \"course\": 8, \"duration\": 4, \"group\": 18, \"lab\": true}}, {\"group\": {\"id\": 19, \"size\": 35}}, {\"class\": {\"professor\": 62, \"course\": 8, \"duration\": 4, \"group\": 19, \"lab\": true}}, {\"prof\": {\"id\": 60, \"name\": \"Ly Tu Nga\"}}, {\"group\": {\"id\": 20, \"size\": 20}}, {\"class\": {\"professor\": 60, \"course\": 8, \"duration\": 4, \"group\": 20, \"lab\": true}}, {\"course\": {\"id\": 9, \"name\": \"Web Application Development\"}}, {\"group\": {\"id\": 21, \"size\": 15}}, {\"class\": {\"professor\": 74, \"course\": 9, \"duration\": 3, \"group\": 21, \"lab\": false}}, {\"group\": {\"id\": 22, \"size\": 15}}, {\"class\": {\"professor\": 74, \"course\": 9, \"duration\": 4, \"group\": 22, \"lab\": true}}, {\"group\": {\"id\": 23, \"size\": 20}}, {\"class\": {\"professor\": 213, \"course\": 9, \"duration\": 4, \"group\": 23, \"lab\": true}}, {\"prof\": {\"id\": 36, \"name\": \"Le Thanh Son\"}}, {\"course\": {\"id\": 10, \"name\": \"Net-Centric Programming\"}}, {\"group\": {\"id\": 24, \"size\": 17}}, {\"class\": {\"professor\": 36, \"course\": 10, \"duration\": 3, \"group\": 24, \"lab\": false}}, {\"group\": {\"id\": 25, \"size\": 17}}, {\"class\": {\"professor\": 36, \"course\": 10, \"duration\": 4, \"group\": 25, \"lab\": true}}, {\"course\": {\"id\": 11, \"name\": \"Digital Logic Design Laboratory\"}}, {\"group\": {\"id\": 26, \"size\": 15}}, {\"class\": {\"professor\": 60, \"course\": 11, \"duration\": 4, \"group\": 26, \"lab\": false}}, {\"group\": {\"id\": 27, \"size\": 15}}, {\"class\": {\"professor\": 60, \"course\": 11, \"duration\": 4, \"group\": 27, \"lab\": false}}, {\"group\": {\"id\": 28, \"size\": 15}}, {\"class\": {\"professor\": 60, \"course\": 11, \"duration\": 4, \"group\": 28, \"lab\": false}}, {\"group\": {\"id\": 29, \"size\": 15}}, {\"class\": {\"professor\": 60, \"course\": 11, \"duration\": 4, \"group\": 29, \"lab\": false}}, {\"group\": {\"id\": 30, \"size\": 15}}, {\"class\": {\"professor\": 60, \"course\": 11, \"duration\": 4, \"group\": 30, \"lab\": false}}, {\"course\": {\"id\": 12, \"name\": \"Entrepreneurship\"}}, {\"group\": {\"id\": 31, \"size\": 80}}, {\"class\": {\"professor\": 174, \"course\": 12, \"duration\": 3, \"group\": 31, \"lab\": false}}, {\"course\": {\"id\": 13, \"name\": \"System & Network Administration\"}}, {\"group\": {\"id\": 32, \"size\": 35}}, {\"class\": {\"professor\": 36, \"course\": 13, \"duration\": 3, \"group\": 32, \"lab\": false}}, {\"group\": {\"id\": 33, \"size\": 35}}, {\"class\": {\"professor\": 36, \"course\": 13, \"duration\": 4, \"group\": 33, \"lab\": true}}, {\"prof\": {\"id\": 184, \"name\": \"Ha Viet Uyen Synh\"}}, {\"course\": {\"id\": 14, \"name\": \"Theoretical Models in Computing\"}}, {\"group\": {\"id\": 34, \"size\": 80}}, {\"class\": {\"professor\": 184, \"course\": 14, \"duration\": 3, \"group\": 34, \"lab\": false}}, {\"group\": {\"id\": 35, \"size\": 26}}, {\"class\": {\"professor\": 184, \"course\": 14, \"duration\": 4, \"group\": 35, \"lab\": true}}, {\"group\": {\"id\": 36, \"size\": 28}}, {\"class\": {\"professor\": 184, \"course\": 14, \"duration\": 4, \"group\": 36, \"lab\": true}}, {\"course\": {\"id\": 15, \"name\": \"Discrete Mathematics\"}}, {\"group\": {\"id\": 37, \"size\": 80}}, {\"class\": {\"professor\": 74, \"course\": 15, \"duration\": 3, \"group\": 37, \"lab\": false}}, {\"room\": {\"name\": \"A1.309\", \"lab\": false, \"size\": 90}}, {\"room\": {\"name\": \"L107\", \"lab\": false, \"size\": 40}}, {\"room\": {\"name\": \"LA1.605\", \"lab\": true, \"size\": 35}}, {\"room\": {\"name\": \"LA1.607\", \"lab\": true, \"size\": 35}}]'"
|
| 543 |
+
]
|
| 544 |
+
},
|
| 545 |
+
"execution_count": 5,
|
| 546 |
+
"metadata": {},
|
| 547 |
+
"output_type": "execute_result"
|
| 548 |
+
}
|
| 549 |
+
],
|
| 550 |
+
"source": [
|
| 551 |
+
"json_data"
|
| 552 |
+
]
|
| 553 |
+
},
|
| 554 |
+
{
|
| 555 |
+
"cell_type": "code",
|
| 556 |
+
"execution_count": null,
|
| 557 |
+
"id": "ac354530",
|
| 558 |
+
"metadata": {},
|
| 559 |
+
"outputs": [],
|
| 560 |
+
"source": []
|
| 561 |
+
}
|
| 562 |
+
],
|
| 563 |
+
"metadata": {
|
| 564 |
+
"kernelspec": {
|
| 565 |
+
"display_name": "Python 3",
|
| 566 |
+
"language": "python",
|
| 567 |
+
"name": "python3"
|
| 568 |
+
},
|
| 569 |
+
"language_info": {
|
| 570 |
+
"codemirror_mode": {
|
| 571 |
+
"name": "ipython",
|
| 572 |
+
"version": 3
|
| 573 |
+
},
|
| 574 |
+
"file_extension": ".py",
|
| 575 |
+
"mimetype": "text/x-python",
|
| 576 |
+
"name": "python",
|
| 577 |
+
"nbconvert_exporter": "python",
|
| 578 |
+
"pygments_lexer": "ipython3",
|
| 579 |
+
"version": "3.9.7"
|
| 580 |
+
},
|
| 581 |
+
"vscode": {
|
| 582 |
+
"interpreter": {
|
| 583 |
+
"hash": "9510137371fb582fb03f4a48cfea1312dabd94192ffed7cc50b24473a7d892dd"
|
| 584 |
+
}
|
| 585 |
+
}
|
| 586 |
+
},
|
| 587 |
+
"nbformat": 4,
|
| 588 |
+
"nbformat_minor": 5
|
| 589 |
+
}
|
requirements.txt
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
numpy >= 1.2.*
|
| 2 |
+
streamlit == 1.22.0
|
| 3 |
+
beautifulsoup4==4.9.3
|
| 4 |
+
hydralit >=1.0.9
|
| 5 |
+
hydralit_components >=1.0.4
|
session_state.py
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Hack to add per-session state to Streamlit.
|
| 2 |
+
Usage
|
| 3 |
+
-----
|
| 4 |
+
>>> import SessionState
|
| 5 |
+
>>>
|
| 6 |
+
>>> session_state = SessionState.get(user_name='', favorite_color='black')
|
| 7 |
+
>>> session_state.user_name
|
| 8 |
+
''
|
| 9 |
+
>>> session_state.user_name = 'Mary'
|
| 10 |
+
>>> session_state.favorite_color
|
| 11 |
+
'black'
|
| 12 |
+
Since you set user_name above, next time your script runs this will be the
|
| 13 |
+
result:
|
| 14 |
+
>>> session_state = get(user_name='', favorite_color='black')
|
| 15 |
+
>>> session_state.user_name
|
| 16 |
+
'Mary'
|
| 17 |
+
"""
|
| 18 |
+
try:
|
| 19 |
+
import streamlit.report_thread as ReportThread
|
| 20 |
+
from streamlit.server.server import Server
|
| 21 |
+
except Exception:
|
| 22 |
+
# Streamlit >= 0.65.0
|
| 23 |
+
import streamlit.report_thread as ReportThread
|
| 24 |
+
from streamlit.server.server import Server
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
class SessionState(object):
|
| 28 |
+
def __init__(self, **kwargs):
|
| 29 |
+
"""A new SessionState object.
|
| 30 |
+
Parameters
|
| 31 |
+
----------
|
| 32 |
+
**kwargs : any
|
| 33 |
+
Default values for the session state.
|
| 34 |
+
Example
|
| 35 |
+
-------
|
| 36 |
+
>>> session_state = SessionState(user_name='', favorite_color='black')
|
| 37 |
+
>>> session_state.user_name = 'Mary'
|
| 38 |
+
''
|
| 39 |
+
>>> session_state.favorite_color
|
| 40 |
+
'black'
|
| 41 |
+
"""
|
| 42 |
+
for key, val in kwargs.items():
|
| 43 |
+
setattr(self, key, val)
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def get(**kwargs):
|
| 47 |
+
"""Gets a SessionState object for the current session.
|
| 48 |
+
Creates a new object if necessary.
|
| 49 |
+
Parameters
|
| 50 |
+
----------
|
| 51 |
+
**kwargs : any
|
| 52 |
+
Default values you want to add to the session state, if we're creating a
|
| 53 |
+
new one.
|
| 54 |
+
Example
|
| 55 |
+
-------
|
| 56 |
+
>>> session_state = get(user_name='', favorite_color='black')
|
| 57 |
+
>>> session_state.user_name
|
| 58 |
+
''
|
| 59 |
+
>>> session_state.user_name = 'Mary'
|
| 60 |
+
>>> session_state.favorite_color
|
| 61 |
+
'black'
|
| 62 |
+
Since you set user_name above, next time your script runs this will be the
|
| 63 |
+
result:
|
| 64 |
+
>>> session_state = get(user_name='', favorite_color='black')
|
| 65 |
+
>>> session_state.user_name
|
| 66 |
+
'Mary'
|
| 67 |
+
"""
|
| 68 |
+
# Hack to get the session object from Streamlit.
|
| 69 |
+
|
| 70 |
+
ctx = ReportThread.get_report_ctx()
|
| 71 |
+
|
| 72 |
+
this_session = None
|
| 73 |
+
|
| 74 |
+
current_server = Server.get_current()
|
| 75 |
+
if hasattr(current_server, '_session_infos'):
|
| 76 |
+
# Streamlit < 0.56
|
| 77 |
+
session_infos = Server.get_current()._session_infos.values()
|
| 78 |
+
else:
|
| 79 |
+
session_infos = Server.get_current()._session_info_by_id.values()
|
| 80 |
+
|
| 81 |
+
for session_info in session_infos:
|
| 82 |
+
s = session_info.session
|
| 83 |
+
if (
|
| 84 |
+
# Streamlit < 0.54.0
|
| 85 |
+
(hasattr(s, '_main_dg') and s._main_dg == ctx.main_dg)
|
| 86 |
+
or
|
| 87 |
+
# Streamlit >= 0.54.0
|
| 88 |
+
(not hasattr(s, '_main_dg') and s.enqueue == ctx.enqueue)
|
| 89 |
+
or
|
| 90 |
+
# Streamlit >= 0.65.2
|
| 91 |
+
(not hasattr(s, '_main_dg') and s._uploaded_file_mgr == ctx.uploaded_file_mgr)
|
| 92 |
+
):
|
| 93 |
+
this_session = s
|
| 94 |
+
|
| 95 |
+
if this_session is None:
|
| 96 |
+
raise RuntimeError(
|
| 97 |
+
"Oh noes. Couldn't get your Streamlit Session object. "
|
| 98 |
+
'Are you doing something fancy with threads?')
|
| 99 |
+
|
| 100 |
+
# Got the session object! Now let's attach some state into it.
|
| 101 |
+
|
| 102 |
+
if not hasattr(this_session, '_custom_session_state'):
|
| 103 |
+
this_session._custom_session_state = SessionState(**kwargs)
|
| 104 |
+
|
| 105 |
+
return this_session._custom_session_state
|