Daskam commited on
Commit
83d4346
·
1 Parent(s): e8338d7

updated app

Browse files
corazao_con_block_y_theme.py → app.py RENAMED
@@ -1,66 +1,7 @@
1
- # <h1 align="center">Heart Attack - EDA</h1>
2
-
3
- # 1. [Introducción](#1) <a id=18></a>
4
- # - 1.1 [Diccionario de datos](#2)
5
- # - 1.2 [Tarea](#3)
6
- # 2. [Preparación](#4)
7
- # - 2.1 [Librerías](#5)
8
- # - 2.2 [Datos](#6)
9
- # - 2.3 [Entendimiento de los datos](#7)
10
- # 3. [Análisis Exploratorio de Datos](#8)
11
- # - 3.1 [Análisis univariado](#9)
12
- # - 3.2 [Análisis bivariado](#10)
13
- # 4. [Preprocesamiento de los datos](#11)
14
- # - 4.1 [Conclusiones del EDA](#12)
15
- # - 4.2 [Librerías](#13)
16
- # - 4.3 [Preparando las características para el modelo](#14)
17
- # 5. [Modelado](#15)
18
- # - 5.1 [Clasificadores lineales](#16)
19
- # - 5.2 [Modelos de árbol](#17)
20
-
21
- # ### 1. Introducción <a id=1></a>
22
- # [Volver al inicio](#18)
23
-
24
- # #### 1.1 Diccionario de datos <a id=2></a>
25
- # `age` - Edad
26
- #
27
- # `sex` - Sexo del paciente
28
- #
29
- # `cp` - Tipo de dolor torácico ~ 0 = Angina típica, 1 = Angina atípica, 2 = Dolor no anginal, 3 = Asintomático
30
- #
31
- # `trtbps` - Presión arterial en reposo (en mm Hg)
32
- #
33
- # `chol` - Colesterol en mg/dl obtenido a través del sensor de IMC
34
- #
35
- # `fbs` - (azúcar en sangre en ayunas > 120 mg/dl) ~ 1 = Verdadero, 0 = Falso
36
- #
37
- # `restecg` - Resultados electrocardiográficos en reposo ~ 0 = Normal, 1 = Normalidad de la onda ST-T, 2 = Hipertrofia ventricular izquierda
38
- #
39
- # `thalachh` - Ritmo cardíaco máximo alcanzado
40
- #
41
- # `oldpeak` - Pico anterior
42
- #
43
- # `slp` - Inclinación
44
- #
45
- # `caa` - Número de vasos principales
46
- #
47
- # `thall` - Resultado de la prueba de esfuerzo con talio ~ (0,3)
48
- #
49
- # `exng` - Angina inducida por ejercicio ~ 1 = Sí, 0 = No
50
- #
51
- # `output` - Variable objetivo
52
-
53
- # #### 1.2 Tarea <a id=3></a>
54
- # Realizar un análisis exploratorio de datos y predecir si una persona es propensa a sufrir un ataque al corazón o no.
55
-
56
- # ### 2. Preparación <a id=4></a>
57
- # [Volver al inicio](#18)
58
-
59
- # #### 2.1 Librerías <a id=5></a>
60
-
61
- # ##### 3.1.1 Histogramas de características categóricas
62
-
63
- # In[1]:
64
 
65
 
66
  # Importacion de librerias
@@ -74,35 +15,13 @@ import warnings
74
  warnings.filterwarnings("ignore")
75
 
76
 
77
- # #### 2.2 Datos <a id=6></a>
78
-
79
- # In[2]:
80
 
81
 
82
  df = pd.read_csv("heart.csv")
83
 
84
 
85
- # #### 2.3 Entendimiento de los Datos <a id=7></a>
86
-
87
- # ##### 2.3.1 El tamaño del dataframe
88
-
89
- # In[3]:
90
-
91
-
92
- print("El tamaño del dataframe es de: ", df.shape)
93
-
94
-
95
- # ##### 2.3.2 Vista previa de las primeras 5 filas de los datos
96
-
97
- # In[4]:
98
-
99
-
100
- df.head()
101
-
102
-
103
- # ##### 2.3.3 Verificar el numero de valores unicos que se encuentran en cada columna
104
-
105
- # In[5]:
106
 
107
 
108
  dict = {}
@@ -112,9 +31,7 @@ for i in list(df.columns):
112
  pd.DataFrame(dict,index=["unique count"]).transpose()
113
 
114
 
115
- # ##### 2.3.4 Separando las columnas en categoricas y continuas
116
-
117
- # In[6]:
118
 
119
 
120
  cat_cols = ['sex','exng','caa','cp','fbs','restecg','slp','thall']
@@ -125,39 +42,7 @@ print("Columnas continuas: ", con_cols)
125
  print("Variable dependiente: ", target_col)
126
 
127
 
128
- # ##### 2.3.5 Resumen de estadísticas
129
-
130
- # In[7]:
131
-
132
-
133
- df[con_cols].describe().transpose()
134
-
135
-
136
- # ##### 2.3.6 Valores perdidos
137
-
138
- # ### 4. Preprocesamiento de los datos <a id=11></a>
139
- # [Volver al inicio](#18)
140
-
141
- # #### 4.1 Conclusiones del EDA <a id=12></a>
142
- #
143
- # 1. No hay valores NaN en los datos.
144
- # 2. Hay ciertos valores atípicos (outliers) en todas las variables continuas.
145
- # 3. Los datos consisten en más del doble de personas con sexo = 1 que con sexo = 0.
146
- # 4. No hay una correlación lineal aparente entre las variables continuas según el mapa de calor.
147
- # 5. La matriz de gráficos de dispersión sugiere que puede haber alguna correlación entre output y cp, thalachh y slp.
148
- # 6. Es intuitivo pensar que las personas mayores podrían tener más probabilidades de sufrir un ataque cardíaco, pero según el gráfico de distribución de edad en relación a output, queda claro que este no es el caso.
149
- # 7. Según el gráfico de distribución de thalachh en relación a output, las personas con mayor frecuencia cardíaca máxima alcanzada tienen más probabilidades de sufrir un ataque cardíaco.
150
- # 8. Según el gráfico de distribución de oldpeak en relación a output, las personas con un pico anterior más bajo tienen más probabilidades de sufrir un ataque cardíaco.
151
- # 9. El gráfico 3.2.4 indica lo siguiente:
152
- # - Las personas con dolor de pecho no anginoso, es decir, con cp = 2, tienen más probabilidades de sufrir un ataque cardíaco.
153
- # - Las personas sin vasos principales, es decir, con caa = 0, tienen una alta probabilidad de sufrir un ataque cardíaco.
154
- # - Las personas con sexo = 1 tienen una mayor probabilidad de sufrir un ataque cardíaco.
155
- # - Las personas con thall = 2 tienen muchas más probabilidades de sufrir un ataque cardíaco.
156
- # - Las personas sin angina inducida por el ejercicio, es decir, con exng = 0, tienen más probabilidades de sufrir un ataque cardíaco.
157
-
158
- # #### 4.2 Librerias <a id=13></a>
159
-
160
- # In[8]:
161
 
162
 
163
  # Escalamiento
@@ -185,12 +70,7 @@ from sklearn.model_selection import GridSearchCV
185
  print('Packages imported...')
186
 
187
 
188
- #
189
- # #### 4.3 Preparando las características para el modelo <a id=14></a>
190
-
191
- # ##### 4.3.1 Escalado y codificación de características
192
-
193
- # In[9]:
194
 
195
 
196
  # Creación de una copia del df
@@ -216,26 +96,13 @@ print("Las primeras 5 filas de X")
216
  X.head()
217
 
218
 
219
- # ##### 4.3.2 División de los datos de entrenamiento y prueba
220
-
221
- # In[10]:
222
 
223
 
224
  X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 42)
225
- print("El tamaño de X_train es ", X_train.shape)
226
- print("El tamaño de X_test es ",X_test.shape)
227
- print("El tamaño de y_train es ",y_train.shape)
228
- print("El tamaño de y_test es ",y_test.shape)
229
-
230
-
231
- # ### 5. Modelado <a id=15></a>
232
- # [Volver al inicio](#18)
233
 
234
- # #### 5.1 Clasificadores lineales <a id=16></a>
235
 
236
- # ##### 5.1.3 Regresión Logística
237
-
238
- # In[11]:
239
 
240
 
241
  # Instanciamiento del objeto
@@ -254,15 +121,7 @@ y_pred = np.argmax(y_pred_proba,axis=1)
254
  print("El puntaje de precisión en la prueba de Regresión Logística es ", accuracy_score(y_test, y_pred))
255
 
256
 
257
- # # GRADIO
258
-
259
- # In[12]:
260
-
261
-
262
- get_ipython().system('pip install -q gradio')
263
-
264
-
265
- # In[13]:
266
 
267
 
268
  #Importamos gradio
@@ -272,262 +131,196 @@ import gradio as gr
272
  # In[ ]:
273
 
274
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
 
276
 
 
277
 
278
- # In[14]:
279
-
280
-
281
- # Creamos la función con la que generaremos predicciones mediante el llenado de los
282
- # valores de las variables
283
- def diagnosticar(age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall):
284
-
285
- paciente_info = {
286
- 'age' : [age],
287
- 'sex' : [sex],
288
- 'cp' : [cp],
289
- 'trtbps' : [trtbps],
290
- 'chol' : [chol],
291
- 'fbs' : [fbs],
292
- 'restecg' : [restecg],
293
- 'thalachh' : [thalachh],
294
- 'exng' : [exng],
295
- 'oldpeak' : [oldpeak],
296
- 'slp' : [slp],
297
- 'caa' : [caa],
298
- 'thall' : [thall]
299
- }
300
-
301
- paciente = pd.DataFrame(paciente_info)
302
-
303
- # Codificando las columnas categoricas
304
- paciente_dummy = pd.get_dummies(paciente, columns = cat_cols, drop_first = True)
305
-
306
- # Definiendo los atributos independientes y el atributo dependiente
307
- all_cols = set(X_train.columns)
308
-
309
- missing_cols = all_cols - set(paciente_dummy.columns)
310
- for col in missing_cols:
311
- paciente_dummy[col] = 0
312
-
313
- paciente_dummy = paciente_dummy[X_train.columns]
314
-
315
- paciente[con_cols] = scaler.transform(paciente[con_cols])
316
-
317
-
318
- # Haciendo predicciones en nuevos datos
319
- prediccion = logreg.predict(paciente_dummy)
320
-
321
- #crear graficas para comparar el paciente con la media o el resto del dataset
322
-
323
- if prediccion == 0:
324
- return "No se presenta riesgo de un infarto"
325
- else:
326
- return "Existe riesgo de infarto\nPor favor visite a un medico"
327
-
328
-
329
-
330
-
331
-
332
-
333
-
334
- # ### Creamos la lista de campos de entrada para la interface
335
-
336
- # In[15]:
337
 
 
 
338
 
339
- # Lista de entradas de datos
340
- inputs_list =[
341
- gr.Textbox(label="Edad",placeholder="Ingrese su edad en años."),
342
 
343
- gr.Dropdown(label="Sexo",
344
- choices=["0","1"],
345
- info="Mujer (0)\nHombre (1)",
346
- placeholder="Seleccione la opción correspondiente."),
347
 
348
- gr.Dropdown(label="Tipo de dolor toracico",
349
- info="0 = Angina típica\n1 = Angina atípica\n2 = Dolor no anginal\n3 = Asintomático",
350
- choices=["0","1","2","3"],
351
- placeholder="Seleccione la opción correspondiente."),
352
 
353
- gr.Textbox(label="Presión arterial en reposo",
354
- info="(en mm Hg)",
355
- placeholder="Ingrese su presión arterial."),
 
 
 
 
356
 
357
- gr.Textbox(label="Colesterol",
358
- info="(en mg/dl obtenido a través del sensor de IMC)",
359
- placeholder="Ingrese su nivel de colesterol."),
360
 
361
- gr.Dropdown(label="Azúcar en sangre en ayunas",
362
- info = "¿Es mayor a 120 mg/dl?\nSi (1) No (0)",
363
- choices =["0","1"],
364
- placeholder="Seleccione la opción correspondiente."),
 
 
365
 
366
- gr.Dropdown(label="Resultados electrocardiográficos en reposo",
367
- choices=["0","1","2"],
368
- info="0 = Normal\n1 = Normalidad de la onda ST-T\n2 = Hipertrofia ventricular izquierda",
369
- placeholder="Seleccione la opción correspondiente."),
370
 
371
- gr.Textbox(label="Ritmo cardíaco máximo alcanzado",
372
- placeholder="Ingrese su ritmo cardíaco."),
373
 
374
- gr.Dropdown(label="Angina inducida por ejercicio",
375
- choices=["0","1"],
376
- info= "Si (1)\nNo (0)",
377
- placeholder="Seleccione la opción correspondiente."),
378
 
379
- gr.Textbox(label ="Depresión ST(Old Peak)",
380
- info="Inducida por el ejercicio en relación al reposo.",
381
- placeholder="Ingrese el valor correspondiente."),
382
 
383
- gr.Textbox(label="Pendiente del segmento ST",
384
- #info="El segmento ST normalmente debe ser horizontal o ligeramente\nascendente desde la línea de base, y cualquier desviación puede\nindicar una lesión o isquemia cardíaca. La pendiente del segmento\nST se mide en grados, y se utiliza como un indicador de la\npresencia y la gravedad de la isquemia."
385
- info="-- Valor 1: ascendente\n-- Valor 2: horizontal\n-- Valor 3: descendente",
386
- placeholder="Ingrese el valor en el pico del ejercicio."),
387
 
388
- gr.Dropdown(label="Número de vasos principales",
389
- info="Valor obtenido en Fluoroscopia ",
390
- choices=["0","1","2","3"],
391
- placeholder="Seleccione la opción correspondiente."),
392
 
393
- gr.Dropdown(label="Resultado de la prueba de esfuerzo con talio",
394
- info="1 = normal.\n2 = defecto fijo.\n3 = defecto reversible.",
395
- choices=["1","2","3"],
396
- placeholder="Seleccione la opción correspondiente.")]
 
397
 
 
398
 
399
- # ### Creación de block, en vez de interface
400
 
401
- # In[16]:
402
 
403
 
404
- #import gradio as gr
405
  # Creamos la función con la que generaremos predicciones mediante el llenado de los
406
- # valores de las variables
407
  def diagnosticar(age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall):
408
-
409
- paciente_info = {
410
- 'age' : [age],
411
- 'sex' : [sex],
412
- 'cp' : [cp],
413
- 'trtbps' : [trtbps],
414
- 'chol' : [chol],
415
- 'fbs' : [fbs],
416
- 'restecg' : [restecg],
417
- 'thalachh' : [thalachh],
418
- 'exng' : [exng],
419
- 'oldpeak' : [oldpeak],
420
- 'slp' : [slp],
421
- 'caa' : [caa],
422
- 'thall' : [thall]
423
- }
424
-
425
- paciente = pd.DataFrame(paciente_info)
426
-
427
- # Codificando las columnas categoricas
428
- paciente_dummy = pd.get_dummies(paciente, columns = cat_cols, drop_first = True)
429
-
430
- # Definiendo los atributos independientes y el atributo dependiente
431
- all_cols = set(X_train.columns)
432
-
433
- missing_cols = all_cols - set(paciente_dummy.columns)
434
- for col in missing_cols:
435
- paciente_dummy[col] = 0
436
-
437
- paciente_dummy = paciente_dummy[X_train.columns]
438
-
439
- paciente[con_cols] = scaler.transform(paciente[con_cols])
440
-
441
-
442
- # Haciendo predicciones en nuevos datos
443
- prediccion = logreg.predict(paciente_dummy)
444
-
445
- #crear graficas para comparar el paciente con la media o el resto del dataset
446
- #
447
- #
448
- #
449
-
450
-
451
- if prediccion == 0:
452
- return "No se presenta riesgo de un infarto"
453
  else:
454
- return "Existe riesgo de infarto\nPor favor visite a un medico"
455
-
456
-
457
- # In[17]:
458
-
459
-
460
- # creación de tema a medida
461
- custom_theme = gr.themes.Soft(
462
- primary_hue="teal",
463
- secondary_hue="cyan",
464
- neutral_hue="zinc"
465
- ).set(
466
- body_background_fill='*stat_background_fill',
467
- body_background_fill_dark='*neutral_800',
468
- body_text_color_subdued='*primary_100',
469
- body_text_weight='500',
470
- background_fill_primary_dark='*neutral_700',
471
- background_fill_secondary_dark='*background_fill_primary',
472
- border_color_accent='*primary_600',
473
- border_color_accent_dark='*neutral_950',
474
- color_accent='*neutral_800',
475
- color_accent_soft_dark='*body_text_color_subdued',
476
- link_text_color='*neutral_800',
477
- link_text_color_dark='*border_color_primary',
478
- prose_text_weight='500',
479
- prose_header_text_weight='400',
480
- block_background_fill='*neutral_700',
481
- block_border_color_dark='*neutral_950',
482
- block_border_width_dark='1 px',
483
- block_info_text_size='*text_md',
484
- block_label_background_fill_dark='*primary_800',
485
- checkbox_background_color='*neutral_200',
486
- checkbox_background_color_dark='*neutral_950',
487
- checkbox_background_color_focus_dark='*neutral_800',
488
- checkbox_border_color='*neutral_300',
489
- checkbox_border_color_dark='*neutral_800'
490
- )
491
-
492
-
493
- # In[18]:
494
-
495
-
496
- theme = gr.themes.Soft(
497
- primary_hue="red",
498
- secondary_hue="orange",
499
- neutral_hue="zinc"
500
- ).set(body_background_fill='*stat_background_fill',
501
- body_background_fill_dark='*neutral_800',
502
- body_text_color_subdued='*primary_100',
503
- body_text_weight='500',
504
- background_fill_primary_dark='*neutral_700',
505
- background_fill_secondary_dark='*background_fill_primary',
506
- border_color_accent='*primary_600',
507
- border_color_accent_dark='*neutral_950',
508
- color_accent='*neutral_800',
509
- color_accent_soft_dark='*body_text_color_subdued',
510
- link_text_color='*neutral_800',
511
- link_text_color_dark='*border_color_primary',
512
- prose_text_weight='500',
513
- prose_header_text_weight='400',
514
- block_background_fill='*neutral_700',
515
- block_border_color_dark='*neutral_950',
516
- block_border_width_dark='1 px',
517
- block_info_text_size='*text_md',
518
- block_label_background_fill_dark='*primary_800',
519
- checkbox_background_color='*neutral_200',
520
- checkbox_background_color_dark='*neutral_950',
521
- checkbox_background_color_focus_dark='*neutral_800',
522
- checkbox_border_color='*neutral_300',
523
- checkbox_border_color_dark='*neutral_800')
524
 
525
 
526
- # In[19]:
527
 
528
 
529
  # Creación de block
530
- with gr.Blocks(title="Predicción de riesgo de un IAM", theme = theme) as modelo:
531
  gr.Markdown(
532
  """
533
  # Predicción de riesgo de un IAM
@@ -595,10 +388,12 @@ with gr.Blocks(title="Predicción de riesgo de un IAM", theme = theme) as modelo
595
  prediction_btn = gr.Button(value = "Generar")
596
  with gr.Row():
597
  prediction = gr.Textbox(label=("Resultado"))
 
 
598
 
599
  prediction_btn.click(diagnosticar,
600
  inputs = [age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall],
601
- outputs = prediction,
602
  api_name = "prediccion-riesgo-iam")
603
  examples = gr.Examples(label="Ejemplos", examples=[
604
  [64, 1, 0, 120, 246, 0, 0, 96, 1, 2.2, 0, 1, 2], # riesgo inexistente
@@ -608,85 +403,8 @@ with gr.Blocks(title="Predicción de riesgo de un IAM", theme = theme) as modelo
608
  ], inputs=[age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall])
609
 
610
 
611
- # In[20]:
612
-
613
-
614
- #modelo.theme = custom_theme
615
-
616
-
617
- # In[21]:
618
-
619
-
620
- modelo.launch(share = True, debug=True)
621
-
622
-
623
- # ### Uso de interfaz y no de block
624
-
625
- # In[ ]:
626
-
627
-
628
- # creamos la instancia de la interfaz
629
- iface = gr.Interface(fn = diagnosticar, inputs = inputs_list, outputs=["text"], examples=[
630
- [64, 1, 0, 120, 246, 0, 0, 96, 1, 2.2, 0, 1, 2], # riesgo inexistente
631
- [43,0,0,132,341,1,0,136,1,3,1,0,3,0], # riesgo inexistente
632
- [50,0,2,120,219,0,1,158,0,1.6,1,0,2,1], # hay riesgo
633
- [37,1,2,130,250,0,1,187,0,3.5,0,0,2],# hay riesgo
634
- ],
635
- theme=gr.themes.Soft(),
636
- description="Modelo de Regresión Lineal para identificar la existencia de riesgo de un ataque al corazón (IAM)"
637
- )
638
-
639
-
640
- # In[ ]:
641
-
642
-
643
- # inicializamos la interfaz
644
- iface.launch(share=True, debug=True)
645
-
646
-
647
- # ## Codigo para predicciones individuales
648
-
649
  # In[ ]:
650
 
651
 
652
- # Creamos el registro de un nuevo paciente
653
- paciente_info = {
654
- 'age' : [64],
655
- 'sex' : [1],
656
- 'cp' : [0],
657
- 'trtbps' : [120],
658
- 'chol' : [246],
659
- 'fbs' : [0],
660
- 'restecg' : [0],
661
- 'thalachh' : [96],
662
- 'exng' : [1],
663
- 'oldpeak' : [2.2],
664
- 'slp' : [0],
665
- 'caa' : [1],
666
- 'thall' : [2],
667
- }
668
-
669
- paciente = pd.DataFrame(paciente_info)
670
-
671
- # Codificando las columnas categoricas
672
- paciente_dummy = pd.get_dummies(paciente, columns = cat_cols, drop_first = True)
673
-
674
- # Definiendo los atributos independientes y el atributo dependiente
675
- all_cols = set(X_train.columns)
676
-
677
- missing_cols = all_cols - set(paciente_dummy.columns)
678
- for col in missing_cols:
679
- paciente_dummy[col] = 0
680
-
681
- paciente_dummy = paciente_dummy[X_train.columns]
682
-
683
- paciente[con_cols] = scaler.transform(paciente[con_cols])
684
-
685
-
686
- # Haciendo predicciones en nuevos datos
687
- y_new_pred = logreg.predict(paciente_dummy)
688
- if y_new_pred == 0:
689
- print("No se presenta riesgo de un infarto")
690
- else:
691
- print("Existe riesgo de infarto\nPor favor visite a un medico")
692
 
 
1
+ #!/usr/bin/env python
2
+ # coding: utf-8
3
+
4
+ # In[ ]:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
 
7
  # Importacion de librerias
 
15
  warnings.filterwarnings("ignore")
16
 
17
 
18
+ # In[ ]:
 
 
19
 
20
 
21
  df = pd.read_csv("heart.csv")
22
 
23
 
24
+ # In[ ]:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
 
27
  dict = {}
 
31
  pd.DataFrame(dict,index=["unique count"]).transpose()
32
 
33
 
34
+ # In[ ]:
 
 
35
 
36
 
37
  cat_cols = ['sex','exng','caa','cp','fbs','restecg','slp','thall']
 
42
  print("Variable dependiente: ", target_col)
43
 
44
 
45
+ # In[ ]:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
 
48
  # Escalamiento
 
70
  print('Packages imported...')
71
 
72
 
73
+ # In[ ]:
 
 
 
 
 
74
 
75
 
76
  # Creación de una copia del df
 
96
  X.head()
97
 
98
 
99
+ # In[ ]:
 
 
100
 
101
 
102
  X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 42)
 
 
 
 
 
 
 
 
103
 
 
104
 
105
+ # In[ ]:
 
 
106
 
107
 
108
  # Instanciamiento del objeto
 
121
  print("El puntaje de precisión en la prueba de Regresión Logística es ", accuracy_score(y_test, y_pred))
122
 
123
 
124
+ # In[ ]:
 
 
 
 
 
 
 
 
125
 
126
 
127
  #Importamos gradio
 
131
  # In[ ]:
132
 
133
 
134
+ # creación de tema personalizado
135
+ custom_theme = gr.themes.Soft(
136
+ primary_hue="emerald",
137
+ secondary_hue="teal",
138
+ neutral_hue="stone",
139
+ text_size="lg",
140
+ spacing_size="sm",
141
+ radius_size="lg"
142
+ ).set(
143
+ body_background_fill='stat_background_fill',
144
+ body_background_fill_dark='neutral_800',
145
+ body_text_color_subdued='primary_100',
146
+ body_text_weight='500',
147
+ background_fill_primary_dark='neutral_700',
148
+ background_fill_secondary_dark='background_fill_neutral',
149
+ border_color_accent='primary_600',
150
+ border_color_accent_dark='neutral_950',
151
+ color_accent='neutral_800',
152
+ color_accent_soft_dark='body_text_color_subdued',
153
+ link_text_color='neutral_800',
154
+ link_text_color_dark='border_color_primary',
155
+ prose_text_weight='500',
156
+ prose_header_text_weight='400',
157
+ block_background_fill='neutral_700',
158
+ block_border_color_dark='neutral_950',
159
+ block_border_width_dark='1 px',
160
+ block_info_text_size='text_md',
161
+ block_label_background_fill_dark='primary_800',
162
+ checkbox_background_color='neutral_200',
163
+ checkbox_background_color_dark='neutral_950',
164
+ checkbox_background_color_focus_dark='neutral_800',
165
+ checkbox_border_color='neutral_300',
166
+ checkbox_border_color_dark='neutral_800'
167
+ )
168
 
169
 
170
+ # In[ ]:
171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
 
173
+ # Crear archivos temporales para guardar el grafico en una imagen
174
+ import tempfile
175
 
 
 
 
176
 
177
+ # In[ ]:
 
 
 
178
 
 
 
 
 
179
 
180
+ def crear_grafico(datos_paciente):
181
+ features_mean_df= pd.DataFrame([df.mean(axis = 0)])
182
+ features_mean_df = features_mean_df.drop(['output'], axis = 1)
183
+
184
+ # Valores para X y Y para la media
185
+ x_plot = features_mean_df.columns.values # Nombre columnas
186
+ y_plot_means = features_mean_df.iloc[0].values # Medias
187
 
188
+ # Valores para X y Y para los datos ingresados del paciente
189
+ y_plot_paciente = pd.DataFrame(datos_paciente).iloc[0].values
 
190
 
191
+ # Crear el gráfico de barras para la media del dataset
192
+ fig, ax = plt.subplots()
193
+ width = 0.35 # the width of the bars
194
+ ind = np.arange(len(y_plot_means)) # the x locations for the groups
195
+ # Gráfico de barras para la media
196
+ ax.barh(ind, y_plot_means, width, color="darkseagreen", label='Media')
197
 
198
+ # Gráfico de barras para los datos del paciente
199
+ ax.barh(ind + width, y_plot_paciente.astype(float), width, color="skyblue")
 
 
200
 
201
+ ax.set_yticks(ind+width/2)
202
+ ax.set_yticklabels(x_plot, minor=False)
203
 
204
+ plt.title('Valor promedio de cada atributo')
205
+ plt.xlabel('Media')
206
+ plt.ylabel('Atributo')
 
207
 
208
+ plt.legend()
209
+ fig.set_facecolor("mediumaquamarine")
210
+ ax.set_facecolor("mintcream")
211
 
212
+ # for i, v in enumerate(y_plot_paciente):
213
+ # ax.text(v + 4, i + width + .33, str(round(v, 2)), color='steelblue', fontweight='bold')
 
 
214
 
215
+ for i, v in enumerate(y_plot_means):
216
+ ax.text(v + 4, i + .25, str(round(v, 2)), color='forestgreen', fontweight='bold')
 
 
217
 
218
+ # Guardar la figura en un archivo temporal
219
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file:
220
+ fig.savefig(temp_file, format='png')
221
+ temp_file.close()
222
+ temp_filename = temp_file.name
223
 
224
+ return temp_filename
225
 
 
226
 
227
+ # In[ ]:
228
 
229
 
 
230
  # Creamos la función con la que generaremos predicciones mediante el llenado de los
231
+ # valores de las variables y validaremos los valores que contienen los campos
232
  def diagnosticar(age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall):
233
+ # ---código para validación de campos---
234
+ # Creamos una lista donde se almacenarán los nombres de todos los campo de la UI
235
+ nombres_campos = ['Edad', 'Sexo', 'Tipo de dolor toracico',
236
+ 'Presión arterial en reposo', 'Colesterol',
237
+ 'Azúcar en sangre en ayunas',
238
+ 'Resultados electrocardiográficos en reposo',
239
+ 'Ritmo cardíaco máximo alcanzado',
240
+ 'Angina inducida por ejercicio',
241
+ 'Depresión ST(Old Peak)', 'Pendiente del segmento ST',
242
+ 'Número de vasos principales',
243
+ 'Resultado de la prueba de esfuerzo con talio']
244
+
245
+ # creamos una lista donde se almacenan los valores de los campos
246
+ inputs = [age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall]
247
+
248
+ if all(var is not None and (var!= "" )and (var!= '') for var in inputs):
249
+ # verdadero si todas las variables tienen valores distintos a nulo
250
+ not_nulls = True;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  else:
252
+ # falso si alguna de las variables tiene un valor nulo
253
+ not_nulls = False
254
+ # creamos una lista la cual contendra una tupla, donde se tendrá el nombre del campo y su valor nulo
255
+ campos_con_nulos = [nombres_campos[i] for i in range(len(inputs)) if (inputs[i] == "") or (inputs[i] == '') or (inputs[i] is None)]
256
+ # Dependiendo de la cantidad de campos vacíos mostraremos su error correspondiente
257
+ if len(campos_con_nulos) == 1:
258
+ raise gr.Error(message = f"Falta el campo: {campos_con_nulos} por llenar!")
259
+ else:
260
+ # creamos una cadena a partir de la lista campos_con_nulos
261
+ # juntaremos todos los registros en una sola cadena y separaremos el nombre
262
+ # de cada campo con una coma, seguido de un espacio y antes de que se
263
+ # muestre el nombre del campo se escribe una viñeta, esto para facilitarle
264
+ # al usuario la identificación de los campos vacíos
265
+ campos_faltantes = ', •'.join([campo for campo in campos_con_nulos])
266
+ raise gr.Error(message = f"¡Faltan por llenar {len(campos_con_nulos)} campos!: •{campos_faltantes}")
267
+
268
+ #---código para generar las predicciones---
269
+ if(not_nulls):
270
+ paciente_info = {
271
+ 'age' : [age],
272
+ 'sex' : [sex],
273
+ 'cp' : [cp],
274
+ 'trtbps' : [trtbps],
275
+ 'chol' : [chol],
276
+ 'fbs' : [fbs],
277
+ 'restecg' : [restecg],
278
+ 'thalachh' : [thalachh],
279
+ 'exng' : [exng],
280
+ 'oldpeak' : [oldpeak],
281
+ 'slp' : [slp],
282
+ 'caa' : [caa],
283
+ 'thall' : [thall]
284
+ }
285
+ # creacion de DF para almacenar la información del paciente o usuario que
286
+ # quiera generar una predicción
287
+ paciente = pd.DataFrame(paciente_info)
288
+
289
+ #crear graficas para comparar el paciente con la media o el resto del dataset
290
+ graph = crear_grafico(paciente)
291
+
292
+ # Codificando las columnas categoricas
293
+ paciente_dummy = pd.get_dummies(paciente, columns = cat_cols, drop_first = True)
294
+
295
+ # Definiendo los atributos independientes y el atributo dependiente
296
+ all_cols = set(X_train.columns)
297
+
298
+ missing_cols = all_cols - set(paciente_dummy.columns)
299
+ for col in missing_cols:
300
+ paciente_dummy[col] = 0
301
+
302
+ paciente_dummy = paciente_dummy[X_train.columns]
303
+
304
+ paciente[con_cols] = scaler.transform(paciente[con_cols])
305
+
306
+ # Haciendo predicciones en nuevos datos
307
+ prediccion = logreg.predict(paciente_dummy)
308
+
309
+
310
+ if prediccion == 0:
311
+ return ("No se presenta riesgo de un infarto", graph)
312
+ else:
313
+ return ("Existe riesgo de infarto\nPor favor visite a un medico", graph)
314
+ else:
315
+ raise gr.Error("¡ERROR CRÍTICO.- Consulte a los desarrolladores.")
316
+
 
 
 
 
 
317
 
318
 
319
+ # In[ ]:
320
 
321
 
322
  # Creación de block
323
+ with gr.Blocks(title="Predicción de riesgo de un IAM", theme = custom_theme) as modelo:
324
  gr.Markdown(
325
  """
326
  # Predicción de riesgo de un IAM
 
388
  prediction_btn = gr.Button(value = "Generar")
389
  with gr.Row():
390
  prediction = gr.Textbox(label=("Resultado"))
391
+ with gr.Row():
392
+ graphGR = gr.Image(label=("Grafica"))
393
 
394
  prediction_btn.click(diagnosticar,
395
  inputs = [age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall],
396
+ outputs = [prediction, graphGR],
397
  api_name = "prediccion-riesgo-iam")
398
  examples = gr.Examples(label="Ejemplos", examples=[
399
  [64, 1, 0, 120, 246, 0, 0, 96, 1, 2.2, 0, 1, 2], # riesgo inexistente
 
403
  ], inputs=[age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall])
404
 
405
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406
  # In[ ]:
407
 
408
 
409
+ modelo.launch(share = True, debug=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
 
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ scikit-learn
2
+ pandas
3
+ numpy
4
+ matplotlib
5
+ torch