namngo commited on
Commit
40ffc49
·
verified ·
1 Parent(s): f5c878a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +212 -79
app.py CHANGED
@@ -37,88 +37,192 @@ st.markdown("<h1 style='text-align: center; color: #003366;'>🎓 DỰ ĐOÁN KH
37
  st.markdown("<h4 style='text-align: center; color: #666;'>Áp dụng cho sinh viên năm 3</h4>", unsafe_allow_html=True)
38
  st.write("---")
39
 
40
- # ===== SIDEBAR: chọn mô hình =====
41
- model_type = st.sidebar.selectbox("🧠 Chọn mô hình dự báo:", ["Dùng toàn bộ đặc trưng", "Dùng đặc trưng quan trọng"])
42
 
43
- # ===== Giao diện nhập ví dụ =====
44
- st.subheader("🔢 Chọn dụ mẫu hoặc nhập thông tin cá nhân")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
46
- sample_option = st.selectbox("📝 Chọn ví dụ:", ["Không ví dụ", "Dùng ví dụ mẫu ngành Công nghệ thông tin", "Dùng ví dụ mẫu ngành Kinh tế"])
47
 
48
- # ===== Ví dụ mẫu =====
49
- sample_cntt_example_full = {
 
50
  "name": "Nguyễn Văn A",
51
- "student_id": "10117367",
52
  "major": "Công nghệ thông tin",
53
  "semester_data": [
54
- 0, 0, 0, 0, 17, 7, 7, 8.73, 6,
55
- 0, 0, 0, 0, 17, 7, 7, 8.19, 5,
56
- 0, 0, 0, 0, 17, 7, 7, 7.90, 5,
57
- 0, 0, 0, 0, 17, 7, 7, 8.19, 6,
58
- 0, 0, 0, 0, 19, 7, 6, 8.18, 6,
59
- 0, 0, 5, 2, 19, 7, 5, 7.10, 5
60
  ]
61
  }
62
 
63
- sample_cntt_example_simple = {
64
  "name": "Nguyễn Văn B",
65
- "student_id": "10117368",
66
  "major": "Công nghệ thông tin",
67
  "semester_data": [
68
- 15, 8, 6.50,
69
- 17, 15, 6.10,
70
- 18, 7, 5.90,
71
- 17, 7, 5.80,
72
- 19, 8, 6.30,
73
- 19, 10, 6.20
74
  ]
75
  }
76
 
77
- sample_kinhte_example_simple = {
78
- "name": "Trần Thị B",
79
- "student_id": "11418092",
80
  "major": "Kinh tế",
81
  "semester_data": [
82
- 17, 0, 7.64,
83
- 17, 0, 7.19,
84
- 17, 2, 6.94,
85
- 17, 0, 7.19,
86
- 19, 0, 7.65,
87
- 19, 0, 7.49
88
  ]
89
  }
90
 
91
- sample_kinhte_example_full = {
92
- "name": "Trần Thị C",
93
- "student_id": "11418093",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  "major": "Kinh tế",
95
  "semester_data": [
96
- 0, 0, 0, 0, 16, 6, 6, 7.00, 5,
97
- 0, 0, 0, 0, 18, 7, 7, 8.20, 6,
98
- 0, 0, 0, 0, 17, 7, 7, 7.80, 5,
99
- 0, 0, 0, 0, 17, 7, 6, 7.90, 5,
100
- 0, 0, 0, 0, 19, 8, 5, 8.10, 6,
101
- 0, 0, 8, 2, 19, 7, 6, 7.30, 5
102
  ]
103
  }
104
 
105
- # ===== Thông tin cá nhân =====
106
- if sample_option == "Dùng dụ mẫu ngành Công nghệ thông tin":
107
- name = st.text_input("👤 Họ và tên", value=sample_cntt_example_full["name"])
108
- student_id = st.text_input("🎓 Mã sinh viên", value=sample_cntt_example_full["student_id"])
109
- major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"], index=0)
110
- elif sample_option == "Dùng ví dụ mẫu ngành Kinh tế":
111
- name = st.text_input("👤 Họ và tên", value=sample_kinhte_example_simple["name"])
112
- student_id = st.text_input("🎓 Mã sinh viên", value=sample_kinhte_example_simple["student_id"])
113
- major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"], index=1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  else:
115
  name = st.text_input("👤 Họ và tên")
116
  student_id = st.text_input("🎓 Mã sinh viên")
117
  major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"])
118
 
 
119
  st.write("---")
120
 
121
- # ===== Nhập thông tin học kỳ =====
 
 
 
 
122
  def input_semester(semester_label, default_values=None):
123
  with st.expander(f"📖 {semester_label}", expanded=True):
124
  col1, col2 = st.columns(2)
@@ -127,78 +231,107 @@ def input_semester(semester_label, default_values=None):
127
  sotc0thi = st.number_input("Số tín chỉ không thi", 0, value=default_values[1] if default_values else 0, key=f"tc0_{semester_label}")
128
  sotcno = st.number_input("Số tín chỉ nợ", 0, value=default_values[2] if default_values else 0, key=f"tcno_{semester_label}")
129
  mhno = st.number_input("Số môn không đạt", 0, value=default_values[3] if default_values else 0, key=f"mhno_{semester_label}")
 
130
  try:
131
  default_tc_qua = default_values[4] - default_values[2] if default_values else 0
132
  except:
133
  default_tc_qua = 0
 
134
  sotc_qua = st.number_input("Số tín chỉ qua môn", 0, value=default_tc_qua, key=f"tcqua_{semester_label}")
 
135
  with col2:
136
  TCHK = st.number_input("Tổng tín chỉ học kỳ", 0, value=default_values[4] if default_values else 0, key=f"tchk_{semester_label}")
137
- smhk = st.number_input("Số môn học kỳ", 0, value=default_values[5] if default_values else 0, key=f"smhk_{semester_label}")
138
- mhpass = st.number_input("Số môn đạt", 0, value=default_values[6] if default_values else 0, key=f"mhpass_{semester_label}")
139
  TBCHK = st.number_input("GPA", 0.0, 10.0, value=default_values[7] if default_values else 0.0, step=0.01, key=f"gpa_{semester_label}")
140
- xep_loai_selected = st.selectbox("Xếp loại", list(range(7)), index=default_values[8] if default_values else 0, key=f"xeploai_{semester_label}")
141
- return [somon0thi, sotc0thi, sotcno, mhno, TCHK, smhk, mhpass, TBCHK, xep_loai_selected, sotc_qua]
 
 
 
 
 
 
142
 
143
 
144
  def input_important_features(semester_label, default_values=None):
145
  with st.expander(f"📘 {semester_label}", expanded=True):
146
  col1, col2 = st.columns(2)
 
147
  with col1:
148
- sotc_qua = st.number_input("Số tín chỉ đạt", 0, value=default_values[0] if default_values else 0, key=f"tcqua_imp_{semester_label}")
149
- sotcno = st.number_input("Số tín chỉ nợ", 0, value=default_values[1] if default_values else 0, key=f"tcno_imp_{semester_label}")
 
 
 
 
 
 
150
  with col2:
151
- TBCHK = st.number_input("Điểm trung bình", 0.0, 10.0, value=default_values[2] if default_values else 0.0, step=0.01, key=f"gpa_imp_{semester_label}")
 
 
 
152
  return [sotc_qua, sotcno, TBCHK]
153
 
154
- # ===== Giao diện theo mô hình =====
 
 
 
 
155
  data = []
156
  semesters = ["HỌC KỲ I", "HỌC KỲ II", "HỌC KỲ III", "HỌC KỲ IV", "HỌC KỲ V", "HỌC KỲ VI"]
157
 
 
 
158
  if model_type == "Dùng toàn bộ đặc trưng":
159
- st.subheader("🔢 Nhập thông tin học kỳ chi tiết")
 
160
  for idx, sem in enumerate(semesters):
161
- example_data = sample_cntt_example_full if sample_option == "Dùng ví dụ mẫu ngành Công nghệ thông tin" else sample_kinhte_example_full if sample_option == "Dùng ví dụ mẫu ngành Kinh tế" else None
162
- default_values = example_data["semester_data"][idx*9:(idx+1)*9] if example_data else None
 
 
163
  data += input_semester(sem, default_values)
 
164
  nganh = 0 if major == "Công nghệ thông tin" else 1
165
  final_features = np.array(data + [nganh]).reshape(1, -1)
166
 
167
  else:
168
- st.subheader("✨ Nhập thông tin rút gọn")
169
- for idx, sem in enumerate(semesters):
170
- example_data = sample_cntt_example_simple if sample_option == "Dùng ví dụ mẫu ngành Công nghệ thông tin" else sample_kinhte_example_simple if sample_option == "Dùng ví dụ mẫu ngành Kinh tế" else None
171
- default_values = example_data["semester_data"][idx*3:(idx+1)*3] if example_data else None
172
 
173
- with st.expander(f"📘 {sem}", expanded=True):
174
- col1, col2, col3 = st.columns(3)
175
- with col1:
176
- sotc_qua = st.number_input(f"Số tín chỉ đạt - {sem}", 0, value=default_values[0] if default_values else 0, key=f"tcqua_imp_{sem}")
177
- with col2:
178
- sotcno = st.number_input(f"Số tín chỉ nợ - {sem}", 0, value=default_values[1] if default_values else 0, key=f"tcno_imp_{sem}")
179
- with col3:
180
- TBCHK = st.number_input(f"Điểm trung bình - {sem}", 0.0, 10.0, value=default_values[2] if default_values else 0.0, step=0.01, key=f"gpa_imp_{sem}")
181
 
182
- data += [sotc_qua, sotcno, TBCHK]
 
183
 
184
  final_features = np.array(data).reshape(1, -1)
185
 
186
- # ===== Predict =====
 
 
 
 
187
  if st.button("🎯 DỰ BÁO"):
188
  if model_type == "Dùng toàn bộ đặc trưng":
189
  prediction = model_full.predict(final_features)
 
190
  if prediction[0] == 0:
191
- st.success(f"🎉 Chúc mừng bạn {name} - {major}! Bạn có khả năng tốt nghiệp đúng hạn!")
192
  st.balloons()
193
  else:
194
- st.error(f"⚠️ Bạn {name} - {major} cần cố gắng hơn! nguy trễ hạn.")
195
  st.snow()
196
 
197
  else:
198
  prediction = model_important.predict(final_features)
 
199
  if prediction[0] == 1:
200
- st.success(f"🎉 Chúc m��ng bạn {name} - {major}! Bạn có khả năng tốt nghiệp đúng hạn!")
201
  st.balloons()
202
  else:
203
- st.error(f"⚠️ Bạn {name} - {major} cần cố gắng hơn! Có nguy cơ trễ hạn.")
204
  st.snow()
 
37
  st.markdown("<h4 style='text-align: center; color: #666;'>Áp dụng cho sinh viên năm 3</h4>", unsafe_allow_html=True)
38
  st.write("---")
39
 
 
 
40
 
41
+ # ===========================
42
+ # BỘ 8 DỤ
43
+ # ===========================
44
+
45
+ sample_options = [
46
+ "Không ví dụ",
47
+
48
+ # FULL DATA
49
+ "CNTT (Full) – Đúng hạn",
50
+ "CNTT (Full) – Không đúng hạn",
51
+ "Kinh tế (Full) – Đúng hạn",
52
+ "Kinh tế (Full) – Không đúng hạn",
53
+
54
+ # SIMPLE DATA
55
+ "CNTT (Simple) – Đúng hạn",
56
+ "CNTT (Simple) – Không đúng hạn",
57
+ "Kinh tế (Simple) – Đúng hạn",
58
+ "Kinh tế (Simple) – Không đúng hạn",
59
+ ]
60
 
61
+ sample_option = st.selectbox("📝 Chọn ví dụ:", sample_options)
62
 
63
+
64
+ # ===== FULL DATA EXAMPLES =====
65
+ sample_cntt_full_ok = {
66
  "name": "Nguyễn Văn A",
67
+ "student_id": "10117001",
68
  "major": "Công nghệ thông tin",
69
  "semester_data": [
70
+ 0,0,0,0,17,7,7,8.5,6,
71
+ 0,0,0,0,17,7,7,8.3,5,
72
+ 0,0,0,0,17,7,7,8.0,5,
73
+ 0,0,0,0,17,7,6,8.2,6,
74
+ 0,0,0,0,19,7,6,8.1,6,
75
+ 0,0,3,1,19,7,6,7.9,5
76
  ]
77
  }
78
 
79
+ sample_cntt_full_fail = {
80
  "name": "Nguyễn Văn B",
81
+ "student_id": "10117002",
82
  "major": "Công nghệ thông tin",
83
  "semester_data": [
84
+ 1,3,5,2,15,6,4,5.5,2,
85
+ 2,3,6,3,16,6,3,5.2,2,
86
+ 2,4,7,3,17,7,3,4.9,1,
87
+ 3,4,8,4,17,7,3,4.8,1,
88
+ 3,5,9,4,18,7,3,4.7,1,
89
+ 4,6,10,5,18,7,2,4.5,0
90
  ]
91
  }
92
 
93
+ sample_kinhte_full_ok = {
94
+ "name": "Trần Thị C",
95
+ "student_id": "11418001",
96
  "major": "Kinh tế",
97
  "semester_data": [
98
+ 0,0,0,0,16,6,6,7.0,5,
99
+ 0,0,0,0,18,7,7,8.2,6,
100
+ 0,0,0,0,17,7,7,7.8,5,
101
+ 0,0,0,0,17,7,7,8.0,6,
102
+ 0,0,0,0,19,7,7,8.3,6,
103
+ 0,0,0,0,19,7,7,8.1,6
104
  ]
105
  }
106
 
107
+ sample_kinhte_full_fail = {
108
+ "name": "Trần Thị D",
109
+ "student_id": "11418002",
110
+ "major": "Kinh tế",
111
+ "semester_data": [
112
+ 1,2,3,2,15,6,4,5.6,2,
113
+ 1,3,4,3,15,6,4,5.3,2,
114
+ 2,4,5,3,16,7,4,5.2,2,
115
+ 2,5,6,3,17,7,4,5.0,1,
116
+ 3,6,7,4,17,7,3,4.9,1,
117
+ 4,7,8,5,18,7,3,4.7,1
118
+ ]
119
+ }
120
+
121
+ # ===== SIMPLE DATA EXAMPLES =====
122
+ sample_cntt_simple_ok = {
123
+ "name": "Nguyễn Văn E",
124
+ "student_id": "10118001",
125
+ "major": "Công nghệ thông tin",
126
+ "semester_data": [
127
+ 17,0,7.2,
128
+ 17,0,7.0,
129
+ 18,0,6.8,
130
+ 18,0,6.9,
131
+ 19,0,7.1,
132
+ 19,0,7.0
133
+ ]
134
+ }
135
+
136
+ sample_cntt_simple_fail = {
137
+ "name": "Nguyễn Văn F",
138
+ "student_id": "10118002",
139
+ "major": "Công nghệ thông tin",
140
+ "semester_data": [
141
+ 12,10,5.2,
142
+ 12,12,5.0,
143
+ 13,14,4.8,
144
+ 14,13,4.7,
145
+ 15,12,4.9,
146
+ 15,13,4.6
147
+ ]
148
+ }
149
+
150
+ sample_kinhte_simple_ok = {
151
+ "name": "Trần Thị G",
152
+ "student_id": "11418003",
153
  "major": "Kinh tế",
154
  "semester_data": [
155
+ 17,0,7.5,
156
+ 17,0,7.2,
157
+ 17,0,7.0,
158
+ 18,0,7.3,
159
+ 18,0,7.4,
160
+ 19,0,7.5
161
  ]
162
  }
163
 
164
+ sample_kinhte_simple_fail = {
165
+ "name": "Trần Thị H",
166
+ "student_id": "11418004",
167
+ "major": "Kinh tế",
168
+ "semester_data": [
169
+ 12,10,5.3,
170
+ 12,11,5.0,
171
+ 13,12,4.9,
172
+ 13,13,4.8,
173
+ 14,12,4.7,
174
+ 14,13,4.5
175
+ ]
176
+ }
177
+
178
+
179
+ # ==============================
180
+ # LOAD EXAMPLE SELECTED
181
+ # ==============================
182
+
183
+ example_data = None
184
+
185
+ if sample_option == "CNTT (Full) – Đúng hạn":
186
+ example_data = sample_cntt_full_ok
187
+ elif sample_option == "CNTT (Full) – Không đúng hạn":
188
+ example_data = sample_cntt_full_fail
189
+ elif sample_option == "Kinh tế (Full) – Đúng hạn":
190
+ example_data = sample_kinhte_full_ok
191
+ elif sample_option == "Kinh tế (Full) – Không đúng hạn":
192
+ example_data = sample_kinhte_full_fail
193
+ elif sample_option == "CNTT (Simple) – Đúng hạn":
194
+ example_data = sample_cntt_simple_ok
195
+ elif sample_option == "CNTT (Simple) – Không đúng hạn":
196
+ example_data = sample_cntt_simple_fail
197
+ elif sample_option == "Kinh tế (Simple) – Đúng hạn":
198
+ example_data = sample_kinhte_simple_ok
199
+ elif sample_option == "Kinh tế (Simple) – Không đúng hạn":
200
+ example_data = sample_kinhte_simple_fail
201
+
202
+
203
+
204
+ # ===============================
205
+ # NHẬP THÔNG TIN CÁ NHÂN
206
+ # ===============================
207
+
208
+ if example_data:
209
+ name = st.text_input("👤 Họ và tên", value=example_data["name"])
210
+ student_id = st.text_input("🎓 Mã sinh viên", value=example_data["student_id"])
211
+ major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"],
212
+ index=0 if example_data["major"] == "Công nghệ thông tin" else 1)
213
  else:
214
  name = st.text_input("👤 Họ và tên")
215
  student_id = st.text_input("🎓 Mã sinh viên")
216
  major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"])
217
 
218
+
219
  st.write("---")
220
 
221
+
222
+ # ===============================
223
+ # INPUT SEMESTER
224
+ # ===============================
225
+
226
  def input_semester(semester_label, default_values=None):
227
  with st.expander(f"📖 {semester_label}", expanded=True):
228
  col1, col2 = st.columns(2)
 
231
  sotc0thi = st.number_input("Số tín chỉ không thi", 0, value=default_values[1] if default_values else 0, key=f"tc0_{semester_label}")
232
  sotcno = st.number_input("Số tín chỉ nợ", 0, value=default_values[2] if default_values else 0, key=f"tcno_{semester_label}")
233
  mhno = st.number_input("Số môn không đạt", 0, value=default_values[3] if default_values else 0, key=f"mhno_{semester_label}")
234
+
235
  try:
236
  default_tc_qua = default_values[4] - default_values[2] if default_values else 0
237
  except:
238
  default_tc_qua = 0
239
+
240
  sotc_qua = st.number_input("Số tín chỉ qua môn", 0, value=default_tc_qua, key=f"tcqua_{semester_label}")
241
+
242
  with col2:
243
  TCHK = st.number_input("Tổng tín chỉ học kỳ", 0, value=default_values[4] if default_values else 0, key=f"tchk_{semester_label}")
244
+ smhk = st.number_input("Số môn học kỳ", 0, value=default_values[5] if default_values else 0, key=f"smhk_{semester_label"])
245
+ mhpass = st.number_input("Số môn đạt", 0, value=default_values[6] if default_values else 0, key=f"mhpass_{semester_label"])
246
  TBCHK = st.number_input("GPA", 0.0, 10.0, value=default_values[7] if default_values else 0.0, step=0.01, key=f"gpa_{semester_label}")
247
+ xep_loai_selected = st.selectbox("Xếp loại", list(range(7)),
248
+ index=default_values[8] if default_values else 0,
249
+ key=f"xeploai_{semester_label}")
250
+
251
+ return [
252
+ somon0thi, sotc0thi, sotcno, mhno,
253
+ TCHK, smhk, mhpass, TBCHK, xep_loai_selected, sotc_qua
254
+ ]
255
 
256
 
257
  def input_important_features(semester_label, default_values=None):
258
  with st.expander(f"📘 {semester_label}", expanded=True):
259
  col1, col2 = st.columns(2)
260
+
261
  with col1:
262
+ sotc_qua = st.number_input("Số tín chỉ đạt", 0,
263
+ value=default_values[0] if default_values else 0,
264
+ key=f"tcqua_imp_{semester_label}")
265
+
266
+ sotcno = st.number_input("Số tín chỉ nợ", 0,
267
+ value=default_values[1] if default_values else 0,
268
+ key=f"tcno_imp_{semester_label}")
269
+
270
  with col2:
271
+ TBCHK = st.number_input("Điểm trung bình", 0.0, 10.0,
272
+ value=default_values[2] if default_values else 0.0,
273
+ step=0.01, key=f"gpa_imp_{semester_label}")
274
+
275
  return [sotc_qua, sotcno, TBCHK]
276
 
277
+
278
+ # ===============================
279
+ # GENERATE FEATURES
280
+ # ===============================
281
+
282
  data = []
283
  semesters = ["HỌC KỲ I", "HỌC KỲ II", "HỌC KỲ III", "HỌC KỲ IV", "HỌC KỲ V", "HỌC KỲ VI"]
284
 
285
+ model_type = st.sidebar.selectbox("🧠 Chọn mô hình dự báo:", ["Dùng toàn bộ đặc trưng", "Dùng đặc trưng quan trọng"])
286
+
287
  if model_type == "Dùng toàn bộ đặc trưng":
288
+ st.subheader("🔢 Nhập thông tin học kỳ (Full Data)")
289
+
290
  for idx, sem in enumerate(semesters):
291
+ default_values = None
292
+ if example_data and len(example_data["semester_data"]) == 54:
293
+ default_values = example_data["semester_data"][idx*9:(idx+1)*9]
294
+
295
  data += input_semester(sem, default_values)
296
+
297
  nganh = 0 if major == "Công nghệ thông tin" else 1
298
  final_features = np.array(data + [nganh]).reshape(1, -1)
299
 
300
  else:
301
+ st.subheader("✨ Nhập thông tin rút gọn (Simple Data)")
 
 
 
302
 
303
+ for idx, sem in enumerate(semesters):
304
+ default_values = None
305
+ if example_data and len(example_data["semester_data"]) == 18:
306
+ default_values = example_data["semester_data"][idx*3:(idx+1)*3]
 
 
 
 
307
 
308
+ data_inputs = input_important_features(sem, default_values)
309
+ data += data_inputs
310
 
311
  final_features = np.array(data).reshape(1, -1)
312
 
313
+
314
+ # ===============================
315
+ # PREDICT BUTTON
316
+ # ===============================
317
+
318
  if st.button("🎯 DỰ BÁO"):
319
  if model_type == "Dùng toàn bộ đặc trưng":
320
  prediction = model_full.predict(final_features)
321
+
322
  if prediction[0] == 0:
323
+ st.success(f"🎉 Chúc mừng bạn {name}! Bạn có khả năng tốt nghiệp đúng hạn!")
324
  st.balloons()
325
  else:
326
+ st.error(f"⚠️ Bạn {name} nguy trễ hạn. Hãy cố gắng cải thiện nhé!")
327
  st.snow()
328
 
329
  else:
330
  prediction = model_important.predict(final_features)
331
+
332
  if prediction[0] == 1:
333
+ st.success(f"🎉 Chúc mừng bạn {name}! Bạn có khả năng tốt nghiệp đúng hạn!")
334
  st.balloons()
335
  else:
336
+ st.error(f"⚠️ Bạn {name} nguy cơ trễ hạn. Cần cố gắng hơn!")
337
  st.snow()