Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import io | |
| import plotly.express as px | |
| import plotly.graph_objects as go | |
| import os | |
| # Define admin credentials | |
| ADMIN_EMAIL = os.environ["ACCOUNT"] | |
| ADMIN_PASSWORD = os.environ["PASSWORD"] | |
| # Variable to store uploaded grades file in memory | |
| grades_df = None | |
| # Admin login function | |
| def admin_login_function(email, password): | |
| if (email == ADMIN_EMAIL and password == ADMIN_PASSWORD): | |
| return gr.update(visible=False), gr.update(visible=True), | |
| else: | |
| raise gr.Error("wrong password 💥!", duration=5) | |
| # Intern login function | |
| def intern_login(email): | |
| results = intern_view(email) | |
| return gr.update(visible=False), gr.update(visible=True), results[0], results[1] | |
| # Admin upload function | |
| def admin_upload(file): | |
| global grades_df | |
| if file is not None: | |
| grades_df = pd.read_excel(file.name) | |
| return "File uploaded and processed successfully." | |
| else: | |
| return "Please upload a valid Excel file." | |
| # Function to generate performance analysis charts | |
| def performance_analysis(): | |
| if grades_df is not None: | |
| # Ensure 'Created At' is datetime | |
| grades_df['Created At'] = pd.to_datetime(grades_df['Created At']) | |
| grades_df['Date'] = grades_df['Created At'].dt.date | |
| # Group by date and calculate sum of grades | |
| daily_performance = grades_df.groupby('Date')['Grade'].sum().reset_index() | |
| # Line chart for daily performance | |
| line_chart = px.line(daily_performance, x='Date', y='Grade', title='Daily Performance (Total Grades)') | |
| email_performance = grades_df.groupby('Email')['Grade'].sum().reset_index() | |
| # Histogram of grades | |
| histogram = px.histogram(email_performance, x='Grade', nbins=20, title='Grade Distribution') | |
| # Box plot for grade statistics | |
| box_plot = px.box(email_performance, y='Grade', title='Grade Statistics') | |
| # Create a summary table | |
| summary_stats = email_performance['Grade'].describe().reset_index() | |
| summary_table = go.Figure(data=[go.Table( | |
| header=dict(values=['Statistic', 'Value']), | |
| cells=dict(values=[summary_stats['index'], summary_stats['Grade']]) | |
| )]) | |
| return line_chart, histogram, box_plot, summary_table | |
| else: | |
| return None, None, None, None | |
| MAX_SCORE = 25*2 # Assuming the maximum possible score is 100 | |
| def intern_view(email): | |
| if grades_df is not None: | |
| intern_grades = grades_df[grades_df['Email'] == email] | |
| daily_performance = intern_grades.groupby('Date')['Grade'].sum().reset_index() | |
| line_chart = px.line(daily_performance, x='Date', y='Grade', title='Daily Performance (Total Grades)') | |
| if not intern_grades.empty: | |
| total_grade = intern_grades['Grade'].sum() | |
| average_grade = intern_grades['Grade'].mean() | |
| num_records = intern_grades.shape[0] | |
| # Normalize the score to MAX_SCORE | |
| normalized_score = min(total_grade / MAX_SCORE, 1) | |
| # Determine the color level | |
| if normalized_score <= 0.8: | |
| color = "red" | |
| else: | |
| color = "green" | |
| # <div style="background-color:{color}; padding:10px; border-radius:5px;"> | |
| # **Performance Level**: {color.capitalize()} | |
| # </div> | |
| # - Quá 3 assignment đạt level đỏ sẽ phải liên hệ manager để giải trình | |
| # Return as a Markdown formatted string | |
| return f""" | |
| ### Grade Analysis for {email} | |
| - **Tổng điểm**: {normalized_score} | |
| - **số lần upload**: {num_records} | |
| """, line_chart | |
| else: | |
| return gr.Error("No records found for this email. 💥!", duration=5) | |
| else: | |
| return gr.Error("No grades file uploaded. Please contact the admin.", duration=5) | |
| # Create the Gradio interface | |
| with gr.Blocks() as demo: | |
| with gr.Tab("Admin Login"): | |
| with gr.Column(visible=True) as admin_login_section: | |
| admin_email = gr.Textbox(label="Admin Email") | |
| admin_password = gr.Textbox(label="Admin Password", type="password") | |
| admin_login_button = gr.Button("Login") | |
| admin_login_output = gr.Textbox(label="Admin Output") | |
| with gr.Column(visible=False) as admin_upload_section: | |
| with gr.Column() as update_file_section: | |
| admin_file = gr.File(label="Upload Grades Excel File") | |
| admin_submit = gr.Button("Submit") | |
| admin_file_output = gr.Textbox(label="File Upload Output") | |
| admin_analyze = gr.Button("Analyze") | |
| admin_charts = gr.Plot() | |
| admin_histogram = gr.Plot() | |
| admin_box_plot = gr.Plot() | |
| admin_summary_table = gr.Plot() | |
| admin_login_button.click( | |
| admin_login_function, | |
| inputs=[admin_email, admin_password], | |
| outputs=[admin_login_section, admin_upload_section], | |
| show_progress=True, | |
| ) | |
| admin_submit.click( | |
| admin_upload, | |
| inputs=[admin_file], | |
| outputs=admin_file_output, | |
| ) | |
| admin_analyze.click( | |
| performance_analysis, | |
| outputs=[admin_charts, admin_histogram, admin_box_plot, admin_summary_table], | |
| ) | |
| with gr.Tab("Intern Login"): | |
| with gr.Column(visible=True) as intern_login_section: | |
| intern_email = gr.Textbox(label="Intern Email") | |
| intern_login_button = gr.Button("Find") | |
| intern_login_output = gr.Textbox(label="Intern Output") | |
| with gr.Column(visible=False) as intern_info_section: | |
| intern_output = gr.Markdown(label="Grade Analysis") | |
| intern_charts = gr.Plot() | |
| intern_login_button.click( | |
| intern_login, | |
| inputs=[intern_email], | |
| outputs=[intern_login_section, intern_info_section, intern_output, intern_charts], | |
| show_progress=True, | |
| ) | |
| # intern_submit.click( | |
| # intern_view, | |
| # inputs=[intern_email], | |
| # outputs=intern_output, | |
| # ) | |
| # Launch the app | |
| demo.launch(debug=True) | |