Spaces:
Sleeping
Sleeping
| from agents import function_tool | |
| import pandas as pd | |
| EMP_PATH = "sample_data/employees.csv" | |
| PROJ_PATH = "sample_data/projects.csv" | |
| def load_employees(): | |
| df = pd.read_csv(EMP_PATH) | |
| df["skills_list"] = df["skills"].str.split(";").apply(lambda xs: [s.strip().lower() for s in xs]) | |
| return df | |
| def load_projects(): | |
| df = pd.read_csv(PROJ_PATH) | |
| df["skills_required_list"] = df["skills_required"].str.split(";").apply(lambda xs: [s.strip().lower() for s in xs]) | |
| return df | |
| def compute_skill_coverage(): | |
| """Return % coverage per skill for the whole organization, split by Benched vs Deployed.""" | |
| emps = load_employees() | |
| total = emps["emp_id"].nunique() | |
| exploded = emps.explode("skills_list") | |
| skill_counts = exploded.groupby("skills_list")["emp_id"].nunique() | |
| status_split = exploded.groupby(["skills_list", "status"])["emp_id"].nunique().unstack(fill_value=0) | |
| results = [] | |
| for skill, count in skill_counts.items(): | |
| benched = int(status_split.loc[skill].get("Benched", 0)) if skill in status_split.index else 0 | |
| deployed = int(status_split.loc[skill].get("Deployed", 0)) if skill in status_split.index else 0 | |
| pct = round((count / total) * 100, 2) if total else 0 | |
| results.append({ | |
| "skill": skill, | |
| "employees": int(count), | |
| "coverage_pct": pct, | |
| "benched": benched, | |
| "deployed": deployed | |
| }) | |
| return {"coverage": sorted(results, key=lambda x: -x["coverage_pct"])} | |
| def analyze_internal_skill_gaps(project_ids: list[str] = []): | |
| """Compare internal supply vs demand across projects. Identify gaps internal to organizational requirements.""" | |
| emps = load_employees() | |
| projs = load_projects() | |
| if project_ids: | |
| projs = projs[projs["project_id"].isin(project_ids)] | |
| # demand side | |
| demand = {} | |
| for _, row in projs.iterrows(): | |
| for skill in row.skills_required_list: | |
| demand[skill] = demand.get(skill, 0) + 1 | |
| # supply side | |
| exploded = emps.explode("skills_list") | |
| supply = exploded.groupby("skills_list")["emp_id"].nunique().to_dict() | |
| results = [] | |
| for skill, d in demand.items(): | |
| s = supply.get(skill, 0) | |
| ratio = round(s / d, 2) if d > 0 else 0 | |
| results.append({"skill": skill, "demand": d, "supply": s, "supply_demand_ratio": ratio}) | |
| return {"gaps": sorted(results, key=lambda x: x["supply_demand_ratio"])} |