valencar commited on
Commit
edc3e39
1 Parent(s): 1ffb6b9

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +393 -0
app.py ADDED
@@ -0,0 +1,393 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pickle
2
+ import streamlit as st
3
+ import pandas as pd
4
+ import numpy as np
5
+ from PIL import Image
6
+ import sklearn
7
+ import pickle
8
+
9
+ import joblib as jb
10
+
11
+ import xgboost as xgb
12
+
13
+ # Esconder os menu padrao
14
+ hide_streamlit_style = """
15
+ <style>
16
+ #MainMenu {visibility: hidden;}
17
+ footer {visibility: hidden;}
18
+ </style>
19
+ """
20
+ st.markdown(hide_streamlit_style, unsafe_allow_html=True)
21
+
22
+
23
+ # pipreqs . --force
24
+ # cat requirements.txt
25
+ # pip install -r requirements.txt
26
+
27
+ # DICIONARIO DE DADOS - ATRIBUTOS
28
+ # HeartDisease: Entrevistados que já relataram ter doença cardíaca coronária ou infarto do miocárdio.
29
+ #
30
+ # BMI: IMC.
31
+ # Smoking : Você fumou pelo menos 100 cigarros em toda a sua vida?
32
+ # AlcoholDrinking: Bebedores pesados.
33
+ # Stroke: Você teve um derrame?
34
+ # PhysicalHealth: Sua saúde física, que inclui doenças físicas e lesões, por quantos dias, nos últimos 30 dias.
35
+ # MentalHealth: Saúde mental, por quantos dias nos últimos 30 dias sua saúde mental não foi boa? (0-30 dias).
36
+ # DiffWalking: Você tem muita dificuldade para andar ou subir escadas?
37
+ # Sex: Sexo.
38
+ # AgeCategory: Categoria de idade de quatorze níveis.
39
+ # Race: Etinía.
40
+ # Diabetic: Se têm diabetes.
41
+ # PhysicalActivity: Adultos que relataram fazer atividade física ou exercício durante os últimos 30 dias fora do trabalho regular.
42
+ # GenHealth: Você diria que, em geral, sua saúde é.
43
+ # SleepTime: Em média, quantas horas você dorme em um período de 24 horas?
44
+ # Asthma: Você tem asma?
45
+ # KidneyDisease: Cálculos renais, infecção da bexiga ou incontinência, alguma vez lhe disseram que tinha doença renal?
46
+ # SkinCancer: Você teve câncer de pele?
47
+
48
+ dict_cat_ingles = {
49
+ 'HeartDisease': {'No': 0, 'Yes': 1},
50
+ 'Smoking': {'No': 0, 'Yes': 1},
51
+ 'AlcoholDrinking': {'No': 0, 'Yes': 1},
52
+ 'Stroke': {'No': 0, 'Yes': 1},
53
+ 'DiffWalking': {'No': 0, 'Yes': 1},
54
+ 'Sex': {'Female': 0, 'Male': 1},
55
+ 'PhysicalActivity': {'No': 0, 'Yes': 1},
56
+ 'Asthma': {'No': 0, 'Yes': 1},
57
+ 'KidneyDisease': {'No': 0, 'Yes': 1},
58
+ 'SkinCancer': {'No': 0, 'Yes': 1},
59
+ 'Race': {'American Indian/Alaskan Native': 0,
60
+ 'Asian': 1,
61
+ 'Black': 2,
62
+ 'Hispanic': 3,
63
+ 'Other': 4,
64
+ 'White': 5},
65
+ 'Diabetic': {'No': 0,
66
+ 'No, borderline diabetes': 1,
67
+ 'Yes': 2,
68
+ 'Yes (during pregnancy)': 3},
69
+ 'GenHealth': {'Poor': 0,
70
+ 'Fair': 1,
71
+ 'Good': 2,
72
+ 'Very good': 3,
73
+ 'Excellent': 4}
74
+ }
75
+
76
+ dict_cat_portugues = {
77
+ 'HeartDisease': {'Não': 0, 'Sim': 1},
78
+ 'Smoking': {'Não': 0, 'Sim': 1},
79
+ 'AlcoholDrinking': {'Não': 0, 'Sim': 1},
80
+ 'Stroke': {'Não': 0, 'Sim': 1},
81
+ 'DiffWalking': {'Não': 0, 'Sim': 1},
82
+ 'Sex': {'Feminino': 0, 'Masculino': 1},
83
+ 'PhysicalActivity': {'Não': 0, 'Sim': 1},
84
+ 'Asthma': {'Não': 0, 'Sim': 1},
85
+ 'KidneyDisease': {'Não': 0, 'Sim': 1},
86
+ 'SkinCancer': {'Não': 0, 'Sim': 1},
87
+ 'Race': {'Índio americano/nativo do Alasca': 0,
88
+ 'Asiático': 1,
89
+ 'Negro': 2,
90
+ 'Hispânico': 3,
91
+ 'Outros': 4,
92
+ 'Branco': 5},
93
+ 'Diabetic': {'Não': 0,
94
+ 'Não, diabetes limítrofe': 1,
95
+ 'Sim': 2,
96
+ 'Sim (durante a gravidez)': 3},
97
+ 'GenHealth': {'Ruim': 0,
98
+ 'Razoável': 1,
99
+ 'Boa': 2,
100
+ 'Muito Boa': 3,
101
+ 'Excelente': 4}
102
+ }
103
+
104
+
105
+ with open('DICT_CATEGORIAS_VALORES.pkl', 'rb') as f:
106
+ DICT_CATEGORIAS_VALORES = pickle.load(f)
107
+
108
+ with open('DICT_INVERSO_VALORES_CATEGORIAS_PORTUGUES.pkl', 'rb') as f:
109
+ DICT_INVERSO_VALORES_CATEGORIAS_PORTUGUES = pickle.load(f)
110
+
111
+
112
+ CHOICES = { **DICT_CATEGORIAS_VALORES, **dict_cat_portugues }
113
+
114
+ # Configuração da página
115
+ #st.set_page_config(page_title = "Precisão de Doenças Cardíacas", layout = "centered")
116
+ st.title('Sistema de Auxílio à Previsão de Problemas Cardíacos')
117
+ st.sidebar.title("Anamnese - Sintomas")
118
+
119
+ imagem = 'coracao01.jpeg'
120
+ image = Image.open(imagem)
121
+ st.image(image, width=500)
122
+
123
+ CHOICES = DICT_INVERSO_VALORES_CATEGORIAS_PORTUGUES.copy()
124
+
125
+ # inicializacao das variaveis
126
+ SleepTime = PhysicalHealth = MentalHealth = BMI = HeartDisease = Smoking = AlcoholDrinking = Stroke = 0
127
+ AgeCategory = DiffWalking= Sex= PhysicalActivity= Asthma= KidneyDisease= SkinCancer= 0
128
+ Race = Diabetic = GenHealth = 0
129
+
130
+ with st.sidebar:
131
+
132
+ with st.form(key='my_form'):
133
+
134
+ # retorna o mapeamento para Categoria Numérica da opção
135
+ # def format_func(option):
136
+ # return CHOICES[option]
137
+
138
+ def format_IMC(imc):
139
+ if (imc >= 0 and imc < 18):
140
+ imc_int = 17
141
+ elif (imc >= 18 and imc <= 24):
142
+ imc_int = 24
143
+ elif (imc > 24 and imc <= 30):
144
+ imc_int = 30
145
+ elif (imc > 30 and imc <= 35):
146
+ imc_int = 35
147
+ elif (imc > 35 and imc <= 40):
148
+ imc_int = 40
149
+ else:
150
+ imc_int = 41
151
+
152
+ return int(imc_int)
153
+
154
+
155
+ BMI = st.number_input('IMC', min_value=15.0, max_value=300.0, step=1.0)
156
+ BMI = format_IMC(BMI)
157
+
158
+ Smoking = st.selectbox('Fumante', options = CHOICES['Smoking'],
159
+ format_func=lambda x: CHOICES['Smoking'][x] )
160
+
161
+ AlcoholDrinking = st.selectbox('Alto Consumo de Alcool', options = CHOICES['AlcoholDrinking'],
162
+ format_func=lambda x: CHOICES['AlcoholDrinking'][x] )
163
+
164
+ Stroke = st.selectbox('Você teve um AVC?', options = CHOICES['Stroke'],
165
+ format_func=lambda x: CHOICES['Stroke'][x])
166
+
167
+ PhysicalHealth = st.number_input('Saúde Física, por quantos dias neste mês',
168
+ min_value=0.0, max_value=30.0, step=1.0)
169
+
170
+ def converter_PhysicalHealth_categoria(PhysicalHealth):
171
+ if PhysicalHealth <= 4.0:
172
+ PhysicalHealth_cat = 4
173
+ elif (PhysicalHealth > 4.0 and PhysicalHealth <= 5.0):
174
+ PhysicalHealth_cat = 5
175
+ elif (PhysicalHealth > 5 and PhysicalHealth <= 6):
176
+ PhysicalHealth_cat = 6
177
+ elif (PhysicalHealth > 6 and PhysicalHealth <= 7):
178
+ PhysicalHealth_cat = 7
179
+ elif (PhysicalHealth > 7 and PhysicalHealth <= 8):
180
+ PhysicalHealth_cat = 8
181
+ else:
182
+ PhysicalHealth_cat = 9
183
+
184
+ return PhysicalHealth_cat
185
+
186
+ PhysicalHealth = converter_PhysicalHealth_categoria(PhysicalHealth)
187
+
188
+ MentalHealth = st.number_input('Saúde mental, por quantos dias não foi boa no mês',
189
+ min_value=0.0, max_value=30.0, step=1.0)
190
+
191
+ def converter_MentalHealth_categoria(MentalHealth):
192
+ if MentalHealth <= 0:
193
+ MentalHealth_cat = 0
194
+ elif (MentalHealth >= 3.0 and MentalHealth < 10.0):
195
+ MentalHealth_cat = 3
196
+ elif (MentalHealth >= 10 and MentalHealth < 20):
197
+ MentalHealth_cat = 20
198
+ else:
199
+ MentalHealth_cat = 30
200
+
201
+ return MentalHealth_cat
202
+
203
+ MentalHealth = converter_MentalHealth_categoria(MentalHealth)
204
+
205
+ DiffWalking = st.selectbox(
206
+ 'Dificuldade de andar ou subir escadas', options = CHOICES['DiffWalking'],
207
+ format_func=lambda x: CHOICES['DiffWalking'][x])
208
+
209
+
210
+ Sex = st.selectbox('Sexo', options = CHOICES['Sex'],
211
+ format_func=lambda x: CHOICES['Sex'][x])
212
+
213
+ AgeCategory = st.selectbox('Idade (categoria)', options = CHOICES['AgeCategory'],
214
+ format_func=lambda x: CHOICES['AgeCategory'][x])
215
+
216
+ Race = st.selectbox('Etnia', options = CHOICES['Race'],
217
+ format_func=lambda x: CHOICES['Race'][x])
218
+
219
+ Diabetic = st.selectbox('Diabetes', options = CHOICES['Diabetic'],
220
+ format_func=lambda x: CHOICES['Diabetic'][x] )
221
+
222
+ PhysicalActivity = st.selectbox(
223
+ 'Atividade Física nos últimos 30 dias', options = CHOICES['PhysicalActivity'],
224
+ format_func=lambda x: CHOICES['PhysicalActivity'][x] )
225
+
226
+ GenHealth = st.selectbox('Estado Geral de Saúde', options = CHOICES['GenHealth'],
227
+ format_func=lambda x: CHOICES['GenHealth'][x])
228
+
229
+ SleepTime = st.number_input('Quantas horas você dorme por dia',
230
+ min_value=1.0, max_value=24.0, step=1.0)
231
+
232
+ def converter_sleepTime_categoria(SleepTime):
233
+ if SleepTime <= 4:
234
+ sleep_cat = 4
235
+ elif (SleepTime > 4 and SleepTime <= 5):
236
+ sleep_cat = 5
237
+ elif (SleepTime > 5 and SleepTime <= 6):
238
+ sleep_cat = 6
239
+ elif (SleepTime > 6 and SleepTime < 8):
240
+ sleep_cat = 7
241
+ elif (SleepTime >= 8 and SleepTime < 9):
242
+ sleep_cat = 8
243
+ elif (SleepTime >= 9 ):
244
+ sleep_cat = 9
245
+
246
+ return sleep_cat
247
+
248
+ SleepTime = converter_sleepTime_categoria(SleepTime)
249
+
250
+
251
+ Asthma = st.selectbox('Você tem asma?', CHOICES['Asthma'],
252
+ format_func=lambda x: CHOICES['Asthma'][x])
253
+
254
+ KidneyDisease = st.selectbox('Doença renal (cálculo, incontinência, etc.',
255
+ options = CHOICES['KidneyDisease'],
256
+ format_func=lambda x: CHOICES['KidneyDisease'][x])
257
+
258
+ SkinCancer = st.selectbox('Câncer de pele', options = CHOICES['SkinCancer'],
259
+ format_func=lambda x: CHOICES['SkinCancer'][x])
260
+
261
+
262
+ predict_button = st.form_submit_button(label='Prever')
263
+
264
+
265
+ # Pagina pricipal
266
+
267
+ import xgboost
268
+ from xgboost import Booster
269
+
270
+ def previsao_doenca_cardiaca(Smoking, AlcoholDrinking, Stroke, DiffWalking, Sex, Race,
271
+ Diabetic, PhysicalActivity, GenHealth, Asthma, KidneyDisease,
272
+ SkinCancer, AgeCategory, SleepTime, PhysicalHealth,
273
+ MentalHealth, BMI):
274
+
275
+ # Colocar em escala (Padronizacao)
276
+ sc = jb.load('std_scaler.bin')
277
+
278
+ X = np.array([Smoking, AlcoholDrinking, Stroke, DiffWalking, Sex, Race,
279
+ Diabetic, PhysicalActivity, GenHealth, Asthma, KidneyDisease,
280
+ SkinCancer, AgeCategory, SleepTime, PhysicalHealth,
281
+ MentalHealth, BMI]).reshape(1, -1)
282
+
283
+ scaler_X = sc.transform(X)
284
+ print(scaler_X)
285
+
286
+
287
+ #file = "modeloXGBoostv50.pkl"
288
+ #xgb = joblib.load(file)
289
+
290
+ # PREDICT
291
+ # file = 'modeloXGBoostv50.pkl'
292
+ # # # load
293
+
294
+ #file = "modeloXGBoostv50.pkl"
295
+ # clf = True
296
+ # with open(file, 'rb') as f:
297
+ # clf = pickle.load(f)
298
+
299
+ # model = clf
300
+
301
+
302
+ #file = 'modeloXGBoostv50.json'
303
+
304
+ #load saved model
305
+ #model = xgbst = jb.load(file)
306
+
307
+
308
+ # booster = Booster()
309
+ # model = booster.load_model(file)
310
+
311
+ file = 'modeloXGBoostv50.bin'
312
+ booster = xgb.Booster()
313
+ booster.load_model(file)
314
+ model = booster
315
+
316
+
317
+ #model = xgbst.Booster(file)
318
+ #model.predict(new_data)
319
+
320
+ drow = xgb.DMatrix(scaler_X, label=[0, 1]) #, feature_names=X_test.columns)
321
+ prob = model.predict(drow)
322
+ if prob > 0.5:
323
+ pred = ':red[Doença Cardíaca]'
324
+ else:
325
+ pred = ':blue[Normal]'
326
+ prob = 1 - prob
327
+ # pred = ['Normal' if model.predict(drow) > 0.5 else 'Doença Cardíaca']
328
+ # pred = pred[0]
329
+ print(pred)
330
+ print(type(pred))
331
+ print(prob)
332
+
333
+
334
+ # if pred == 0:
335
+ # diagnostico_doenca_cardiaca = "Normal"
336
+ # image = 'saudavel.jpg'
337
+ # elif pred == 1:
338
+ # diagnostico_doenca_cardiaca = "Doença Cardíaca"
339
+ # image = 'diabetes02.jpg'
340
+ # else:
341
+ # diagnostico_doenca_cardiaca = "Sem Diagnóstico"
342
+
343
+ return pred, prob[0] #, image
344
+
345
+
346
+ if predict_button:
347
+ print('ok')
348
+ print('\n')
349
+
350
+ print(Smoking, AlcoholDrinking, Stroke, DiffWalking, Sex, Race,
351
+ Diabetic, PhysicalActivity, GenHealth, Asthma, KidneyDisease,
352
+ SkinCancer, AgeCategory, SleepTime, PhysicalHealth,
353
+ MentalHealth, BMI)
354
+
355
+ atributos = [ Smoking, AlcoholDrinking, Stroke, DiffWalking, Sex, Race,
356
+ Diabetic, PhysicalActivity, GenHealth, Asthma, KidneyDisease,
357
+ SkinCancer, AgeCategory, SleepTime, PhysicalHealth,
358
+ MentalHealth, BMI ]
359
+
360
+
361
+
362
+
363
+ diagnostico_doenca_cardiaca, prob = previsao_doenca_cardiaca(Smoking, AlcoholDrinking,
364
+ Stroke, DiffWalking, Sex, Race,
365
+ Diabetic, PhysicalActivity, GenHealth, Asthma, KidneyDisease,
366
+ SkinCancer, AgeCategory, SleepTime, PhysicalHealth,
367
+ MentalHealth, BMI)
368
+
369
+
370
+ string_saida = '### Previsão: ' + diagnostico_doenca_cardiaca + \
371
+ ' - Probabilidade: ' + str(int(round(prob * 100, 0))) + "%"
372
+ st.markdown(string_saida)
373
+ # st.markdown('## Previsão: ' + diagnostico_doenca_cardiaca)
374
+ # st.markdown('## Probabilidade: ' + str(int(round(prob * 100, 0))) + "%")
375
+
376
+ # )
377
+
378
+
379
+
380
+
381
+ # BMI, Smoking, AlcoholDrinking, Stroke, PhysicalHealth, MentalHealth, DiffWalking, Sex, AgeCategory,
382
+ # Race, Diabetic, PhysicalActivity, GenHealth, SleepTime, Asthma, KidneyDisease, SkinCancer
383
+
384
+
385
+ #st.write(Diagnostico_Diabetes)
386
+ # image = Image.open('diabetes/' + imagem)
387
+ # st.markdown('## Diagnóstico: ' + '__' + Diagnostico_Diabetes + '__')
388
+ # #st.write('Diagnóstico:' + Diagnostico_Diabetes)
389
+ # st.image(image, width=250)
390
+
391
+ # else:
392
+ # Diagnostico_Diabetes = 'Sem Previsão'
393
+