| import streamlit as st |
| import pandas as pd |
| |
| |
| import pickle |
| import numpy as np |
| from PIL import Image |
|
|
| |
| reduce_header_height_style = """ |
| <style> .stDeployButton {visibility: hidden;} </style> |
| <style> div[class^='block-container'] { padding-top: 1rem; } </style> |
| """ |
| st.markdown(reduce_header_height_style, unsafe_allow_html=True) |
|
|
| |
|
|
| |
| |
|
|
| def previsao_diabetes(modelo, Pressao_Alta, Colesterol_Alto, Checagem_Colesterol_em_5_anos, IMC, Fumante, AVC, |
| Doenca_coronaria_cardiaca, Atividade_Fisica_nos_ultimos_30_dias, |
| Consumo_Frutas, Consumo_Vegetais, Alto_Consumo_Alcool, |
| Plano_de_Saude, Nao_pode_ir_ao_medico_devido_custo, Estado_Geral_Saude, |
| Saude_mental, Saude_fisica, Dificuldade_andar_ou_subir_escadas, Sexo, |
| Idade, Nivel_Educacional, Renda): |
| |
|
|
| new_X = np.array([Pressao_Alta, Colesterol_Alto, Checagem_Colesterol_em_5_anos, IMC, Fumante, AVC, |
| Doenca_coronaria_cardiaca, Atividade_Fisica_nos_ultimos_30_dias, |
| Consumo_Frutas, Consumo_Vegetais, Alto_Consumo_Alcool, |
| Plano_de_Saude, Nao_pode_ir_ao_medico_devido_custo, Estado_Geral_Saude, |
| Saude_mental, Saude_fisica, Dificuldade_andar_ou_subir_escadas, Sexo, |
| Idade, Nivel_Educacional, Renda]) |
|
|
| xgb = modelo |
|
|
| |
| import joblib as jb |
| sc = jb.load('std_scaler.bin') |
| scaler_X = sc.transform(new_X.reshape(1, -1)) |
|
|
| preds = xgb.predict(scaler_X.reshape(1,-1))[0] |
| print(scaler_X) |
| probabilidades = xgb.predict_proba(scaler_X.reshape(1,-1))[0] |
| probabilidade = np.max(np.array(probabilidades)) |
| probabilidade = int(round(probabilidade * 100, 0)) |
|
|
| diagnostico_previsto = preds |
|
|
|
|
| if diagnostico_previsto == 0: |
| Diagnostico_Diabetes = ":blue[Sem Diabetes]" |
| image = 'saudavel.jpg' |
| elif diagnostico_previsto == 1: |
| Diagnostico_Diabetes = ":red[Diabetes tipo 2]" |
| image = 'diabetes02.jpg' |
| else: |
| Diagnostico_Diabetes = "Sem Diagnóstico" |
|
|
| return Diagnostico_Diabetes, image, probabilidade |
|
|
|
|
| if __name__=="__main__": |
|
|
| st.title('Sistema para Previsão de Diabetes Tipo 2') |
|
|
| |
| if 'xgb' not in st.session_state: |
| with st.spinner('carregando o modelo...'): |
| file = 'modeloXGBoost_Diabetes.pkl' |
| with open(file, 'rb') as f: |
| xgb = pickle.load(f) |
|
|
| with st.container(): |
| col1 = st.container() |
|
|
| def format_func(option): |
| return CHOICES[option] |
|
|
| st.sidebar.title("Atributos") |
|
|
| |
| atributos = ['Diagnostico_Diabetes', 'Pressao_Alta', 'Colesterol_Alto', 'Checagem_Colesterol_em_5_anos', 'IMC', 'Fumante', 'AVC', 'Doenca_coronaria_cardiaca', 'Atividade_Fisica_nos_ultimos_30_dias', 'Consumo_Frutas', 'Consumo_Vegetais', 'Alto_Consumo_Alcool', 'Plano_de_Saude', 'Nao_pode_ir_ao_medico_devido_custo', 'Estado_Geral_Saude', 'Saude_mental', 'Saude_fisica', 'Dificuldade_andar_ou_subir_escadas', 'Sexo', 'Idade', 'Nivel_Educacional', 'Renda'] |
|
|
| |
| Diagnostico_Diabetes= Pressao_Alta= Colesterol_Alto= Checagem_Colesterol_em_5_anos= IMC= Fumante= AVC= Doenca_coronaria_cardiaca= Atividade_Fisica_nos_ultimos_30_dias= Consumo_Frutas= Consumo_Vegetais= Alto_Consumo_Alcool= Plano_de_Saude= Nao_pode_ir_ao_medico_devido_custo= Estado_Geral_Saude= Saude_mental= Saude_fisica= Dificuldade_andar_ou_subir_escadas= Sexo= Idade= Nivel_Educacional= Renda = 0 |
|
|
| with st.sidebar: |
| with st.form(key='my_form'): |
|
|
| CHOICES = {0: "Não", 1: "Sim"} |
| Pressao_Alta = st.selectbox('Pressão Alta', options=list(CHOICES.keys()), format_func=format_func) |
| Colesterol_Alto = st.selectbox('Colesterol Alto',options=list(CHOICES.keys()), format_func=format_func) |
| Checagem_Colesterol_em_5_anos = st.selectbox( |
| 'Checagem colesterol em 5 anos',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| imc = IMC = st.number_input('IMC', min_value=25.0, max_value=500.0, step=1.0) |
| if (imc >= 0 and imc < 18): |
| imc_int = 17 |
| elif (imc >= 18 and imc <= 24): |
| imc_int = 24 |
| elif (imc > 24 and imc <= 30): |
| imc_int = 30 |
| elif (imc > 30 and imc <= 35): |
| imc_int = 35 |
| elif (imc > 35 and imc <= 40): |
| imc_int = 40 |
| else: |
| imc_int = 41 |
| IMC = imc_int |
|
|
| CHOICES = {0: "Não", 1: "Sim"} |
| Fumante = st.selectbox('Fumante',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| CHOICES = {0: "Não", 1: "Sim"} |
| AVC = st.selectbox('AVC',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| CHOICES = {0: "Não", 1: "Sim"} |
| Doenca_coronaria_cardiaca = st.selectbox('Doenca coronária cardíaca', |
| options=list(CHOICES.keys()), format_func=format_func) |
|
|
| CHOICES = {0: "Não", 1: "Sim"} |
| |
| Atividade_Fisica_nos_ultimos_30_dias = st.selectbox( |
| 'Atividade Física nos últimos 30 dias', |
| options=list(CHOICES.keys()), format_func=format_func) |
|
|
|
|
| CHOICES = {0: "Não", 1: "Sim"} |
| Consumo_Frutas = st.selectbox('Consumo de Frutas',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| Consumo_Vegetais = st.selectbox('Consumo de Vegetais',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| Alto_Consumo_Alcool = st.selectbox('Alto Consumo de Alcool',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| Plano_de_Saude = st.selectbox('Plano de Saúde',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| Nao_pode_ir_ao_medico_devido_custo = st.selectbox( |
| 'Não pode ir ao medico devido ao custo',options=list(CHOICES.keys()), format_func=format_func) |
| |
| |
| CHOICES = {1: "Excelente" , 2: "Muito Bom", 3: "Bom", 4: "Razoável", 5: "Ruim"} |
| Estado_Geral_Saude = st.selectbox('Estado Geral de Saúde', |
| options=list(CHOICES.keys()), format_func=format_func) |
|
|
| valor = Saude_mental = st.number_input('Problemas com Saude Mental (em dias)', |
| min_value=0, max_value=30) |
| if (valor == 0): |
| valor_categoria = 0 |
| elif (valor == 1): |
| valor_categoria = 1 |
| elif (valor == 2): |
| valor_categoria = 2 |
| elif (valor > 2 and valor <= 29): |
| valor_categoria = 29 |
| elif (valor == 30): |
| valor_categoria = 30 |
| Saude_mental = valor_categoria |
| |
| valor = Saude_fisica = st.number_input('Problemas com Saude Física (em dias)', |
| min_value=0, max_value=30) |
| if (valor == 0): |
| valor_categoria = 0 |
| elif (valor == 1): |
| valor_categoria = 1 |
| elif (valor == 2): |
| valor_categoria = 2 |
| elif (valor > 2 and valor <= 29): |
| valor_categoria = 29 |
| elif (valor == 30): |
| valor_categoria = 30 |
| Saude_fisica = valor_categoria |
|
|
|
|
| Dificuldade_andar_ou_subir_escadas = st.selectbox( |
| 'Dificuldade de andar ou subir escadas',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| CHOICES = {0: "Maculino", 1: "Feminino"} |
| Sexo = st.selectbox('Sexo',options=list(CHOICES.keys()), format_func=format_func) |
|
|
| CHOICES = {1: "18-24", 2: "25-29", 3: "30-34", 4: "35-39", 5: "40-44", 6: "45-49", 7: "50-54", |
| 8: "55-59", 9: "60-64", 10: "65-69", 11: "70-74", 12: "75-79", 13:"80+"} |
| valor = Idade = st.selectbox('Idade', options=list(CHOICES.keys()), format_func=format_func) |
| if (valor == 1): |
| valor_categoria = 6 |
| elif (valor == 2): |
| valor_categoria = 6 |
| elif (valor == 3): |
| valor_categoria = 6 |
| elif (valor == 4): |
| valor_categoria = 6 |
| elif (valor == 5): |
| valor_categoria = 6 |
| elif (valor == 6): |
| valor_categoria = 6 |
| elif (valor == 7): |
| valor_categoria = 8 |
| elif (valor == 8): |
| valor_categoria = 8 |
| elif (valor == 9): |
| valor_categoria = 9 |
| elif (valor == 10): |
| valor_categoria = 10 |
| elif (valor == 11): |
| valor_categoria = 13 |
| elif (valor == 12): |
| valor_categoria = 13 |
| elif (valor == 13): |
| valor_categoria = 13 |
| Idade = valor_categoria |
|
|
| |
| CHOICES = {1: 'Não frequentou a escola', 2: 'Ensino Básico', 3: 'Ensino Médio Incompleto', |
| 4: 'Ensino Médio Completo', 4: "Faculdade (1 a 3 anos) ou Técnico", |
| 5: "Superior Completo" } |
| valor = Nivel_Educacional = st.selectbox('Nivel Educacional', |
| options=list(CHOICES.keys()), format_func=format_func) |
| if (valor == 1): |
| valor_categoria = 2 |
| elif (valor == 2): |
| valor_categoria = 2 |
| elif (valor == 3): |
| valor_categoria = 3 |
| elif (valor == 4): |
| valor_categoria = 4 |
| elif (valor == 5): |
| valor_categoria = 5 |
| elif (valor == 6): |
| valor_categoria = 6 |
| Nivel_Educacional = valor_categoria |
|
|
|
|
| CHOICES = { 1:'Menos de $10,000', 2:'$10,000 até menos que $15,000', |
| 3:'$15,000 até menos que $20,000', 4:'$20,000 até menos que $25,000', |
| 5:'$25,000 até menos que $35,000', 6:'$35,000 até menos que $50,000', |
| 7:'$50,000 até menos que $75,000', 8:'Mais de $75,000' } |
|
|
| valor = Renda = st.selectbox('Renda Anual (em Dólar)', |
| options=list(CHOICES.keys()), format_func=format_func) |
| if (valor == 1): |
| valor_categoria = 1 |
| elif (valor == 2): |
| valor_categoria = 1 |
| elif (valor == 3): |
| valor_categoria = 1 |
| elif (valor == 4): |
| valor_categoria = 1 |
| elif (valor == 5): |
| valor_categoria = 5 |
| elif (valor == 6): |
| valor_categoria = 6 |
| elif (valor == 7): |
| valor_categoria = 7 |
| elif (valor == 8): |
| valor_categoria = 8 |
| Renda = valor_categoria |
|
|
| predict_button = st.form_submit_button(label='Prever') |
|
|
|
|
| if predict_button: |
|
|
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
|
|
| Diagnostico_Diabetes, imagem, probabilidade = previsao_diabetes(xgb, |
| Pressao_Alta, Colesterol_Alto, Checagem_Colesterol_em_5_anos, Fumante, AVC, |
| Doenca_coronaria_cardiaca, Atividade_Fisica_nos_ultimos_30_dias, Consumo_Frutas, Consumo_Vegetais, |
| Alto_Consumo_Alcool, Plano_de_Saude, Nao_pode_ir_ao_medico_devido_custo, Estado_Geral_Saude, |
| Dificuldade_andar_ou_subir_escadas, Sexo, Saude_mental, Saude_fisica, Renda, |
| Nivel_Educacional, IMC, Idade) |
|
|
| image = Image.open(imagem) |
| |
| |
| |
| string_saida = 'Diagnóstico: ' + Diagnostico_Diabetes + " - " + str(probabilidade) + "%" |
| col1.header(string_saida) |
| col1.image(image, width=700) |
| else: |
| imagem = 'diabetes_desktop.jpg' |
| image = Image.open(imagem) |
| |
| col1.image(image, width=700) |
|
|
| |
| st.write("") |
| st.write("") |
| st.write("") |
| st.write("") |
| st.write("") |
|
|
| aviso = "ESTE RESULTADO NÃO SUBSTITUI A AVALIAÇÃO DO MÉDICO. Este é um sistema para auxílio diagnóstico de doenças usando modelos ensemble. Todo o processamento é feito no seu dispositivo e as imagens não são enviadas para o seu servidor. Ao continuar, você assume toda a responsabilidade com o uso." |
| st.markdown(f'<div style="color: #856404; background-color: #fff3cd; border-color: #ffeeba; padding-top:10px; padding-top:10px; padding-bottom:10px; padding-left:10px; padding-right:10px;">{aviso}</div>', |
| unsafe_allow_html=True) |
| |
|
|
| st.write("") |
| st.write("") |
|
|
| st.write("") |
| st.write("") |
| st.write("") |
| st.write("") |
| st.write("") |
|
|
|
|
| footer="\ |
| <div > \ |
| <p>Sistema de Apoio ao Diagnóstico de Diabetes tipo 2 versão 1.0.1.<br> \ |
| Desenvolvido por Prof. Dr. Vladimir Costa de Alencar e Equipe de Pesquisadores do LANA/UEPB. <br> \ |
| Campina Grande, Paraíba, Brasil, 2024.<br> \ |
| <a href='https://www.valencar.com' target='_blank'>www.valencar.com</a></p>" |
| st.markdown(footer, unsafe_allow_html=True) |
|
|
| name_image = "LANA_Card.png" |
| imagem = Image.open(name_image) |
| st.image(imagem, width=300) |
|
|
|
|
|
|
|
|