File size: 2,787 Bytes
95403ff
 
 
 
 
 
 
 
 
 
 
 
 
 
a447eaf
95403ff
 
 
 
 
 
 
 
 
 
a447eaf
 
 
 
 
 
 
 
 
 
 
 
 
95403ff
 
 
 
 
 
 
 
 
 
a447eaf
 
 
 
 
95403ff
a447eaf
 
95403ff
 
a447eaf
 
95403ff
 
a447eaf
95403ff
 
a447eaf
95403ff
 
 
 
 
a447eaf
95403ff
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 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)