File size: 5,314 Bytes
61f924c 1aad69f 61f924c 2a46d77 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
from scripts.model_training import model_training
import pandas as pd
import streamlit as st
st.set_page_config(
page_title="Cardiovascular-Disease App",
page_icon="🧊",
layout="wide",
initial_sidebar_state="expanded"
)
def user_input_features():
age = st.sidebar.slider('Возраст',
min_value=10,
max_value=100,
step=1,
)
gender= st.sidebar.selectbox('Пол',
options=('Мужской', 'Женский'),
)
height = st.sidebar.slider('Рост (см)',
min_value=100,
max_value=200,
value=150,
step=1,
)
weight = st.sidebar.slider('Вес (кг)',
min_value=30,
max_value=200,
value=70,
step=1,
)
ap_hi = st.sidebar.slider('Систолическое артериальное давление',
min_value=50,
max_value=200,
value=120,
step=1,
)
ap_lo = st.sidebar.slider('Диастолическое артериальное давление',
min_value=50,
max_value=200,
value=80,
step=1,
)
cholesterol = st.sidebar.selectbox('Общий холестерин (ммоль/л.)',
options=('<5','5-63', '>6.3'),
)
gluc = st.sidebar.selectbox('Глюкоза (ммоль/л.)',
options=('3.5—5.5','5.6-9', '>9'),
)
smoke = st.sidebar.selectbox('Курение',
options=('Да','Нет'),
)
alco = st.sidebar.selectbox('Употребление алкоголя',
options=('Да','Нет'),
)
active = st.sidebar.selectbox('Физическая активность',
options=('Да','Нет'),
)
def map_gluc(gluc):
if gluc == '3.5—5.5':
return '1'
elif gluc == '5.6-9':
return '2'
else:
return '3'
def map_cholesterol(cholesterol):
if cholesterol == '<5':
return '1'
elif cholesterol == '5-63':
return '2'
else:
return '3'
age = age * 365
data = {'age': age,
'gender': '1' if gender == 'Женский' else '0',
'height': height,
'weight': weight,
'ap_hi': ap_hi,
'ap_lo': ap_lo,
'cholesterol': map_cholesterol(cholesterol),
'gluc': map_gluc(gluc),
'smoke': '1' if smoke == 'Да' else '0',
'alco': '1' if alco == 'Да' else '0',
'active': '1' if active == 'Да' else '0',
}
features = pd.DataFrame(data, index=[0])
return features
@st.cache_data()
def get_model():
model, metric = model_training()
model_json = {'model': model,
'metric': metric}
return model_json
def main():
st.write(""" # Приложение для определения наличия сердечно-сосудистого заболевания (ССЗ) :heartpulse: """)
st.sidebar.header("Параметры ввода")
st.divider()
user_data = user_input_features()
st.write(" # Ваши данные")
new_column_names = {'age': 'Возраст (дней)',
'gender': 'Пол',
'height': 'Рост (см)' ,
'weight': 'Вес (кг)',
'ap_hi': 'Систолическое давление',
'ap_lo': 'Диастолическое давление',
'cholesterol': 'Общий холестерин',
'gluc': 'Глюкоза',
'smoke': 'Курение',
'alco': 'Алкоголь',
'active': 'Физическая активность',
'cardio': 'x',
}
user_data_rus = user_data.rename(columns=new_column_names)
st.dataframe(user_data_rus)
with st.spinner('Загрузка модели ...'):
model = get_model()
st.success('Модель загружена!')
st.divider()
diag_btn = st.button("Диагностика", type="primary")
if diag_btn == True:
result = ' '.join(map(str, model['model'].predict(user_data)))
result = "Положительный" if result == "positive" else "Отрицательный"
metric = model['metric']
col1, col2 = st.columns(2)
col1.metric(label=" # :heartpulse: Результат",
value=result,
)
col2.metric(label=" # Метрика",
value=str(metric),
)
#if __name__ == "__main__":
main()
|