File size: 3,215 Bytes
8f1690f
2cb9b91
8f1690f
2cb9b91
 
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
5bc09a4
2cb9b91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f1690f
2cb9b91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f1690f
2cb9b91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62d21f3
2cb9b91
62d21f3
 
cd281b7
62d21f3
 
2cb9b91
62d21f3
 
 
2cb9b91
 
 
 
cd281b7
2cb9b91
8f1690f
3ea9b67
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()