2025-01-31 15:59:51 +00:00
|
|
|
import requests
|
|
|
|
|
import pandas as pd
|
2024-10-15 01:56:05 +00:00
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
load_dotenv()
|
2025-01-31 15:59:51 +00:00
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
DATA_KEY = os.getenv("AI_DATA_KEY")
|
|
|
|
|
# Constants for API requests
|
|
|
|
|
URL = "https://erpai.mkdlabs.com//v3/api/custom/erpai/common/get-data-ai"
|
|
|
|
|
HEADERS = {
|
|
|
|
|
"x-project": DATA_KEY # Replace with your actual key
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# JSON bodies for API requests
|
|
|
|
|
def create_json_body(area_type, company_id):
|
|
|
|
|
return {
|
|
|
|
|
"type": area_type,
|
|
|
|
|
"options": {
|
|
|
|
|
"company_id": company_id
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Function to fetch data from the API
|
|
|
|
|
def fetch_data(json_body):
|
|
|
|
|
json_body["options"]["company_id"] = json_body["options"].get("company_id") # Ensure company_id is included
|
|
|
|
|
response = requests.post(URL, headers=HEADERS, json=json_body)
|
|
|
|
|
response.raise_for_status() # Raise an error for bad responses
|
|
|
|
|
return response.json()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def convert_assessment_data_to_dataframe(assessment_data):
|
|
|
|
|
df_assessment = []
|
|
|
|
|
for assessment in assessment_data.get("data", []):
|
|
|
|
|
assessment_id = assessment["assessment_id"]
|
|
|
|
|
assessment_name = assessment["assessment_name"]
|
|
|
|
|
start_date = assessment["start_date"]
|
|
|
|
|
open_items = assessment["open_items"]
|
|
|
|
|
completed_items = assessment["completed_items"]
|
|
|
|
|
total_assigned_items = assessment["total_assigned_items"]
|
|
|
|
|
red_flags = assessment["red_flags"]
|
|
|
|
|
|
|
|
|
|
for user in assessment.get("user_details", []):
|
|
|
|
|
user_name = user["name"]
|
|
|
|
|
user_total_items = user["total_assigned_items"]
|
|
|
|
|
user_completed_items = user["completed_items"]
|
|
|
|
|
|
|
|
|
|
for area in user.get("area_list", []):
|
|
|
|
|
df_assessment.append({
|
|
|
|
|
"assessment_id": assessment_id,
|
|
|
|
|
"assessment_name": assessment_name,
|
|
|
|
|
"start_date": start_date,
|
|
|
|
|
"open_items_overall": open_items,
|
|
|
|
|
"completed_items_overall": completed_items,
|
|
|
|
|
"total_assigned_items_overall": total_assigned_items,
|
|
|
|
|
"user_name": user_name,
|
|
|
|
|
"user_total_assigned_items": user_total_items,
|
|
|
|
|
"user_completed_items": user_completed_items,
|
|
|
|
|
"area": area,
|
|
|
|
|
"red_flags": red_flags
|
|
|
|
|
})
|
|
|
|
|
return pd.DataFrame(df_assessment)
|
|
|
|
|
|
|
|
|
|
# Convert to DataFrame
|
|
|
|
|
|
2024-10-15 01:56:05 +00:00
|
|
|
|
2025-01-31 15:59:51 +00:00
|
|
|
# Summary statistics for overall assessment level
|
|
|
|
|
def generate_summary_statistics(df):
|
|
|
|
|
total_assessments = df['assessment_id'].nunique()
|
|
|
|
|
avg_open_items = df.groupby('assessment_id')['open_items_overall'].mean().mean()
|
|
|
|
|
avg_completed_items = df.groupby('assessment_id')['completed_items_overall'].mean().mean()
|
|
|
|
|
avg_total_assigned_items = df.groupby('assessment_id')['total_assigned_items_overall'].mean().mean()
|
|
|
|
|
avg_red_flags = df['red_flags'].mean()
|
|
|
|
|
|
|
|
|
|
total_users = df['user_name'].nunique()
|
|
|
|
|
avg_user_total_items = df.groupby('user_name')['user_total_assigned_items'].mean().mean()
|
|
|
|
|
avg_user_completed_items = df.groupby('user_name')['user_completed_items'].mean().mean()
|
|
|
|
|
completion_rate_per_user = (df['user_completed_items'].sum() / df['user_total_assigned_items'].sum()) * 100 if df['user_total_assigned_items'].sum() > 0 else 0
|
|
|
|
|
|
|
|
|
|
area_summary = df['area'].value_counts()
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
"total_assessments": total_assessments,
|
|
|
|
|
"avg_open_items_per_assessment": avg_open_items,
|
|
|
|
|
"avg_completed_items_per_assessment": avg_completed_items,
|
|
|
|
|
"avg_total_assigned_items_per_assessment": avg_total_assigned_items,
|
|
|
|
|
"avg_red_flags": avg_red_flags,
|
|
|
|
|
"total_users": total_users,
|
|
|
|
|
"avg_user_total_assigned_items": avg_user_total_items,
|
|
|
|
|
"avg_user_completed_items": avg_user_completed_items,
|
|
|
|
|
"completion_rate_per_user": completion_rate_per_user,
|
|
|
|
|
"area_summary": area_summary.to_dict()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Additional statistics for efficiency and areas
|
|
|
|
|
def generate_extended_statistics(df):
|
|
|
|
|
df['user_completion_rate'] = (df['user_completed_items'] / df['user_total_assigned_items']).fillna(0) * 100
|
|
|
|
|
|
|
|
|
|
top_5_efficient_users = df.groupby('user_name')['user_completion_rate'].mean().nlargest(5).to_dict()
|
|
|
|
|
bottom_5_least_efficient_users = df.groupby('user_name')['user_completion_rate'].mean().nsmallest(5).to_dict()
|
|
|
|
|
|
|
|
|
|
df['uncompleted_items'] = df['user_total_assigned_items'] - df['user_completed_items']
|
|
|
|
|
areas_with_most_uncompleted_items = df.groupby('area')['uncompleted_items'].sum().nlargest(5).to_dict()
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
"top_5_efficient_users": top_5_efficient_users,
|
|
|
|
|
"bottom_5_least_efficient_users": bottom_5_least_efficient_users,
|
|
|
|
|
"areas_with_most_uncompleted_items": areas_with_most_uncompleted_items
|
2024-10-15 01:56:05 +00:00
|
|
|
}
|
2025-01-31 15:59:51 +00:00
|
|
|
|
|
|
|
|
# Generate statistics for problematic areas
|
|
|
|
|
def generate_problematic_area_statistics(df):
|
|
|
|
|
total_open_items = df.groupby('name')['open_items'].sum().sort_values(ascending=False)
|
|
|
|
|
total_red_flags = df.groupby('name')['red_flags'].sum().sort_values(ascending=False)
|
|
|
|
|
|
|
|
|
|
return pd.DataFrame({
|
|
|
|
|
"total_open_items": total_open_items,
|
|
|
|
|
"total_red_flags": total_red_flags
|
|
|
|
|
}).fillna(0)
|
|
|
|
|
|
|
|
|
|
def generate_summary_stats(assessment_data, area_data):
|
|
|
|
|
assessment_df = convert_assessment_data_to_dataframe(assessment_data)
|
|
|
|
|
problematic_area_df = pd.DataFrame(area_data.get("data", []))
|
|
|
|
|
|
|
|
|
|
summary_stats = generate_summary_statistics(assessment_df)
|
|
|
|
|
extended_stats = generate_extended_statistics(assessment_df)
|
|
|
|
|
summary_stats["users(Workers) based stats"] = extended_stats
|
|
|
|
|
|
|
|
|
|
problematic_stats = generate_problematic_area_statistics(problematic_area_df)
|
|
|
|
|
summary_stats["Area based stats"] = problematic_stats.to_dict(orient='index')
|
|
|
|
|
|
|
|
|
|
return summary_stats
|
|
|
|
|
|
2024-10-15 01:56:05 +00:00
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2025-01-31 15:59:51 +00:00
|
|
|
from src.services.chatbot import Chatbot
|
|
|
|
|
bot = Chatbot()
|
|
|
|
|
res = bot.predict_next_n_assessment(companyid=12,N=3)
|
|
|
|
|
|
|
|
|
|
print(res)
|