namngo commited on
Commit
9dc270a
·
verified ·
1 Parent(s): af88be2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +14 -49
app.py CHANGED
@@ -1,50 +1,14 @@
1
  import streamlit as st
2
  import numpy as np
3
  import joblib
4
- import gspread
5
- from oauth2client.service_account import ServiceAccountCredentials
6
- from datetime import datetime
7
- import pytz
8
-
9
- # ===== CẤU HÌNH GOOGLE SHEETS =====
10
- def save_to_google_sheet(name, student_id, major, semester_data, prediction_result):
11
- scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
12
- creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
13
- client = gspread.authorize(creds)
14
- sheet = client.open_by_url("https://docs.google.com/spreadsheets/d/1i7bDNvLVLXN93_e-FN0JLzpg1jb64Z_aEuyPjIfwbdQ/edit?usp=sharing")
15
- worksheet = sheet.sheet1
16
-
17
- # Lấy ngày giờ hiện tại theo giờ Việt Nam
18
- vn_time = datetime.now(pytz.timezone('Asia/Ho_Chi_Minh'))
19
- time_string = vn_time.strftime("%Y-%m-%d %H:%M:%S")
20
-
21
- # Kiểm tra nếu sheet chưa có header thì thêm header
22
- if worksheet.row_count == 0 or worksheet.cell(1, 1).value is None:
23
- header = ["Ngày giờ nhập", "Họ và tên", "Mã sinh viên", "Ngành học"]
24
- for i in range(1, 7):
25
- hk_label = f"HK{i}_"
26
- header += [
27
- hk_label + "Số môn 0 thi",
28
- hk_label + "Số TC 0 thi",
29
- hk_label + "Số TC nợ",
30
- hk_label + "Số môn không đạt",
31
- hk_label + "Tổng số TC",
32
- hk_label + "Tổng số môn",
33
- hk_label + "Số môn đạt",
34
- hk_label + "GPA",
35
- hk_label + "Xếp loại",
36
- ]
37
- header.append("Kết quả dự đoán")
38
- worksheet.append_row(header)
39
-
40
- # Tạo dòng dữ liệu mới
41
- new_row = [time_string, name, student_id, major] + semester_data + [prediction_result]
42
- worksheet.append_row(new_row)
43
-
44
- # ===== CẤU HÌNH TRANG =====
45
  st.set_page_config(page_title="Dự đoán tốt nghiệp đúng hạn", page_icon="🎓", layout="wide")
46
 
47
- # Inject custom CSS
48
  st.markdown("""
49
  <style>
50
  html, body, [class*="css"] {
@@ -65,8 +29,10 @@ st.markdown("""
65
  </style>
66
  """, unsafe_allow_html=True)
67
 
68
- # ===== Load Model =====
69
- model = joblib.load("TomekLinks_rf_model.pkl")
 
 
70
 
71
  # ===== BỘ VÍ DỤ MẪU =====
72
  sample_cntt_example = {
@@ -123,11 +89,13 @@ st.write("---")
123
  def input_semester(semester_label, default_values=None):
124
  with st.expander(f"📖 {semester_label}", expanded=True):
125
  col1, col2 = st.columns(2)
 
126
  with col1:
127
  somon0thi = st.number_input("Số môn không thi", min_value=0, value=default_values[0] if default_values else 0, key=f"somon0thi_{semester_label}")
128
  sotc0thi = st.number_input("Số tín chỉ không thi", min_value=0, value=default_values[1] if default_values else 0, key=f"sotc0thi_{semester_label}")
129
  sotcno = st.number_input("Số tín chỉ nợ", min_value=0, value=default_values[2] if default_values else 0, key=f"sotcno_{semester_label}")
130
  mhno = st.number_input("Số môn không đạt", min_value=0, value=default_values[3] if default_values else 0, key=f"mhno_{semester_label}")
 
131
  with col2:
132
  TCHK = st.number_input("Tổng số tín chỉ", min_value=0, value=default_values[4] if default_values else 0, key=f"TCHK_{semester_label}")
133
  smhk = st.number_input("Tổng số môn học kỳ", min_value=0, value=default_values[5] if default_values else 0, key=f"smhk_{semester_label}")
@@ -164,19 +132,16 @@ for idx, sem in enumerate(semesters):
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
- # ===== Predict and Save =====
168
  st.write("")
169
  if st.button("🎯 DỰ BÁO"):
170
  prediction = model.predict(final_features)
171
 
172
  if prediction[0] == 1:
173
- result_text = "Đúng hạn"
174
  st.success(f"🎉 Chúc mừng bạn {name} - {major}! Bạn có khả năng tốt nghiệp đúng hạn!")
175
  st.balloons()
176
  else:
177
- result_text = "Trễ hạn"
178
  st.error(f"⚠️ Bạn {name} - {major} cần cố gắng hơn! Có nguy cơ trễ hạn.")
179
  st.snow()
180
 
181
- # Gửi dữ liệu lên Google Sheets
182
- save_to_google_sheet(name, student_id, major, data, result_text)
 
1
  import streamlit as st
2
  import numpy as np
3
  import joblib
4
+
5
+ # ===== Load model =====
6
+ model = joblib.load("D:/Pycharm/Project3/TomekLinks_rf_model.pkl")
7
+
8
+ # ===== Setup page =====
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  st.set_page_config(page_title="Dự đoán tốt nghiệp đúng hạn", page_icon="🎓", layout="wide")
10
 
11
+ # ===== Custom CSS =====
12
  st.markdown("""
13
  <style>
14
  html, body, [class*="css"] {
 
29
  </style>
30
  """, unsafe_allow_html=True)
31
 
32
+ # ===== HEADER =====
33
+ st.markdown("<h1 style='text-align: center; color: #003366;'>🎓 DỰ BÁO KHẢ NĂNG TỐT NGHIỆP ĐÚNG HẠN</h1>", unsafe_allow_html=True)
34
+ st.markdown("<h4 style='text-align: center; color: #666;'>Áp dụng cho sinh viên năm 3</h4>", unsafe_allow_html=True)
35
+ st.write("---")
36
 
37
  # ===== BỘ VÍ DỤ MẪU =====
38
  sample_cntt_example = {
 
89
  def input_semester(semester_label, default_values=None):
90
  with st.expander(f"📖 {semester_label}", expanded=True):
91
  col1, col2 = st.columns(2)
92
+
93
  with col1:
94
  somon0thi = st.number_input("Số môn không thi", min_value=0, value=default_values[0] if default_values else 0, key=f"somon0thi_{semester_label}")
95
  sotc0thi = st.number_input("Số tín chỉ không thi", min_value=0, value=default_values[1] if default_values else 0, key=f"sotc0thi_{semester_label}")
96
  sotcno = st.number_input("Số tín chỉ nợ", min_value=0, value=default_values[2] if default_values else 0, key=f"sotcno_{semester_label}")
97
  mhno = st.number_input("Số môn không đạt", min_value=0, value=default_values[3] if default_values else 0, key=f"mhno_{semester_label}")
98
+
99
  with col2:
100
  TCHK = st.number_input("Tổng số tín chỉ", min_value=0, value=default_values[4] if default_values else 0, key=f"TCHK_{semester_label}")
101
  smhk = st.number_input("Tổng số môn học kỳ", min_value=0, value=default_values[5] if default_values else 0, key=f"smhk_{semester_label}")
 
132
  nganh = 0 if major == "Công nghệ thông tin" else 1
133
  final_features = np.array(data + [nganh]).reshape(1, -1)
134
 
135
+ # ===== Predict Button =====
136
  st.write("")
137
  if st.button("🎯 DỰ BÁO"):
138
  prediction = model.predict(final_features)
139
 
140
  if prediction[0] == 1:
 
141
  st.success(f"🎉 Chúc mừng bạn {name} - {major}! Bạn có khả năng tốt nghiệp đúng hạn!")
142
  st.balloons()
143
  else:
 
144
  st.error(f"⚠️ Bạn {name} - {major} cần cố gắng hơn! Có nguy cơ trễ hạn.")
145
  st.snow()
146
 
147
+