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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -113
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import streamlit as st
2
  import numpy as np
3
  import joblib
 
4
 
5
  # ===== Load models =====
6
  model_full = joblib.load("random_forest_model_full.pkl")
@@ -16,7 +17,7 @@ st.markdown("""
16
  font-family: 'Poppins', sans-serif;
17
  }
18
  .block-container {
19
- padding: 2rem;
20
  }
21
  .stButton button {
22
  background: linear-gradient(90deg, #4F8BF9 0%, #8E2DE2 100%);
@@ -36,55 +37,40 @@ st.markdown("<h1 style='text-align: center; color: #003366;'>🎓 DỰ ĐOÁN KH
36
  st.markdown("<h4 style='text-align: center; color: #666;'>Áp dụng cho sinh viên năm 3</h4>", unsafe_allow_html=True)
37
  st.write("---")
38
 
39
-
40
  # ===== SIDEBAR: chọn mô hình =====
41
- model_type = st.sidebar.selectbox("🧠 Chọn mô hình dự báo:", [
42
- "Dùng toàn bộ đặc trưng",
43
- "Dùng đặc trưng quan trọng"
44
- ])
45
 
 
46
 
47
- # ===== Ví dụ mẫu cho FULL MODEL (9 feature/kỳ) =====
48
  sample_cntt_example_full = {
49
  "name": "Nguyễn Văn A",
50
  "student_id": "10117367",
51
  "major": "Công nghệ thông tin",
52
  "semester_data": [
53
- 0,0,0,0,17,7,7,8.73,6,
54
- 0,0,0,0,17,7,7,8.19,5,
55
- 0,0,0,0,17,7,7,7.90,5,
56
- 0,0,0,0,17,7,7,8.19,6,
57
- 0,0,0,0,19,7,6,8.18,6,
58
- 0,0,0,0,19,7,5,7.10,5
59
  ]
60
  }
61
 
62
- sample_kinhte_example_full = {
63
- "name": "Trần Thị C",
64
- "student_id": "11418093",
65
- "major": "Kinh tế",
66
- "semester_data": [
67
- 0,0,0,0,16,6,6,7.00,5,
68
- 0,0,0,0,18,7,7,8.20,6,
69
- 0,0,0,0,17,7,7,7.80,5,
70
- 0,0,0,0,17,7,6,7.90,5,
71
- 0,0,0,0,19,8,5,8.10,6,
72
- 0,0,8,2,19,7,6,7.30,5
73
- ]
74
- }
75
-
76
- # ===== Ví dụ cho SIMPLE MODEL (3 feature/kỳ) =====
77
  sample_cntt_example_simple = {
78
  "name": "Nguyễn Văn B",
79
  "student_id": "10117368",
80
  "major": "Công nghệ thông tin",
81
  "semester_data": [
82
- 15,8,6.50,
83
- 17,15,6.10,
84
- 18,7,5.90,
85
- 17,7,5.80,
86
- 19,8,6.30,
87
- 19,10,6.20
88
  ]
89
  }
90
 
@@ -93,113 +79,126 @@ sample_kinhte_example_simple = {
93
  "student_id": "11418092",
94
  "major": "Kinh tế",
95
  "semester_data": [
96
- 17,0,7.64,
97
- 17,0,7.19,
98
- 17,2,6.94,
99
- 17,0,7.19,
100
- 19,0,7.65,
101
- 19,0,7.49
102
  ]
103
  }
104
 
105
-
106
- # ===== CHỌN VÍ DỤ =====
107
- sample_option = st.selectbox("📝 Chọn ví dụ:", [
108
- "Không dụ",
109
- "Dùng ví dụ mẫu ngành Công nghệ thông tin",
110
- "Dùng dụ mẫu ngành Kinh tế"
111
- ])
 
 
 
 
 
 
112
 
113
  # ===== Thông tin cá nhân =====
114
  if sample_option == "Dùng ví dụ mẫu ngành Công nghệ thông tin":
115
- example = sample_cntt_example_full if model_type == "Dùng toàn bộ đặc trưng" else sample_cntt_example_simple
 
 
116
  elif sample_option == "Dùng ví dụ mẫu ngành Kinh tế":
117
- example = sample_kinhte_example_full if model_type == "Dùng toàn bộ đặc trưng" else sample_kinhte_example_simple
 
 
118
  else:
119
- example = None
120
-
121
- name = st.text_input("👤 Họ và tên", value=example["name"] if example else "")
122
- student_id = st.text_input("🎓 Mã sinh viên", value=example["student_id"] if example else "")
123
- major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"],
124
- index=0 if not example else (0 if example["major"] == "Công nghệ thông tin" else 1))
125
 
126
  st.write("---")
127
 
128
-
129
- # ===== HÀM NHẬP DỮ LIỆU =====
130
- def input_full_semester(label, default):
131
- with st.expander(label, expanded=True):
132
- results = []
133
- fields = [
134
- "Số môn không thi", "Số tín chỉ không thi", "Số tín chỉ nợ", "Số môn không đạt",
135
- "Tổng tín chỉ học kỳ", "Số môn học kỳ", "Số môn đạt", "GPA", "Xếp loại"
136
- ]
137
-
138
- col1, col2, col3 = st.columns(3)
139
- for i, field in enumerate(fields):
140
- value = default[i] if default else 0
141
- with (col1 if i < 3 else col2 if i < 6 else col3):
142
- if i == 7:
143
- value = st.number_input(f"{field}", 0.0, 10.0, value=float(value), step=0.01)
144
- elif i == 8:
145
- value = st.selectbox(f"{field}", list(range(7)), index=value)
146
- else:
147
- value = st.number_input(f"{field}", 0, value=value)
148
- results.append(value)
149
-
150
- return results
151
-
152
-
153
- def input_simple_semester(label, default):
154
- with st.expander(label, expanded=True):
155
- col1, col2, col3 = st.columns(3)
156
- sotc_qua = col1.number_input(f"Số tín chỉ đạt - {label}", 0, value=default[0] if default else 0)
157
- sotc_no = col2.number_input(f"Số tín chỉ nợ - {label}", 0, value=default[1] if default else 0)
158
- gpa = col3.number_input(f"GPA - {label}", 0.0, 10.0, value=default[2] if default else 0.0, step=0.01)
159
- return [sotc_qua, sotc_no, gpa]
160
-
161
-
162
- # ===== NHẬP DỮ LIỆU =====
163
- 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"]
164
  data = []
 
165
 
166
  if model_type == "Dùng toàn bộ đặc trưng":
167
- st.subheader("🔢 Nhập thông tin đầy đủ 6 học kỳ")
168
-
169
- for i, sem in enumerate(semesters):
170
- default_values = example["semester_data"][i*9:(i+1)*9] if example else None
171
- data += input_full_semester(sem, default_values)
172
-
173
- final_features = np.array(data).reshape(1, -1)
174
 
175
  else:
176
  st.subheader("✨ Nhập thông tin rút gọn")
 
 
 
177
 
178
- for i, sem in enumerate(semesters):
179
- default_values = example["semester_data"][i*3:(i+1)*3] if example else None
180
- data += input_simple_semester(sem, default_values)
 
 
 
 
 
181
 
182
- final_features = np.array(data).reshape(1, -1)
183
 
 
184
 
185
- # ===== PREDICT =====
186
  if st.button("🎯 DỰ BÁO"):
187
  if model_type == "Dùng toàn bộ đặc trưng":
188
- prediction = model_full.predict(final_features)[0]
189
-
190
- if prediction == 0: # 0 = tốt nghiệp đúng hạn (theo hình của bạn)
191
- st.success(f"🎉 Chúc mừng {name}! Bạn có khả năng tốt nghiệp đúng hạn!")
192
  st.balloons()
193
  else:
194
- st.error(f"⚠️ Bạn nguy trễ hạn, cần cố gắng hơn!")
195
  st.snow()
196
 
197
  else:
198
- prediction = model_important.predict(final_features)[0]
199
-
200
- if prediction == 1: # 1 = đúng hạn trong simple model
201
- st.success(f"🎉 Chúc mừng {name}! Bạn có khả năng tốt nghiệp đúng hạn!")
202
  st.balloons()
203
  else:
204
- st.error(f"⚠️ Bạn nguy trễ hạn, cần cố gắng hơn!")
205
  st.snow()
 
1
  import streamlit as st
2
  import numpy as np
3
  import joblib
4
+ import json
5
 
6
  # ===== Load models =====
7
  model_full = joblib.load("random_forest_model_full.pkl")
 
17
  font-family: 'Poppins', sans-serif;
18
  }
19
  .block-container {
20
+ padding: 2rem 2rem 2rem 2rem;
21
  }
22
  .stButton button {
23
  background: linear-gradient(90deg, #4F8BF9 0%, #8E2DE2 100%);
 
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 ví 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
 
 
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 ví dụ mẫu ngành Công nghệ thông tin":
107
+ name = st.text_input("👤 Họ 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ọ 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)
125
+ with col1:
126
+ somon0thi = st.number_input("Số môn không thi", 0, value=default_values[0] if default_values else 0, key=f"sm0_{semester_label}")
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 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! Có nguy cơ 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 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()