logeswari's picture
msg
281ce5c
from fastapi import FastAPI, HTTPException,Query
import pandas as pd
from supabase import create_client, Client
import os
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# Read Supabase credentials
SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_KEY")
# Initialize FastAPI and Supabase
app = FastAPI()
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
# Fetch data from Supabase
try:
response = supabase.table("HR analysis").select("*").execute()
data = pd.DataFrame(response.data) if response.data else pd.DataFrame()
except Exception as e:
print(f"Error fetching data: {e}")
data = pd.DataFrame()
# Convert date columns
for col in ['Survey Date', 'StartDate', 'DOB']:
if col in data.columns:
data[col] = pd.to_datetime(data[col], errors='coerce')
# Calculate Age
if 'DOB' in data.columns:
data['Age'] = (pd.to_datetime("today") - data['DOB']).dt.days // 365
# Clean Performance Score
score_map = {"Exceeds": 5, "Fully Meets": 4, "Needs Improvement": 3, "PIP": 2}
if 'Performance Score' in data.columns:
data['Performance Score'] = data['Performance Score'].map(lambda x: score_map.get(str(x).strip(), None))
data['Performance Score'] = pd.to_numeric(data['Performance Score'], errors='coerce')
# Endpoints with try-except handling
@app.get("/satisfaction-analysis")
def satisfaction_analysis(department: str = Query(None, description="Filter by department")):
try:
if "DepartmentType" not in data.columns or "Satisfaction Score" not in data.columns:
raise HTTPException(status_code=500, detail="Required columns missing in dataset")
filtered_data = data.copy()
if department:
department = department.strip().title() # Normalize input
filtered_data = filtered_data[
filtered_data["DepartmentType"].str.strip().str.title() == department
]
if filtered_data.empty:
return [] # Return empty JSON instead of error
result = filtered_data.groupby("DepartmentType")["Satisfaction Score"].mean().reset_index()
return result.to_dict(orient="records")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/department-performance")
def department_performance():
try:
result = data.groupby("DepartmentType")[["Performance Score", "Current Employee Rating"]].mean().reset_index()
return result.to_dict(orient="records")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/training-analytics")
def training_analytics(program_name: str = Query(None, description="Filter by training program name")):
try:
filtered_data = data if program_name is None else data[data["Training Program Name"] == program_name]
if filtered_data.empty:
return []
result = filtered_data.groupby("Training Program Name")["Training Outcome"].value_counts(normalize=True).unstack(fill_value=0)
return result.reset_index().to_dict(orient="records")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/engagement-performance")
def engagement_performance():
try:
correlation = data[['Engagement Score', 'Performance Score']].corr().iloc[0, 1]
return {"correlation_coefficient": correlation}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/cost-benefit-analysis")
def cost_benefit_analysis():
try:
result = data.groupby("DepartmentType").apply(lambda x: x['Performance Score'].mean() / x['Training Cost'].sum()).reset_index(name="ROI")
return result.to_dict(orient="records")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/training-effectiveness")
def training_effectiveness():
try:
result = data.groupby("Training Program Name")["Performance Score"].mean().reset_index()
return result.to_dict(orient="records")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/diversity-inclusion")
def diversity_dashboard():
try:
if "DepartmentType" not in data.columns or "GenderCode" not in data.columns:
raise HTTPException(status_code=500, detail="Required columns missing in dataset")
# Compute gender distribution by department
diversity_metrics = data.groupby("DepartmentType")["GenderCode"].value_counts(normalize=True).unstack(fill_value=0).reset_index()
return diversity_metrics.to_dict(orient="records")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/work-life-balance")
def worklife_balance_impact():
try:
correlation = data[['Work-Life Balance Score', 'Performance Score']].corr().iloc[0, 1]
return {"correlation_coefficient": round(correlation, 3)} # Return as a JSON object
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/career-development")
def career_development(employee_id: str = Query(None, description="Filter by Employee ID")):
try:
if "Employee ID" not in data.columns or "StartDate" not in data.columns:
raise HTTPException(status_code=500, detail="Required columns missing in dataset")
# Print available Employee IDs for debugging
print("Available Employee IDs:", data["Employee ID"].unique())
filtered_data = data.copy()
if employee_id:
employee_id = employee_id.strip() # Remove leading/trailing spaces
filtered_data = filtered_data[filtered_data["Employee ID"].astype(str) == employee_id]
if filtered_data.empty:
return [] # Return an empty list if no matching records
career_progress = filtered_data.groupby("Employee ID")["StartDate"].count().reset_index(name="Career Movements")
return career_progress.to_dict(orient="records")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))