import gradio as gr import pandas as pd # Grading scheme mapping function def percentage_to_gpa_letter(percent): if percent >= 90: return 4.0, "A+" elif percent >= 85: return 4.0, "A" elif percent >= 80: return 3.66, "A-" elif percent >= 75: return 3.33, "B+" elif percent >= 71: return 3.0, "B" elif percent >= 68: return 2.66, "B-" elif percent >= 61: return 2.0, "C" elif percent >= 50: return 1.0, "D" else: return 0.0, "F" # Calculate projected GPA based on weightage and achieved percentages def calculate_projected_gpa(df): total_score = 0 total_weight = 0 for _, row in df.iterrows(): # Calculate total score based on weightage and achieved % total_weight_row = row['Assignment Weight'] + row['Quiz Weight'] + row['GDB Weight'] + row['Midterm Weight'] + row['Final Weight'] achieved = (row['Assignment Weight']*row['Assignment Achieved'] + row['Quiz Weight']*row['Quiz Achieved'] + row['GDB Weight']*row['GDB Achieved'] + row['Midterm Weight']*row['Midterm Achieved'] + row['Final Weight']*row['Final Achieved']) / total_weight_row gpa, grade = percentage_to_gpa_letter(achieved) df.at[_, 'GPA'] = gpa df.at[_, 'Grade'] = grade total_score += gpa total_weight += 1 projected_gpa = total_score / total_weight if total_weight != 0 else 0 return df, f"{projected_gpa:.2f}" # Default course table data = { "Include": [True]*5, "Course Code": ["CS401","CS403","CS502","CS604","MTH501"], "Assignment Weight": [10,10,10,10,10], "Quiz Weight": [10,10,10,10,10], "GDB Weight": [10,10,10,10,10], "Midterm Weight": [30,30,30,30,30], "Final Weight": [40,40,40,40,40], "Assignment Achieved": [80,70,90,85,75], "Quiz Achieved": [85,75,95,80,70], "GDB Achieved": [90,80,85,90,75], "Midterm Achieved": [75,70,80,85,70], "Final Achieved": [50,50,50,50,50], # Default slider value "GPA": [0]*5, "Grade": [""]*5 } df = pd.DataFrame(data) # Gradio app with gr.Blocks() as app: gr.Markdown("## 📊 Projected CGPA Calculator (Weighted Scores)") with gr.Row(): with gr.Column(scale=3): table = gr.Dataframe( value=df, headers=list(df.columns), datatype=["bool","str"] + ["number"]*10 + ["number","str"], row_count=(5,"dynamic"), interactive=True ) with gr.Column(scale=1): gr.Markdown("### 🎓 Projected CGPA") cgpa_display = gr.Textbox(value="0.00", interactive=False, elem_id="gpa_big", lines=1) # Slider style for Final Achieved app.css = """ #gpa_big textarea { font-size: 120px !important; font-weight: bold; text-align: center; color: #1a73e8; } """ # Update GPA function def update_table(df): df, projected_gpa = calculate_projected_gpa(df) return df, projected_gpa table.change(update_table, inputs=table, outputs=[table,cgpa_display]) app.launch()