From 1dc2def8545ec7a96dcb4ddf19edd178191c6ac7 Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Thu, 22 Feb 2024 00:17:48 +0530 Subject: [PATCH] add reclassification script --- scripts/recompute_class_blind.py | 98 ++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 scripts/recompute_class_blind.py diff --git a/scripts/recompute_class_blind.py b/scripts/recompute_class_blind.py new file mode 100644 index 0000000..66c7d47 --- /dev/null +++ b/scripts/recompute_class_blind.py @@ -0,0 +1,98 @@ +import pandas as pd +import os +import numpy as np +import re +import math + +curdir = os.getcwd() +path_delim = '/' +df = pd.read_excel("data/_tmp_data_21_02_2024_17_29.xlsx", sheet_name="data") + +def device_ratio_classification(ratio): + try: + if ratio is not None: + if 0.16 <= ratio <= 0.23: + return "Normal" + if 0.23 <= ratio <= 0.25: + return "Negative Borderline" + if 0.25 <= ratio <= 0.31: + return "Sickle Cell Trait" + if 0.31 <= ratio <= 0.36: + return "Positive for Sickle Cell. HPLC for Confirmation" + if 0.36 <= ratio <= 0.7: + return "Sickle Cell Disease" + else: + return "Invalid" + except Exception as e: + return "Error" + return "Invalid" + +def find_result_with_borderline_method_1(device_ratio, device_ratio_class, borderline_metric): + try: + if device_ratio is not None and borderline_metric is not None: + if device_ratio_class == "Negative Borderline": + return "Borderline. Normal" if borderline_metric >= 2.4 else "Borderline. Sickle Cell Trait" + elif device_ratio_class == "Positive for Sickle Cell. HPLC for Confirmation": + return "Borderline. Sickle Cell Trait" if borderline_metric >= 1.34 else "Borderline. Sickle Cell Disease" + except Exception as e: + handle_exception(e) + return "Error" + return str(device_ratio_class) + +def device_ratio_borderline_thresholds_br_method_2(ratio): + try: + if ratio is not None: + if 0.11 <= ratio <= 0.237: + return "Normal" + if 0.237 <= ratio <= 0.242: + return "Negative Borderline" + if 0.242 <= ratio <= 0.318: + return "Sickle Cell Trait" + if 0.318 <= ratio <= 0.356: + return "Positive for Sickle Cell. HPLC for Confirmation" + if 0.356 <= ratio <= 0.7: + return "Sickle Cell Disease" + else: + return "Invalid" + except Exception as e: + handle_exception(e) + return "Error" + return "Invalid" + +def reclassify_with_borderline_method_2(device_ratio, device_ratio_class, led2_average): + try: + if device_ratio is not None and led2_average is not None: + if device_ratio_class == "Negative Borderline": + return "Borderline. Normal" if led2_average >= 0.15 else "Borderline. Sickle Cell Trait" + elif device_ratio_class == "Positive for Sickle Cell. HPLC for Confirmation": + return "Borderline. Sickle Cell Trait" if led2_average >= 0.19 else "Borderline. Sickle Cell Disease" + except Exception as e: + handle_exception(e) + return "Error" + return str(device_ratio_class) + +def handle_exception(exception): + pass + +df["tmpDeviceRatioClass1"] = df['deviceRatio'].apply(device_ratio_classification) +df["borderlineMetric1"] = (df['led1Average'] - df['led2Average']) / df['deviceRatio'] +df['newDeviceRatioClass1'] = df.apply(lambda row: find_result_with_borderline_method_1( + row['deviceRatio'], + row['tmpDeviceRatioClass1'], + row['borderlineMetric1'] +), axis=1) + +df["tmpDeviceRatioClass2"] = df['deviceRatio'].apply(device_ratio_borderline_thresholds_br_method_2) +df['newDeviceRatioClass2'] = df.apply(lambda row: reclassify_with_borderline_method_2( + row['deviceRatio'], + row['tmpDeviceRatioClass2'], + row['led2Average'] +), axis=1) + +# clean columns +df = df[["_id", "name", "classificationResult", "newDeviceRatioClass1", "newDeviceRatioClass2", "deviceRatio", "led1Average", "led2Average"]] +print(df) + +writer = pd.ExcelWriter(curdir + path_delim + "data/output.xlsx", engine = 'openpyxl') +df.to_excel(writer, sheet_name = 'op', index=False) +writer.close() \ No newline at end of file