Spaces:
Sleeping
Sleeping
| 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() | |