PragmaticPete commited on
Commit
a447eaf
·
verified ·
1 Parent(s): 95403ff

Update logic/care_gap_engine.py

Browse files
Files changed (1) hide show
  1. logic/care_gap_engine.py +26 -13
logic/care_gap_engine.py CHANGED
@@ -12,7 +12,7 @@ def normalize_bool(value):
12
  return False
13
  elif isinstance(value, (int, float)):
14
  return bool(value)
15
- return value
16
 
17
  def normalize_gender(value):
18
  if isinstance(value, str):
@@ -23,7 +23,19 @@ def normalize_gender(value):
23
  return "M"
24
  elif isinstance(value, int):
25
  return "F" if value == 2 else "M"
26
- return value
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
  def evaluate_care_gaps(df: pd.DataFrame, config):
29
  today = datetime.today()
@@ -34,29 +46,30 @@ def evaluate_care_gaps(df: pd.DataFrame, config):
34
  gaps = []
35
 
36
  gender = normalize_gender(row.get('gender'))
 
 
 
 
 
37
 
38
- if gender == 'F' and rules['Breast Cancer Screening']['min_age'] <= row['age'] <= rules['Breast Cancer Screening']['max_age']:
39
- if not row['last_mammogram'] or (today - pd.to_datetime(row['last_mammogram'], errors='coerce')).days > rules['Breast Cancer Screening']['interval_days']:
40
  gaps.append("Breast Cancer Screening")
41
 
42
- if rules['Colorectal Cancer Screening']['min_age'] <= row['age'] <= rules['Colorectal Cancer Screening']['max_age']:
43
- if not row['last_colonoscopy'] or (today - pd.to_datetime(row['last_colonoscopy'], errors='coerce')).days > rules['Colorectal Cancer Screening']['interval_days']:
44
  gaps.append("Colorectal Cancer Screening")
45
 
46
- if row.get('systolic_bp', '') != "" and pd.to_numeric(row['systolic_bp'], errors='coerce') > rules['Blood Pressure Control']['bp_threshold']:
47
  gaps.append("Blood Pressure Control")
48
 
49
- if row.get('hba1c_value', '') != "" and pd.to_numeric(row['hba1c_value'], errors='coerce') >= 9:
50
  gaps.append("Diabetes: Poor HbA1c Control")
51
 
52
  if not normalize_bool(row.get('FollowUp_Scheduled')) or not normalize_bool(row.get('Primary_Care_Established')):
53
  gaps.append("Follow-Up Care")
54
 
55
- previous_readm = row.get('Previous_Readmissions', '')
56
- if isinstance(previous_readm, str):
57
- if previous_readm.isdigit() and int(previous_readm) >= 3:
58
- gaps.append("Readmission Risk")
59
- elif isinstance(previous_readm, (int, float)) and previous_readm >= 3:
60
  gaps.append("Readmission Risk")
61
 
62
  results.append({
 
12
  return False
13
  elif isinstance(value, (int, float)):
14
  return bool(value)
15
+ return False
16
 
17
  def normalize_gender(value):
18
  if isinstance(value, str):
 
23
  return "M"
24
  elif isinstance(value, int):
25
  return "F" if value == 2 else "M"
26
+ return "U" # Unknown
27
+
28
+ def normalize_float(value, default=0.0):
29
+ try:
30
+ return float(value)
31
+ except:
32
+ return default
33
+
34
+ def normalize_readmissions(value):
35
+ try:
36
+ return int(value) if int(value) >= 0 else 0
37
+ except:
38
+ return 0
39
 
40
  def evaluate_care_gaps(df: pd.DataFrame, config):
41
  today = datetime.today()
 
46
  gaps = []
47
 
48
  gender = normalize_gender(row.get('gender'))
49
+ age = normalize_float(row.get('age'))
50
+ systolic_bp = normalize_float(row.get('systolic_bp'))
51
+ hba1c_value = normalize_float(row.get('hba1c_value'))
52
+ last_mammo = pd.to_datetime(row.get('last_mammogram', None), errors='coerce')
53
+ last_colono = pd.to_datetime(row.get('last_colonoscopy', None), errors='coerce')
54
 
55
+ if gender == 'F' and rules['Breast Cancer Screening']['min_age'] <= age <= rules['Breast Cancer Screening']['max_age']:
56
+ if pd.isna(last_mammo) or (today - last_mammo).days > rules['Breast Cancer Screening']['interval_days']:
57
  gaps.append("Breast Cancer Screening")
58
 
59
+ if rules['Colorectal Cancer Screening']['min_age'] <= age <= rules['Colorectal Cancer Screening']['max_age']:
60
+ if pd.isna(last_colono) or (today - last_colono).days > rules['Colorectal Cancer Screening']['interval_days']:
61
  gaps.append("Colorectal Cancer Screening")
62
 
63
+ if systolic_bp > rules['Blood Pressure Control']['bp_threshold']:
64
  gaps.append("Blood Pressure Control")
65
 
66
+ if hba1c_value >= 9:
67
  gaps.append("Diabetes: Poor HbA1c Control")
68
 
69
  if not normalize_bool(row.get('FollowUp_Scheduled')) or not normalize_bool(row.get('Primary_Care_Established')):
70
  gaps.append("Follow-Up Care")
71
 
72
+ if normalize_readmissions(row.get('Previous_Readmissions')) >= 3:
 
 
 
 
73
  gaps.append("Readmission Risk")
74
 
75
  results.append({