Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -193,6 +193,7 @@
|
|
| 193 |
# st.subheader("๐ Study vs Performance Trend")
|
| 194 |
# st.line_chart(df.set_index("Subject"))
|
| 195 |
# Smart Study Planner - FINAL VERSION
|
|
|
|
| 196 |
|
| 197 |
import streamlit as st
|
| 198 |
import numpy as np
|
|
@@ -240,16 +241,22 @@ class Student:
|
|
| 240 |
marks = [s.marks for s in self.subjects]
|
| 241 |
return np.max(marks), np.min(marks)
|
| 242 |
|
|
|
|
|
|
|
|
|
|
| 243 |
def performance_trend(self):
|
| 244 |
-
hours = [s.hours for s in self.subjects]
|
| 245 |
-
marks = [s.marks for s in self.subjects]
|
| 246 |
|
| 247 |
if len(hours) > 1:
|
| 248 |
-
|
|
|
|
|
|
|
|
|
|
| 249 |
return 0
|
| 250 |
|
| 251 |
# -------------------------------
|
| 252 |
-
# AI-STYLE SMART PREDICTION
|
| 253 |
# -------------------------------
|
| 254 |
def predict_performance(self):
|
| 255 |
hours = np.array([s.hours for s in self.subjects])
|
|
@@ -260,23 +267,17 @@ class Student:
|
|
| 260 |
|
| 261 |
avg_marks = np.mean(marks)
|
| 262 |
avg_hours = np.mean(hours)
|
|
|
|
| 263 |
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
trend = np.corrcoef(hours, marks)[0][1]
|
| 267 |
-
else:
|
| 268 |
-
trend = 0
|
| 269 |
-
|
| 270 |
-
# Consistency (low variance = better)
|
| 271 |
-
consistency = 1 / (1 + np.var(marks))
|
| 272 |
|
| 273 |
-
# Smart prediction formula
|
| 274 |
predicted = avg_marks \
|
| 275 |
+ (avg_hours * 1.5) \
|
| 276 |
+ (trend * 10) \
|
| 277 |
+ (consistency * 5)
|
| 278 |
|
| 279 |
-
return min(predicted, 100)
|
| 280 |
|
| 281 |
def get_grade(self, marks):
|
| 282 |
if marks >= 85:
|
|
@@ -296,12 +297,11 @@ class Student:
|
|
| 296 |
return min(self.subjects, key=lambda x: x.marks).name
|
| 297 |
|
| 298 |
def suggest_improvement(self):
|
| 299 |
-
|
| 300 |
-
return f"Focus more on {weak} and increase study hours by at least 2 hours."
|
| 301 |
|
| 302 |
|
| 303 |
# -------------------------------
|
| 304 |
-
# SESSION STATE (FIXED
|
| 305 |
# -------------------------------
|
| 306 |
|
| 307 |
if "student" not in st.session_state:
|
|
@@ -389,17 +389,22 @@ if st.button("๐ Analyze Performance"):
|
|
| 389 |
|
| 390 |
# ---------------- PREDICTION ----------------
|
| 391 |
st.subheader("๐ฎ Smart Prediction")
|
| 392 |
-
st.success(f"Expected Marks: {predicted:.2f}")
|
| 393 |
-
st.success(f"Predicted Grade: {predicted_grade}")
|
| 394 |
|
| 395 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 396 |
st.subheader("๐ Insights")
|
|
|
|
| 397 |
st.write(f"๐ Best Subject: **{student.best_subject()}**")
|
| 398 |
st.write(f"โ Weak Subject: **{student.weak_subject()}**")
|
| 399 |
|
| 400 |
st.info(student.suggest_improvement())
|
| 401 |
|
| 402 |
-
# ---------------- CONSISTENCY
|
| 403 |
marks_list = [s.marks for s in student.subjects]
|
| 404 |
consistency_score = 1 / (1 + np.var(marks_list))
|
| 405 |
st.write(f"๐ Consistency Score: {round(consistency_score, 2)}")
|
|
|
|
| 193 |
# st.subheader("๐ Study vs Performance Trend")
|
| 194 |
# st.line_chart(df.set_index("Subject"))
|
| 195 |
# Smart Study Planner - FINAL VERSION
|
| 196 |
+
# Smart Study Planner - FINAL STABLE VERSION
|
| 197 |
|
| 198 |
import streamlit as st
|
| 199 |
import numpy as np
|
|
|
|
| 241 |
marks = [s.marks for s in self.subjects]
|
| 242 |
return np.max(marks), np.min(marks)
|
| 243 |
|
| 244 |
+
# -------------------------------
|
| 245 |
+
# SAFE TREND CALCULATION
|
| 246 |
+
# -------------------------------
|
| 247 |
def performance_trend(self):
|
| 248 |
+
hours = np.array([s.hours for s in self.subjects])
|
| 249 |
+
marks = np.array([s.marks for s in self.subjects])
|
| 250 |
|
| 251 |
if len(hours) > 1:
|
| 252 |
+
trend = np.corrcoef(hours, marks)[0][1]
|
| 253 |
+
if np.isnan(trend):
|
| 254 |
+
trend = 0
|
| 255 |
+
return np.clip(trend, -1, 1)
|
| 256 |
return 0
|
| 257 |
|
| 258 |
# -------------------------------
|
| 259 |
+
# AI-STYLE SMART PREDICTION (FIXED)
|
| 260 |
# -------------------------------
|
| 261 |
def predict_performance(self):
|
| 262 |
hours = np.array([s.hours for s in self.subjects])
|
|
|
|
| 267 |
|
| 268 |
avg_marks = np.mean(marks)
|
| 269 |
avg_hours = np.mean(hours)
|
| 270 |
+
trend = self.performance_trend()
|
| 271 |
|
| 272 |
+
variance = np.var(marks)
|
| 273 |
+
consistency = 1 / (1 + variance)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 274 |
|
|
|
|
| 275 |
predicted = avg_marks \
|
| 276 |
+ (avg_hours * 1.5) \
|
| 277 |
+ (trend * 10) \
|
| 278 |
+ (consistency * 5)
|
| 279 |
|
| 280 |
+
return float(min(predicted, 100))
|
| 281 |
|
| 282 |
def get_grade(self, marks):
|
| 283 |
if marks >= 85:
|
|
|
|
| 297 |
return min(self.subjects, key=lambda x: x.marks).name
|
| 298 |
|
| 299 |
def suggest_improvement(self):
|
| 300 |
+
return f"Focus more on {self.weak_subject()} and increase study time by 2 hours."
|
|
|
|
| 301 |
|
| 302 |
|
| 303 |
# -------------------------------
|
| 304 |
+
# SESSION STATE (FIXED)
|
| 305 |
# -------------------------------
|
| 306 |
|
| 307 |
if "student" not in st.session_state:
|
|
|
|
| 389 |
|
| 390 |
# ---------------- PREDICTION ----------------
|
| 391 |
st.subheader("๐ฎ Smart Prediction")
|
|
|
|
|
|
|
| 392 |
|
| 393 |
+
if np.isnan(predicted):
|
| 394 |
+
st.error("Prediction error due to insufficient variation in data")
|
| 395 |
+
else:
|
| 396 |
+
st.success(f"Expected Marks: {predicted:.2f}")
|
| 397 |
+
st.success(f"Predicted Grade: {predicted_grade}")
|
| 398 |
+
|
| 399 |
+
# ---------------- INSIGHTS ----------------
|
| 400 |
st.subheader("๐ Insights")
|
| 401 |
+
|
| 402 |
st.write(f"๐ Best Subject: **{student.best_subject()}**")
|
| 403 |
st.write(f"โ Weak Subject: **{student.weak_subject()}**")
|
| 404 |
|
| 405 |
st.info(student.suggest_improvement())
|
| 406 |
|
| 407 |
+
# ---------------- CONSISTENCY ----------------
|
| 408 |
marks_list = [s.marks for s in student.subjects]
|
| 409 |
consistency_score = 1 / (1 + np.var(marks_list))
|
| 410 |
st.write(f"๐ Consistency Score: {round(consistency_score, 2)}")
|