syeda-Rija20 commited on
Commit
4fe98e2
ยท
verified ยท
1 Parent(s): 174e9d3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -21
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
- return np.corrcoef(hours, marks)[0][1]
 
 
 
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
- # Trend (relationship between hours and marks)
265
- if len(hours) > 1:
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
- weak = self.weak_subject()
300
- return f"Focus more on {weak} and increase study hours by at least 2 hours."
301
 
302
 
303
  # -------------------------------
304
- # SESSION STATE (FIXED LOGIC)
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
- # ---------------- EXTRA INSIGHTS ----------------
 
 
 
 
 
 
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 SCORE ----------------
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)}")