|
|
import gradio as gr |
|
|
import matplotlib.pyplot as plt |
|
|
import numpy as np |
|
|
import pandas as pd |
|
|
import joblib |
|
|
import random |
|
|
|
|
|
|
|
|
model = joblib.load("xgb_model.joblib") |
|
|
df = pd.read_csv("worker_productivity.csv") |
|
|
|
|
|
|
|
|
teams = sorted(df['team'].unique()) |
|
|
|
|
|
|
|
|
def generate_task(): |
|
|
task = { |
|
|
'quarter': random.choice(['Q1', 'Q2', 'Q3', 'Q4']), |
|
|
'department': random.choice(['sewing', 'finishing']), |
|
|
'day': random.choice(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']), |
|
|
'no_of_workers': random.randint(30, 60), |
|
|
'incentive': round(random.uniform(1.0, 4.0), 2), |
|
|
'idle_time': round(random.uniform(0.0, 1.0), 2), |
|
|
'idle_men': random.randint(0, 10), |
|
|
'smv': round(random.uniform(20.0, 40.0), 2), |
|
|
'month': random.randint(1, 12), |
|
|
'day_of_week': random.randint(0, 6), |
|
|
'is_weekend': random.choice([0, 1]), |
|
|
'no_of_style_change': random.randint(0, 2), |
|
|
'targeted_productivity': round(random.uniform(0.5, 0.95), 2) |
|
|
} |
|
|
task['smv_per_worker'] = task['smv'] / task['no_of_workers'] |
|
|
task['effort_index'] = task['smv'] + task['incentive'] + 1.0 - task['idle_time'] |
|
|
task['log_wip'] = np.log1p(random.randint(20, 100)) |
|
|
task['log_overtime'] = np.log1p(random.uniform(0.5, 3.0)) |
|
|
return task |
|
|
|
|
|
|
|
|
def predict(): |
|
|
task = generate_task() |
|
|
team_scores = [] |
|
|
|
|
|
for team in teams: |
|
|
t = task.copy() |
|
|
t['team'] = team |
|
|
task_df = pd.DataFrame([t]) |
|
|
pred = model.predict(task_df)[0] |
|
|
team_scores.append((team, pred)) |
|
|
|
|
|
|
|
|
team_scores_df = pd.DataFrame(team_scores, columns=["Team", "Predicted Productivity"]) |
|
|
team_scores_df = team_scores_df.sort_values(by="Predicted Productivity", ascending=False) |
|
|
|
|
|
|
|
|
fig, ax = plt.subplots(figsize=(10, 6)) |
|
|
bars = ax.barh(team_scores_df["Team"].astype(str), team_scores_df["Predicted Productivity"], color='skyblue') |
|
|
ax.set_xlabel("Predicted Productivity") |
|
|
ax.set_title("Predicted Productivity by Team for Custom Task") |
|
|
ax.invert_yaxis() |
|
|
|
|
|
for bar in bars: |
|
|
width = bar.get_width() |
|
|
ax.text(width + 0.01, bar.get_y() + bar.get_height()/2, f"{width:.2f}", va='center') |
|
|
|
|
|
plt.tight_layout() |
|
|
|
|
|
task_info = "\n".join([f"{k}: {v}" for k, v in task.items()]) |
|
|
return fig, task_info |
|
|
|
|
|
|
|
|
demo = gr.Interface( |
|
|
fn=predict, |
|
|
inputs=[], |
|
|
outputs=[ |
|
|
gr.Plot(label="Team Productivity Rankings"), |
|
|
gr.Textbox(label="Task Details", lines=20) |
|
|
], |
|
|
live=False, |
|
|
title="Worker Productivity Predictor", |
|
|
description="Generates predicted productivity scores for each team on a random custom task." |
|
|
) |
|
|
|
|
|
demo.launch() |
|
|
|