AI-Gap-Analyzer / logic /care_gap_engine.py
PragmaticPete's picture
Update logic/care_gap_engine.py
a447eaf verified
# File: logic/care_gap_engine.py
import pandas as pd
from datetime import datetime
def normalize_bool(value):
if isinstance(value, str):
value = value.strip().lower()
if value in ["yes", "true", "1"]:
return True
elif value in ["no", "false", "0"]:
return False
elif isinstance(value, (int, float)):
return bool(value)
return False
def normalize_gender(value):
if isinstance(value, str):
v = value.strip().lower()
if v in ["f", "female", "2"]:
return "F"
elif v in ["m", "male", "1"]:
return "M"
elif isinstance(value, int):
return "F" if value == 2 else "M"
return "U" # Unknown
def normalize_float(value, default=0.0):
try:
return float(value)
except:
return default
def normalize_readmissions(value):
try:
return int(value) if int(value) >= 0 else 0
except:
return 0
def evaluate_care_gaps(df: pd.DataFrame, config):
today = datetime.today()
rules = config["care_gap_rules"]
results = []
for _, row in df.iterrows():
gaps = []
gender = normalize_gender(row.get('gender'))
age = normalize_float(row.get('age'))
systolic_bp = normalize_float(row.get('systolic_bp'))
hba1c_value = normalize_float(row.get('hba1c_value'))
last_mammo = pd.to_datetime(row.get('last_mammogram', None), errors='coerce')
last_colono = pd.to_datetime(row.get('last_colonoscopy', None), errors='coerce')
if gender == 'F' and rules['Breast Cancer Screening']['min_age'] <= age <= rules['Breast Cancer Screening']['max_age']:
if pd.isna(last_mammo) or (today - last_mammo).days > rules['Breast Cancer Screening']['interval_days']:
gaps.append("Breast Cancer Screening")
if rules['Colorectal Cancer Screening']['min_age'] <= age <= rules['Colorectal Cancer Screening']['max_age']:
if pd.isna(last_colono) or (today - last_colono).days > rules['Colorectal Cancer Screening']['interval_days']:
gaps.append("Colorectal Cancer Screening")
if systolic_bp > rules['Blood Pressure Control']['bp_threshold']:
gaps.append("Blood Pressure Control")
if hba1c_value >= 9:
gaps.append("Diabetes: Poor HbA1c Control")
if not normalize_bool(row.get('FollowUp_Scheduled')) or not normalize_bool(row.get('Primary_Care_Established')):
gaps.append("Follow-Up Care")
if normalize_readmissions(row.get('Previous_Readmissions')) >= 3:
gaps.append("Readmission Risk")
results.append({
'patient_id': row['patient_id'],
'care_gaps': gaps
})
return pd.DataFrame(results)