hbhamzabaig's picture
Update app.py
2cb9b91 verified
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()