Views
No views yet
1
2import warnings
3warnings.filterwarnings("ignore", 'This pattern has match groups')
4datos = "https://raw.githubusercontent.com/hhsieh2416/Identify_Diabetic_Complications/main/data/diabetes_notes.csv"
5df = pd.read_csv(datos)
6
7
8# Importando las paqueterías necesarias:
9import pandas as pd
10import matplotlib.pyplot as plt
11import re
12import numpy as np
13from sklearn.metrics import confusion_matrix, classification_report
14
15# Lectura de datos
16datos = "https://raw.githubusercontent.com/hhsieh2416/Identify_Diabetic_Complications/main/data/diabetes_notes.csv"
17df = pd.read_csv(datos)
18
19# Análisis grafico de los datos
20fig, ax = plt.subplots()
21ax.bar(df['NOTE_ID'],df['TEXT'].str.split().apply(len))
22
23# Cantidad de palabras por reporte de cada paciente identificado por un id
24conteo = df['TEXT'].str.split().apply(len).tolist()
25print('Media de palabras: ' + str(np.mean(conteo)))
26print('Mediana de palabras: ' + str(np.median(conteo)))
27print('Minimo de palabras: ' + str(np.min(conteo)))
28print('Maximo de palabras: ' + str(np.max(conteo)))
29
30def reporte_paciente(id):
31 resumen = re.findall(r"\w+", str(df[df.NOTE_ID == id]['TEXT'].tolist() ))
32 return resumen
33
34# print(reporte_paciente(1))
351
2def extract_text_window(df, word, window_size, column_name = "TEXT"):
3
4 #Constants
5 user_input = f'({word})'
6 regex = re.compile(user_input)
7
8 negative = f'(no history of {word}|No history of {word}|any comorbid complications|family history|father also has {word}|denies {word}|Negative for {word})'
9 regex_negative = re.compile(negative)
10
11 half_window_size = window_size
12 final_df = pd.DataFrame([])
13 column_position = df.columns.get_loc(column_name) + 1 #We add 1 cause position 0 is the index
14
15
16 #Loop for each row of the column
17 for row in df.itertuples():
18
19 #Loop for multiple matches in the same row
20 for match in regex.finditer(row[column_position]):
21
22 window_start = int([match.start()-half_window_size if match.start()>=half_window_size else 0][0])
23 window_end = int([match.end() + half_window_size if match.end()+half_window_size <= len(row[column_position]) else len(row[column_position])][0])
24
25
26 final_df = final_df.append({
27 "WORD": match.group(),
28 "START_INDEX": match.start(),
29 "WINDOW_START": window_start,
30 "WINDOW_END": window_end,
31 "CONTEXT": row[column_position][window_start:window_end],
32 "FULL_TEXT": row[column_position],
33 "NOTE_ID": row[1]},
34 ignore_index=True)
35 #Extracción de negativos
36 for match in regex_negative.finditer(row[column_position]):
37 final_df2 = final_df[final_df["CONTEXT"].str.contains(pat = regex_negative, regex = True)==False]
38
39 return "No matches for the pattern" if len(final_df) == 0 else final_df2
40
41
42
43# Buscando diabet en las notas médicas
44df = pd.read_csv("https://raw.githubusercontent.com/hhsieh2416/Identify_Diabetic_Complications/main/data/diabetes_notes.csv")
45word = "diabet"
46window_size = 50 #tamaño de la ventana
47
48diabetes_notes_window = extract_text_window(df,word,window_size)
49
50diabetes_notes_window 1
2def extract_text_window_pro(df, pattern,negatives, window_size, column_name = "TEXT"):
3
4 #Constants
5 half_window_size = window_size
6 final_df = pd.DataFrame([])
7 column_position = df.columns.get_loc(column_name) + 1 #We add 1 cause position 0 is the index
8
9
10 #Loop for each row of the column
11 for row in df.itertuples():
12
13 #Loop for multiple matches in the same row
14 for match in re.finditer(pattern,row[column_position]):
15
16 window_start = int([match.start()-half_window_size if match.start()>=half_window_size else 0][0])
17 window_end = int([match.end() + half_window_size if match.end()+half_window_size <= len(row[column_position]) else len(row[column_position])][0])
18
19
20 final_df = final_df.append({
21 "WORD": match.group(),
22 "START_INDEX": match.start(),
23 "WINDOW_START": window_start,
24 "WINDOW_END": window_end,
25 "CONTEXT": row[column_position][window_start:window_end],
26 "FULL_TEXT": row[column_position],
27 "NOTE_ID": row[1]},
28 ignore_index=True)
29 #Extracción de negativos
30 final_df2 = final_df[final_df["CONTEXT"].str.contains(pat = negatives, regex = True)==False]
31
32 return "No matches for the pattern" if len(final_df) == 0 else final_df2
33
34
35# Buscando diabet en las notas médicas
36
37df = pd.read_csv("https://raw.githubusercontent.com/hhsieh2416/Identify_Diabetic_Complications/main/data/diabetes_notes.csv")
38pattern = "diabetes|diabetic" #"(?<![a-zA-Z])diabet(es|ic)?(?![a-zA-Z])"
39window_size = 50
40negatives = r"no history of (?<![a-zA-Z])diabet(es|ic)?(?![a-zA-z])|No history of (?<![a-zA-Z])diabet(es|ic)?(?![a-zA-z])|den(ies|y)? any comorbid complications|family history|negative for (?<![a-zA-Z])diabet(es|ic)?(?![a-zA-z])|(father|mother) (also)? (?<![a-zA-Z])diabet(es|ic)?(?![a-zA-z])|Negative for (?<![a-zA-Z])diabet(es|ic)?(?![a-zA-z]) |no weakness, numbness or tingling|patient's mother and father|father also has diabetes"
41
42
43diabetes_notes_window = extract_text_window_pro(df,pattern,negatives,window_size)
44
45diabetes_notes_window
461diabetes_notes_window.drop_duplicates(subset=["NOTE_ID"])
2neuropathy = diabetes_notes_window[diabetes_notes_window['CONTEXT'].str.contains(pat=r"(?<![a-zA-Z])neuropath(y|ic)?(?![a-zA-z])|diabetic nerve pain|tingling",regex=True)]
3neuropathy['COMPLICATIONS'] = "neuropathy"
4diabetes_notes_neuropathy = neuropathy[['NOTE_ID','CONTEXT','COMPLICATIONS']].drop_duplicates(subset=['NOTE_ID'])
5
6
7print(diabetes_notes_neuropathy)
8print(diabetes_notes_neuropathy.count())
9
10
11
12
13nephropathy = diabetes_notes_window[diabetes_notes_window['CONTEXT'].str.contains(pat=r"(?<![a-zA-Z])nephropathy(?![a-zA-z])|renal (insufficiency|disease)",regex=True)]
14nephropathy['COMPLICATIONS'] = "nephropathy"
15diabetes_notes_nephropathy = nephropathy[['NOTE_ID','CONTEXT','COMPLICATIONS']].drop_duplicates(subset=['NOTE_ID'])
16
17print(diabetes_notes_nephropathy)
18print(diabetes_notes_nephropathy.count())
19
20
21
22
23retinopathy = diabetes_notes_window[diabetes_notes_window['CONTEXT'].str.contains(pat=r"(?<![a-zA-Z])retinopath(y|ic)?(?![a-zA-z])",regex=True)]
24retinopathy['COMPLICATIONS'] = "retinopathy"
25diabetes_notes_retinopathy = retinopathy[['NOTE_ID','CONTEXT','COMPLICATIONS']].drop_duplicates(subset=['NOTE_ID'])
26
27print(diabetes_notes_retinopathy)
28print(diabetes_notes_retinopathy.count())
291# Con el link antes mencionado de validación se crean los DataFrame para cada patología
2
3datos_verificacion = pd.read_csv("https://raw.githubusercontent.com/hhsieh2416/Identify_Diabetic_Complications/main/data/glodstandrad.csv")
4
5datos_verificacion_neuropathy = datos_verificacion[datos_verificacion['DIABETIC_NEUROPATHY']==1][['NOTE_ID','DIABETIC_NEUROPATHY']]
6print(datos_verificacion_neuropathy)
7print(datos_verificacion_neuropathy.count())
8
9datos_verificacion_nephropathy = datos_verificacion[datos_verificacion['DIABETIC_NEPHROPATHY']==1][['NOTE_ID','DIABETIC_NEPHROPATHY']]
10print(datos_verificacion_nephropathy)
11print(datos_verificacion_nephropathy.count())
12
13datos_verificacion_retinopathy = datos_verificacion[datos_verificacion['DIABETIC_RETINOPATHY']==1][['NOTE_ID','DIABETIC_RETINOPATHY']]
14print(datos_verificacion_retinopathy)
15print(datos_verificacion_retinopathy.count())
16
17# Realizamos joins de nuestros DataFrame con las tablas de validación
18
19ver_neuro = pd.merge(datos_verificacion_neuropathy, diabetes_notes_neuropathy, how = 'outer', on = 'NOTE_ID', indicator=True)
20print(ver_neuro)
21
22ver_nephro = pd.merge(datos_verificacion_nephropathy, diabetes_notes_nephropathy, how = 'outer', on = 'NOTE_ID', indicator=True)
23print(ver_nephro)
24
25ver_retino = pd.merge(datos_verificacion_retinopathy, diabetes_notes_retinopathy, how = 'outer', on = 'NOTE_ID', indicator=True)
26print(ver_retino)
27
28# Se realizan los conteos
29
30conteo_na_neuro_falso_positivo = ver_neuro['DIABETIC_NEUROPATHY'].isna().sum()
31conteo_na_nephro_falso_positivo = ver_nephro['DIABETIC_NEPHROPATHY'].isna().sum()
32conteo_na_retino_falso_positivo = ver_retino['DIABETIC_RETINOPATHY'].isna().sum()
33
34print('Pacientes sin complicaciones pero que si se identifican: ', conteo_na_neuro_falso_positivo+conteo_na_nephro_falso_positivo+conteo_na_retino_falso_positivo)
35
36conteo_na_neuro_falso_negativo = ver_neuro['COMPLICATIONS'].isna().sum()
37conteo_na_nephro_falso_negativo = ver_nephro['COMPLICATIONS'].isna().sum()
38conteo_na_retino_falso_negativo = ver_retino['COMPLICATIONS'].isna().sum()
39
40print('Pacientes con complicaciones que no fueron detectados: ', conteo_na_neuro_falso_negativo + conteo_na_nephro_falso_negativo + conteo_na_retino_falso_negativo)
41
42conteo_correcto_neuro = len(ver_neuro[ver_neuro['_merge'] == 'both'])
43
44conteo_correcto_nephro = len(ver_nephro[ver_nephro['_merge'] == 'both'])
45
46conteo_correcto_retino = len(ver_retino[ver_retino['_merge'] == 'both'])
47
48
49print('Pacientes que tienen complicaciones diabetes que si se encontaron: ', conteo_correcto_nephro+conteo_correcto_neuro+conteo_correcto_retino)
50
51conteo_complicacion_neuro = len( ver_neuro[ver_neuro['DIABETIC_NEUROPATHY'] == 1] )
52conteo_complicacion_nephro = len( ver_nephro[ver_nephro['DIABETIC_NEPHROPATHY'] == 1] )
53conteo_complicacion_retino = len( ver_retino[ver_retino['DIABETIC_RETINOPATHY'] == 1] )
54print('Pacientes que tienen complicaciones diabeticas: ', conteo_complicacion_neuro +conteo_complicacion_nephro + conteo_complicacion_retino )
55
56
57
58cor_neuro = datos_verificacion[['NOTE_ID', 'DIABETIC_NEUROPATHY']].merge(diabetes_notes_neuropathy[['NOTE_ID','COMPLICATIONS']], how='outer', on='NOTE_ID', indicator=True )
59cor_neuro['COMPLICATIONS'] = cor_neuro['COMPLICATIONS'].map(d_neuro).fillna(0)
60
61print('---NEUROPATHY---')
62print(cor_neuro)
63
64print(classification_report(cor_neuro['DIABETIC_NEUROPATHY'].tolist(), cor_neuro['COMPLICATIONS'].tolist()))
65
66cor_nephro = datos_verificacion[['NOTE_ID', 'DIABETIC_NEPHROPATHY']].merge(diabetes_notes_nephropathy[['NOTE_ID','COMPLICATIONS']], how='outer', on='NOTE_ID', indicator=True )
67cor_nephro['COMPLICATIONS'] = cor_nephro['COMPLICATIONS'].map(d_nephro).fillna(0)
68print('---NEPHROPATHY---')
69print(cor_nephro)
70
71print(classification_report(cor_nephro['DIABETIC_NEPHROPATHY'].tolist(), cor_nephro['COMPLICATIONS'].tolist()))
72
73cor_retino = datos_verificacion[['NOTE_ID', 'DIABETIC_RETINOPATHY']].merge(diabetes_notes_retinopathy[['NOTE_ID','COMPLICATIONS']], how='outer', on='NOTE_ID', indicator=True )
74cor_retino['COMPLICATIONS'] = cor_retino['COMPLICATIONS'].map(d_retino).fillna(0)
75print('---RETINOPATHY---')
76print(cor_retino)
77
78print(classification_report(cor_retino['DIABETIC_RETINOPATHY'].tolist(), cor_retino['COMPLICATIONS'].tolist()))