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

First commit

Browse files
Files changed (2) hide show
  1. corazao_con_block_y_theme.py +692 -0
  2. heart.csv +304 -0
corazao_con_block_y_theme.py ADDED
@@ -0,0 +1,692 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
67
+
68
+ import pandas as pd
69
+ import numpy as np
70
+ import matplotlib.pyplot as plt
71
+ import seaborn as sns
72
+
73
+ 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 = {}
109
+ for i in list(df.columns):
110
+ dict[i] = df[i].value_counts().shape[0]
111
+
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']
121
+ con_cols = ["age","trtbps","chol","thalachh","oldpeak"]
122
+ target_col = ["output"]
123
+ print("Columnas categóricas: ", cat_cols)
124
+ 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
164
+ from sklearn.preprocessing import RobustScaler
165
+
166
+ # Train Test Split
167
+ from sklearn.model_selection import train_test_split
168
+
169
+ # Modelos
170
+ import torch
171
+ import torch.nn as nn
172
+ from sklearn.svm import SVC
173
+ from sklearn.linear_model import LogisticRegression
174
+ from sklearn.ensemble import RandomForestClassifier
175
+ from sklearn.tree import DecisionTreeClassifier
176
+ from sklearn.ensemble import GradientBoostingClassifier
177
+
178
+ # Metricas
179
+ from sklearn.metrics import accuracy_score, classification_report, roc_curve
180
+
181
+ # Cross Validation
182
+ from sklearn.model_selection import cross_val_score
183
+ from sklearn.model_selection import GridSearchCV
184
+
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
197
+ df1 = df
198
+
199
+ # Seleccion de las columnas a ser escaladas y codificadas
200
+ cat_cols = ['sex','exng','caa','cp','fbs','restecg','slp','thall']
201
+ con_cols = ["age","trtbps","chol","thalachh","oldpeak"]
202
+
203
+ # Codificando las columnas categoricas
204
+ df1 = pd.get_dummies(df1, columns = cat_cols, drop_first = True)
205
+
206
+ # Definiendo los atributos independientes y el atributo dependiente
207
+ X = df1.drop(['output'],axis=1)
208
+ y = df1[['output']]
209
+
210
+ # Instanciando el escalador
211
+ scaler = RobustScaler()
212
+
213
+ # Escalando los atributos continuos
214
+ X[con_cols] = scaler.fit_transform(X[con_cols])
215
+ 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
242
+ logreg = LogisticRegression()
243
+
244
+ # Ajustando el objeto
245
+ logreg.fit(X_train, y_train)
246
+
247
+ # Calculo de probabilidades
248
+ y_pred_proba = logreg.predict_proba(X_test)
249
+
250
+ # Encontrando los valores predichos
251
+ y_pred = np.argmax(y_pred_proba,axis=1)
252
+
253
+ # Impresión de la prueba de precisión
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
269
+ import gradio as gr
270
+
271
+
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
534
+ Modelo de Regresión Lineal para identificar la existencia de riesgo de un ataque al corazón (IAM).
535
+ """
536
+ )
537
+ with gr.Row():
538
+ with gr.Column():
539
+ age = gr.Textbox(label="Edad",placeholder="Ingrese su edad en años.")
540
+ with gr.Row():
541
+ sex = gr.Dropdown(label="Sexo",
542
+ choices=["0","1"],
543
+ info="Mujer (0)\nHombre (1)",
544
+ placeholder="Seleccione la opción correspondiente.")
545
+ with gr.Row():
546
+ cp = gr.Dropdown(label="Tipo de dolor toracico",
547
+ info="0 = Angina típica\n1 = Angina atípica\n2 = Dolor no anginal\n3 = Asintomático",
548
+ choices=["0","1","2","3"],
549
+ placeholder="Seleccione la opción correspondiente.")
550
+ with gr.Row():
551
+ trtbps = gr.Textbox(label="Presión arterial en reposo",
552
+ info="(en mm Hg)",
553
+ placeholder="Ingrese su presión arterial.")
554
+ with gr.Row():
555
+ chol = gr.Textbox(label="Colesterol",
556
+ info="(en mg/dl obtenido a través del sensor de IMC)",
557
+ placeholder="Ingrese su nivel de colesterol.")
558
+ with gr.Row():
559
+ fbs = gr.Dropdown(label="Azúcar en sangre en ayunas",
560
+ info = "¿Es mayor a 120 mg/dl?\nSi (1) No (0)",
561
+ choices =["0","1"],
562
+ placeholder="Seleccione la opción correspondiente.")
563
+ with gr.Row():
564
+ restecg = gr.Dropdown(label="Resultados electrocardiográficos en reposo",
565
+ choices=["0","1","2"],
566
+ info="0 = Normal\n1 = Normalidad de la onda ST-T\n2 = Hipertrofia ventricular izquierda",
567
+ placeholder="Seleccione la opción correspondiente.")
568
+ with gr.Row():
569
+ thalachh = gr.Textbox(label="Ritmo cardíaco máximo alcanzado",
570
+ placeholder="Ingrese su ritmo cardíaco.")
571
+ with gr.Row():
572
+ exng = gr.Dropdown(label="Angina inducida por ejercicio",
573
+ choices=["0","1"],
574
+ info= "Si (1)\nNo (0)",
575
+ placeholder="Seleccione la opción correspondiente.")
576
+ with gr.Row():
577
+ oldpeak = gr.Textbox(label ="Depresión ST(Old Peak)",
578
+ info="Inducida por el ejercicio en relación al reposo.",
579
+ placeholder="Ingrese el valor correspondiente.")
580
+ with gr.Row():
581
+ slp = gr.Textbox(label="Pendiente del segmento ST",
582
+ info="-- Valor 1: ascendente\n-- Valor 2: horizontal\n-- Valor 3: descendente",
583
+ placeholder="Ingrese el valor en el pico del ejercicio.")
584
+ with gr.Row():
585
+ caa = gr.Dropdown(label="Número de vasos principales",
586
+ info="Valor obtenido en Fluoroscopia ",
587
+ choices=["0","1","2","3"],
588
+ placeholder="Seleccione la opción correspondiente.")
589
+ with gr.Row():
590
+ thall = gr.Dropdown(label="Resultado de la prueba de esfuerzo con talio",
591
+ info="1 = normal.\n2 = defecto fijo.\n3 = defecto reversible.",
592
+ choices=["1","2","3"],
593
+ placeholder="Seleccione la opción correspondiente.")
594
+ with gr.Row():
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
605
+ [43,0,0,132,341,1,0,136,1,3,1,0,3,0], # riesgo inexistente
606
+ [50,0,2,120,219,0,1,158,0,1.6,1,0,2,1], # hay riesgo
607
+ [37,1,2,130,250,0,1,187,0,3.5,0,0,2]# hay riesgo
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
+
heart.csv ADDED
@@ -0,0 +1,304 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall,output
2
+ 63,1,3,145,233,1,0,150,0,2.3,0,0,1,1
3
+ 37,1,2,130,250,0,1,187,0,3.5,0,0,2,1
4
+ 41,0,1,130,204,0,0,172,0,1.4,2,0,2,1
5
+ 56,1,1,120,236,0,1,178,0,0.8,2,0,2,1
6
+ 57,0,0,120,354,0,1,163,1,0.6,2,0,2,1
7
+ 57,1,0,140,192,0,1,148,0,0.4,1,0,1,1
8
+ 56,0,1,140,294,0,0,153,0,1.3,1,0,2,1
9
+ 44,1,1,120,263,0,1,173,0,0,2,0,3,1
10
+ 52,1,2,172,199,1,1,162,0,0.5,2,0,3,1
11
+ 57,1,2,150,168,0,1,174,0,1.6,2,0,2,1
12
+ 54,1,0,140,239,0,1,160,0,1.2,2,0,2,1
13
+ 48,0,2,130,275,0,1,139,0,0.2,2,0,2,1
14
+ 49,1,1,130,266,0,1,171,0,0.6,2,0,2,1
15
+ 64,1,3,110,211,0,0,144,1,1.8,1,0,2,1
16
+ 58,0,3,150,283,1,0,162,0,1,2,0,2,1
17
+ 50,0,2,120,219,0,1,158,0,1.6,1,0,2,1
18
+ 58,0,2,120,340,0,1,172,0,0,2,0,2,1
19
+ 66,0,3,150,226,0,1,114,0,2.6,0,0,2,1
20
+ 43,1,0,150,247,0,1,171,0,1.5,2,0,2,1
21
+ 69,0,3,140,239,0,1,151,0,1.8,2,2,2,1
22
+ 59,1,0,135,234,0,1,161,0,0.5,1,0,3,1
23
+ 44,1,2,130,233,0,1,179,1,0.4,2,0,2,1
24
+ 42,1,0,140,226,0,1,178,0,0,2,0,2,1
25
+ 61,1,2,150,243,1,1,137,1,1,1,0,2,1
26
+ 40,1,3,140,199,0,1,178,1,1.4,2,0,3,1
27
+ 71,0,1,160,302,0,1,162,0,0.4,2,2,2,1
28
+ 59,1,2,150,212,1,1,157,0,1.6,2,0,2,1
29
+ 51,1,2,110,175,0,1,123,0,0.6,2,0,2,1
30
+ 65,0,2,140,417,1,0,157,0,0.8,2,1,2,1
31
+ 53,1,2,130,197,1,0,152,0,1.2,0,0,2,1
32
+ 41,0,1,105,198,0,1,168,0,0,2,1,2,1
33
+ 65,1,0,120,177,0,1,140,0,0.4,2,0,3,1
34
+ 44,1,1,130,219,0,0,188,0,0,2,0,2,1
35
+ 54,1,2,125,273,0,0,152,0,0.5,0,1,2,1
36
+ 51,1,3,125,213,0,0,125,1,1.4,2,1,2,1
37
+ 46,0,2,142,177,0,0,160,1,1.4,0,0,2,1
38
+ 54,0,2,135,304,1,1,170,0,0,2,0,2,1
39
+ 54,1,2,150,232,0,0,165,0,1.6,2,0,3,1
40
+ 65,0,2,155,269,0,1,148,0,0.8,2,0,2,1
41
+ 65,0,2,160,360,0,0,151,0,0.8,2,0,2,1
42
+ 51,0,2,140,308,0,0,142,0,1.5,2,1,2,1
43
+ 48,1,1,130,245,0,0,180,0,0.2,1,0,2,1
44
+ 45,1,0,104,208,0,0,148,1,3,1,0,2,1
45
+ 53,0,0,130,264,0,0,143,0,0.4,1,0,2,1
46
+ 39,1,2,140,321,0,0,182,0,0,2,0,2,1
47
+ 52,1,1,120,325,0,1,172,0,0.2,2,0,2,1
48
+ 44,1,2,140,235,0,0,180,0,0,2,0,2,1
49
+ 47,1,2,138,257,0,0,156,0,0,2,0,2,1
50
+ 53,0,2,128,216,0,0,115,0,0,2,0,0,1
51
+ 53,0,0,138,234,0,0,160,0,0,2,0,2,1
52
+ 51,0,2,130,256,0,0,149,0,0.5,2,0,2,1
53
+ 66,1,0,120,302,0,0,151,0,0.4,1,0,2,1
54
+ 62,1,2,130,231,0,1,146,0,1.8,1,3,3,1
55
+ 44,0,2,108,141,0,1,175,0,0.6,1,0,2,1
56
+ 63,0,2,135,252,0,0,172,0,0,2,0,2,1
57
+ 52,1,1,134,201,0,1,158,0,0.8,2,1,2,1
58
+ 48,1,0,122,222,0,0,186,0,0,2,0,2,1
59
+ 45,1,0,115,260,0,0,185,0,0,2,0,2,1
60
+ 34,1,3,118,182,0,0,174,0,0,2,0,2,1
61
+ 57,0,0,128,303,0,0,159,0,0,2,1,2,1
62
+ 71,0,2,110,265,1,0,130,0,0,2,1,2,1
63
+ 54,1,1,108,309,0,1,156,0,0,2,0,3,1
64
+ 52,1,3,118,186,0,0,190,0,0,1,0,1,1
65
+ 41,1,1,135,203,0,1,132,0,0,1,0,1,1
66
+ 58,1,2,140,211,1,0,165,0,0,2,0,2,1
67
+ 35,0,0,138,183,0,1,182,0,1.4,2,0,2,1
68
+ 51,1,2,100,222,0,1,143,1,1.2,1,0,2,1
69
+ 45,0,1,130,234,0,0,175,0,0.6,1,0,2,1
70
+ 44,1,1,120,220,0,1,170,0,0,2,0,2,1
71
+ 62,0,0,124,209,0,1,163,0,0,2,0,2,1
72
+ 54,1,2,120,258,0,0,147,0,0.4,1,0,3,1
73
+ 51,1,2,94,227,0,1,154,1,0,2,1,3,1
74
+ 29,1,1,130,204,0,0,202,0,0,2,0,2,1
75
+ 51,1,0,140,261,0,0,186,1,0,2,0,2,1
76
+ 43,0,2,122,213,0,1,165,0,0.2,1,0,2,1
77
+ 55,0,1,135,250,0,0,161,0,1.4,1,0,2,1
78
+ 51,1,2,125,245,1,0,166,0,2.4,1,0,2,1
79
+ 59,1,1,140,221,0,1,164,1,0,2,0,2,1
80
+ 52,1,1,128,205,1,1,184,0,0,2,0,2,1
81
+ 58,1,2,105,240,0,0,154,1,0.6,1,0,3,1
82
+ 41,1,2,112,250,0,1,179,0,0,2,0,2,1
83
+ 45,1,1,128,308,0,0,170,0,0,2,0,2,1
84
+ 60,0,2,102,318,0,1,160,0,0,2,1,2,1
85
+ 52,1,3,152,298,1,1,178,0,1.2,1,0,3,1
86
+ 42,0,0,102,265,0,0,122,0,0.6,1,0,2,1
87
+ 67,0,2,115,564,0,0,160,0,1.6,1,0,3,1
88
+ 68,1,2,118,277,0,1,151,0,1,2,1,3,1
89
+ 46,1,1,101,197,1,1,156,0,0,2,0,3,1
90
+ 54,0,2,110,214,0,1,158,0,1.6,1,0,2,1
91
+ 58,0,0,100,248,0,0,122,0,1,1,0,2,1
92
+ 48,1,2,124,255,1,1,175,0,0,2,2,2,1
93
+ 57,1,0,132,207,0,1,168,1,0,2,0,3,1
94
+ 52,1,2,138,223,0,1,169,0,0,2,4,2,1
95
+ 54,0,1,132,288,1,0,159,1,0,2,1,2,1
96
+ 45,0,1,112,160,0,1,138,0,0,1,0,2,1
97
+ 53,1,0,142,226,0,0,111,1,0,2,0,3,1
98
+ 62,0,0,140,394,0,0,157,0,1.2,1,0,2,1
99
+ 52,1,0,108,233,1,1,147,0,0.1,2,3,3,1
100
+ 43,1,2,130,315,0,1,162,0,1.9,2,1,2,1
101
+ 53,1,2,130,246,1,0,173,0,0,2,3,2,1
102
+ 42,1,3,148,244,0,0,178,0,0.8,2,2,2,1
103
+ 59,1,3,178,270,0,0,145,0,4.2,0,0,3,1
104
+ 63,0,1,140,195,0,1,179,0,0,2,2,2,1
105
+ 42,1,2,120,240,1,1,194,0,0.8,0,0,3,1
106
+ 50,1,2,129,196,0,1,163,0,0,2,0,2,1
107
+ 68,0,2,120,211,0,0,115,0,1.5,1,0,2,1
108
+ 69,1,3,160,234,1,0,131,0,0.1,1,1,2,1
109
+ 45,0,0,138,236,0,0,152,1,0.2,1,0,2,1
110
+ 50,0,1,120,244,0,1,162,0,1.1,2,0,2,1
111
+ 50,0,0,110,254,0,0,159,0,0,2,0,2,1
112
+ 64,0,0,180,325,0,1,154,1,0,2,0,2,1
113
+ 57,1,2,150,126,1,1,173,0,0.2,2,1,3,1
114
+ 64,0,2,140,313,0,1,133,0,0.2,2,0,3,1
115
+ 43,1,0,110,211,0,1,161,0,0,2,0,3,1
116
+ 55,1,1,130,262,0,1,155,0,0,2,0,2,1
117
+ 37,0,2,120,215,0,1,170,0,0,2,0,2,1
118
+ 41,1,2,130,214,0,0,168,0,2,1,0,2,1
119
+ 56,1,3,120,193,0,0,162,0,1.9,1,0,3,1
120
+ 46,0,1,105,204,0,1,172,0,0,2,0,2,1
121
+ 46,0,0,138,243,0,0,152,1,0,1,0,2,1
122
+ 64,0,0,130,303,0,1,122,0,2,1,2,2,1
123
+ 59,1,0,138,271,0,0,182,0,0,2,0,2,1
124
+ 41,0,2,112,268,0,0,172,1,0,2,0,2,1
125
+ 54,0,2,108,267,0,0,167,0,0,2,0,2,1
126
+ 39,0,2,94,199,0,1,179,0,0,2,0,2,1
127
+ 34,0,1,118,210,0,1,192,0,0.7,2,0,2,1
128
+ 47,1,0,112,204,0,1,143,0,0.1,2,0,2,1
129
+ 67,0,2,152,277,0,1,172,0,0,2,1,2,1
130
+ 52,0,2,136,196,0,0,169,0,0.1,1,0,2,1
131
+ 74,0,1,120,269,0,0,121,1,0.2,2,1,2,1
132
+ 54,0,2,160,201,0,1,163,0,0,2,1,2,1
133
+ 49,0,1,134,271,0,1,162,0,0,1,0,2,1
134
+ 42,1,1,120,295,0,1,162,0,0,2,0,2,1
135
+ 41,1,1,110,235,0,1,153,0,0,2,0,2,1
136
+ 41,0,1,126,306,0,1,163,0,0,2,0,2,1
137
+ 49,0,0,130,269,0,1,163,0,0,2,0,2,1
138
+ 60,0,2,120,178,1,1,96,0,0,2,0,2,1
139
+ 62,1,1,128,208,1,0,140,0,0,2,0,2,1
140
+ 57,1,0,110,201,0,1,126,1,1.5,1,0,1,1
141
+ 64,1,0,128,263,0,1,105,1,0.2,1,1,3,1
142
+ 51,0,2,120,295,0,0,157,0,0.6,2,0,2,1
143
+ 43,1,0,115,303,0,1,181,0,1.2,1,0,2,1
144
+ 42,0,2,120,209,0,1,173,0,0,1,0,2,1
145
+ 67,0,0,106,223,0,1,142,0,0.3,2,2,2,1
146
+ 76,0,2,140,197,0,2,116,0,1.1,1,0,2,1
147
+ 70,1,1,156,245,0,0,143,0,0,2,0,2,1
148
+ 44,0,2,118,242,0,1,149,0,0.3,1,1,2,1
149
+ 60,0,3,150,240,0,1,171,0,0.9,2,0,2,1
150
+ 44,1,2,120,226,0,1,169,0,0,2,0,2,1
151
+ 42,1,2,130,180,0,1,150,0,0,2,0,2,1
152
+ 66,1,0,160,228,0,0,138,0,2.3,2,0,1,1
153
+ 71,0,0,112,149,0,1,125,0,1.6,1,0,2,1
154
+ 64,1,3,170,227,0,0,155,0,0.6,1,0,3,1
155
+ 66,0,2,146,278,0,0,152,0,0,1,1,2,1
156
+ 39,0,2,138,220,0,1,152,0,0,1,0,2,1
157
+ 58,0,0,130,197,0,1,131,0,0.6,1,0,2,1
158
+ 47,1,2,130,253,0,1,179,0,0,2,0,2,1
159
+ 35,1,1,122,192,0,1,174,0,0,2,0,2,1
160
+ 58,1,1,125,220,0,1,144,0,0.4,1,4,3,1
161
+ 56,1,1,130,221,0,0,163,0,0,2,0,3,1
162
+ 56,1,1,120,240,0,1,169,0,0,0,0,2,1
163
+ 55,0,1,132,342,0,1,166,0,1.2,2,0,2,1
164
+ 41,1,1,120,157,0,1,182,0,0,2,0,2,1
165
+ 38,1,2,138,175,0,1,173,0,0,2,4,2,1
166
+ 38,1,2,138,175,0,1,173,0,0,2,4,2,1
167
+ 67,1,0,160,286,0,0,108,1,1.5,1,3,2,0
168
+ 67,1,0,120,229,0,0,129,1,2.6,1,2,3,0
169
+ 62,0,0,140,268,0,0,160,0,3.6,0,2,2,0
170
+ 63,1,0,130,254,0,0,147,0,1.4,1,1,3,0
171
+ 53,1,0,140,203,1,0,155,1,3.1,0,0,3,0
172
+ 56,1,2,130,256,1,0,142,1,0.6,1,1,1,0
173
+ 48,1,1,110,229,0,1,168,0,1,0,0,3,0
174
+ 58,1,1,120,284,0,0,160,0,1.8,1,0,2,0
175
+ 58,1,2,132,224,0,0,173,0,3.2,2,2,3,0
176
+ 60,1,0,130,206,0,0,132,1,2.4,1,2,3,0
177
+ 40,1,0,110,167,0,0,114,1,2,1,0,3,0
178
+ 60,1,0,117,230,1,1,160,1,1.4,2,2,3,0
179
+ 64,1,2,140,335,0,1,158,0,0,2,0,2,0
180
+ 43,1,0,120,177,0,0,120,1,2.5,1,0,3,0
181
+ 57,1,0,150,276,0,0,112,1,0.6,1,1,1,0
182
+ 55,1,0,132,353,0,1,132,1,1.2,1,1,3,0
183
+ 65,0,0,150,225,0,0,114,0,1,1,3,3,0
184
+ 61,0,0,130,330,0,0,169,0,0,2,0,2,0
185
+ 58,1,2,112,230,0,0,165,0,2.5,1,1,3,0
186
+ 50,1,0,150,243,0,0,128,0,2.6,1,0,3,0
187
+ 44,1,0,112,290,0,0,153,0,0,2,1,2,0
188
+ 60,1,0,130,253,0,1,144,1,1.4,2,1,3,0
189
+ 54,1,0,124,266,0,0,109,1,2.2,1,1,3,0
190
+ 50,1,2,140,233,0,1,163,0,0.6,1,1,3,0
191
+ 41,1,0,110,172,0,0,158,0,0,2,0,3,0
192
+ 51,0,0,130,305,0,1,142,1,1.2,1,0,3,0
193
+ 58,1,0,128,216,0,0,131,1,2.2,1,3,3,0
194
+ 54,1,0,120,188,0,1,113,0,1.4,1,1,3,0
195
+ 60,1,0,145,282,0,0,142,1,2.8,1,2,3,0
196
+ 60,1,2,140,185,0,0,155,0,3,1,0,2,0
197
+ 59,1,0,170,326,0,0,140,1,3.4,0,0,3,0
198
+ 46,1,2,150,231,0,1,147,0,3.6,1,0,2,0
199
+ 67,1,0,125,254,1,1,163,0,0.2,1,2,3,0
200
+ 62,1,0,120,267,0,1,99,1,1.8,1,2,3,0
201
+ 65,1,0,110,248,0,0,158,0,0.6,2,2,1,0
202
+ 44,1,0,110,197,0,0,177,0,0,2,1,2,0
203
+ 60,1,0,125,258,0,0,141,1,2.8,1,1,3,0
204
+ 58,1,0,150,270,0,0,111,1,0.8,2,0,3,0
205
+ 68,1,2,180,274,1,0,150,1,1.6,1,0,3,0
206
+ 62,0,0,160,164,0,0,145,0,6.2,0,3,3,0
207
+ 52,1,0,128,255,0,1,161,1,0,2,1,3,0
208
+ 59,1,0,110,239,0,0,142,1,1.2,1,1,3,0
209
+ 60,0,0,150,258,0,0,157,0,2.6,1,2,3,0
210
+ 49,1,2,120,188,0,1,139,0,2,1,3,3,0
211
+ 59,1,0,140,177,0,1,162,1,0,2,1,3,0
212
+ 57,1,2,128,229,0,0,150,0,0.4,1,1,3,0
213
+ 61,1,0,120,260,0,1,140,1,3.6,1,1,3,0
214
+ 39,1,0,118,219,0,1,140,0,1.2,1,0,3,0
215
+ 61,0,0,145,307,0,0,146,1,1,1,0,3,0
216
+ 56,1,0,125,249,1,0,144,1,1.2,1,1,2,0
217
+ 43,0,0,132,341,1,0,136,1,3,1,0,3,0
218
+ 62,0,2,130,263,0,1,97,0,1.2,1,1,3,0
219
+ 63,1,0,130,330,1,0,132,1,1.8,2,3,3,0
220
+ 65,1,0,135,254,0,0,127,0,2.8,1,1,3,0
221
+ 48,1,0,130,256,1,0,150,1,0,2,2,3,0
222
+ 63,0,0,150,407,0,0,154,0,4,1,3,3,0
223
+ 55,1,0,140,217,0,1,111,1,5.6,0,0,3,0
224
+ 65,1,3,138,282,1,0,174,0,1.4,1,1,2,0
225
+ 56,0,0,200,288,1,0,133,1,4,0,2,3,0
226
+ 54,1,0,110,239,0,1,126,1,2.8,1,1,3,0
227
+ 70,1,0,145,174,0,1,125,1,2.6,0,0,3,0
228
+ 62,1,1,120,281,0,0,103,0,1.4,1,1,3,0
229
+ 35,1,0,120,198,0,1,130,1,1.6,1,0,3,0
230
+ 59,1,3,170,288,0,0,159,0,0.2,1,0,3,0
231
+ 64,1,2,125,309,0,1,131,1,1.8,1,0,3,0
232
+ 47,1,2,108,243,0,1,152,0,0,2,0,2,0
233
+ 57,1,0,165,289,1,0,124,0,1,1,3,3,0
234
+ 55,1,0,160,289,0,0,145,1,0.8,1,1,3,0
235
+ 64,1,0,120,246,0,0,96,1,2.2,0,1,2,0
236
+ 70,1,0,130,322,0,0,109,0,2.4,1,3,2,0
237
+ 51,1,0,140,299,0,1,173,1,1.6,2,0,3,0
238
+ 58,1,0,125,300,0,0,171,0,0,2,2,3,0
239
+ 60,1,0,140,293,0,0,170,0,1.2,1,2,3,0
240
+ 77,1,0,125,304,0,0,162,1,0,2,3,2,0
241
+ 35,1,0,126,282,0,0,156,1,0,2,0,3,0
242
+ 70,1,2,160,269,0,1,112,1,2.9,1,1,3,0
243
+ 59,0,0,174,249,0,1,143,1,0,1,0,2,0
244
+ 64,1,0,145,212,0,0,132,0,2,1,2,1,0
245
+ 57,1,0,152,274,0,1,88,1,1.2,1,1,3,0
246
+ 56,1,0,132,184,0,0,105,1,2.1,1,1,1,0
247
+ 48,1,0,124,274,0,0,166,0,0.5,1,0,3,0
248
+ 56,0,0,134,409,0,0,150,1,1.9,1,2,3,0
249
+ 66,1,1,160,246,0,1,120,1,0,1,3,1,0
250
+ 54,1,1,192,283,0,0,195,0,0,2,1,3,0
251
+ 69,1,2,140,254,0,0,146,0,2,1,3,3,0
252
+ 51,1,0,140,298,0,1,122,1,4.2,1,3,3,0
253
+ 43,1,0,132,247,1,0,143,1,0.1,1,4,3,0
254
+ 62,0,0,138,294,1,1,106,0,1.9,1,3,2,0
255
+ 67,1,0,100,299,0,0,125,1,0.9,1,2,2,0
256
+ 59,1,3,160,273,0,0,125,0,0,2,0,2,0
257
+ 45,1,0,142,309,0,0,147,1,0,1,3,3,0
258
+ 58,1,0,128,259,0,0,130,1,3,1,2,3,0
259
+ 50,1,0,144,200,0,0,126,1,0.9,1,0,3,0
260
+ 62,0,0,150,244,0,1,154,1,1.4,1,0,2,0
261
+ 38,1,3,120,231,0,1,182,1,3.8,1,0,3,0
262
+ 66,0,0,178,228,1,1,165,1,1,1,2,3,0
263
+ 52,1,0,112,230,0,1,160,0,0,2,1,2,0
264
+ 53,1,0,123,282,0,1,95,1,2,1,2,3,0
265
+ 63,0,0,108,269,0,1,169,1,1.8,1,2,2,0
266
+ 54,1,0,110,206,0,0,108,1,0,1,1,2,0
267
+ 66,1,0,112,212,0,0,132,1,0.1,2,1,2,0
268
+ 55,0,0,180,327,0,2,117,1,3.4,1,0,2,0
269
+ 49,1,2,118,149,0,0,126,0,0.8,2,3,2,0
270
+ 54,1,0,122,286,0,0,116,1,3.2,1,2,2,0
271
+ 56,1,0,130,283,1,0,103,1,1.6,0,0,3,0
272
+ 46,1,0,120,249,0,0,144,0,0.8,2,0,3,0
273
+ 61,1,3,134,234,0,1,145,0,2.6,1,2,2,0
274
+ 67,1,0,120,237,0,1,71,0,1,1,0,2,0
275
+ 58,1,0,100,234,0,1,156,0,0.1,2,1,3,0
276
+ 47,1,0,110,275,0,0,118,1,1,1,1,2,0
277
+ 52,1,0,125,212,0,1,168,0,1,2,2,3,0
278
+ 58,1,0,146,218,0,1,105,0,2,1,1,3,0
279
+ 57,1,1,124,261,0,1,141,0,0.3,2,0,3,0
280
+ 58,0,1,136,319,1,0,152,0,0,2,2,2,0
281
+ 61,1,0,138,166,0,0,125,1,3.6,1,1,2,0
282
+ 42,1,0,136,315,0,1,125,1,1.8,1,0,1,0
283
+ 52,1,0,128,204,1,1,156,1,1,1,0,0,0
284
+ 59,1,2,126,218,1,1,134,0,2.2,1,1,1,0
285
+ 40,1,0,152,223,0,1,181,0,0,2,0,3,0
286
+ 61,1,0,140,207,0,0,138,1,1.9,2,1,3,0
287
+ 46,1,0,140,311,0,1,120,1,1.8,1,2,3,0
288
+ 59,1,3,134,204,0,1,162,0,0.8,2,2,2,0
289
+ 57,1,1,154,232,0,0,164,0,0,2,1,2,0
290
+ 57,1,0,110,335,0,1,143,1,3,1,1,3,0
291
+ 55,0,0,128,205,0,2,130,1,2,1,1,3,0
292
+ 61,1,0,148,203,0,1,161,0,0,2,1,3,0
293
+ 58,1,0,114,318,0,2,140,0,4.4,0,3,1,0
294
+ 58,0,0,170,225,1,0,146,1,2.8,1,2,1,0
295
+ 67,1,2,152,212,0,0,150,0,0.8,1,0,3,0
296
+ 44,1,0,120,169,0,1,144,1,2.8,0,0,1,0
297
+ 63,1,0,140,187,0,0,144,1,4,2,2,3,0
298
+ 63,0,0,124,197,0,1,136,1,0,1,0,2,0
299
+ 59,1,0,164,176,1,0,90,0,1,1,2,1,0
300
+ 57,0,0,140,241,0,1,123,1,0.2,1,0,3,0
301
+ 45,1,3,110,264,0,1,132,0,1.2,1,0,3,0
302
+ 68,1,0,144,193,1,1,141,0,3.4,1,2,3,0
303
+ 57,1,0,130,131,0,1,115,1,1.2,1,1,3,0
304
+ 57,0,1,130,236,0,0,174,0,0,1,1,2,0