import pandas as pd import numpy as np import gradio as gr import plotly.express as px def process_file(file_obj): if file_obj is None: return "Please upload a dataset.", None, None try: if file_obj.name.endswith(".xlsx"): df = pd.read_excel(file_obj) else: df = pd.read_csv(file_obj) except Exception as e: return f"Error reading file: {e}", None, None # Clean df = df.dropna(how="all") required = {"CourseName","NPS","CompletionRate","LearnerSatisfaction","ContentQuality"} if not required.issubset(df.columns): return "Dataset missing expected columns (NPS, CompletionRate, etc.)", None, None # Compute QualityScore nps_norm = (df["NPS"].astype(float) + 100) / 2 score = 0.3*nps_norm + 0.3*(df["CompletionRate"].astype(float)*100) \ + 0.2*(df["LearnerSatisfaction"].astype(float)/5*100) \ + 0.2*df["ContentQuality"].astype(float) df["QualityScore"] = score.round(1) bar = px.bar(df, x="CourseName", y="QualityScore", title="Course Quality Score") heat = px.imshow(df[["NPS","CompletionRate","LearnerSatisfaction","ContentQuality"]].T, x=df["CourseName"], aspect="auto", title="Metrics Heatmap") return "Dataset processed successfully!", df, bar, heat demo = gr.Interface( fn=process_file, inputs=gr.File(label="Upload CSV/XLSX"), outputs=[ gr.Textbox(label="Status"), # for messages gr.Dataframe(label="Cleaned Data"), gr.Plot(label="Quality Score Bar"), gr.Plot(label="Metrics Heatmap") ], title="Course Quality Tracker" ) if __name__ == "__main__": demo.launch()