FVLG / app.py
zendeer's picture
Update app.py
b72d764
raw
history blame
5.97 kB
import streamlit as st
import json
import requests
import pandas as pd
import numpy as np
import pickle
from PIL import Image
image = Image.open('logo.png')
st.image(image)
# st.set_page_config(layout="wide")
st.markdown("""
<style>
.big-font {
font-size:100px !important;
}
</style>
""", unsafe_allow_html=True)
st.markdown('<p class="big-font">Hello World !!</p>', unsafe_allow_html=True)
st.title("Калькулятор прогнозирования значения фракции выброса левого желудочка")
st.title("Кафедра пропедевтической терапии с курсом кардиологи")
# col1, col2, col3, col4, col5, col6, col7, col8 = st.rows(8)
nyha = 2
vozrast = 65
ckf = 71.5
pim = 2
fp = 2
cd = 3
nt = 394.05
st2 = 30.8
#mod = st.radio("Выберите модель", options=["Линейная", "Нелинейная"])
# with col1:
f1 = st.selectbox(
'Функциональный класс по NYHA',
('1', '2', '3', '4'))
nyha_check = st.checkbox('NYHA', value=True)
# with col2:
f2 = st.text_input('Возраст лет')
vozrast_check = st.checkbox('Возраст', value=True)
# with col3:
f3 = st.text_input('Скорость клубочковой фильтрации по формуле CKD-EPI (мл/мин/1,73м2)')
ckf_check = st.checkbox('СКФ CKD-EPI', value=True)
# with col4:
f4 = st.selectbox(
'Перенесенный инфаркт миокарда',
('Да', 'Нет'))
pim_check = st.checkbox('ПИМ', value=True)
# with col5:
f5 = st.selectbox(
'Фибрилляция/Трепетание предсердий',
('Да', 'Нет'))
fp_check = st.checkbox('ФП', value=True)
# with col6:
f6 = st.selectbox(
'Сахарный диабет ',
('Да', 'НТГ', 'Нет'))
cd_check = st.checkbox('СД', value=True)
# with col7:
f7 =st.text_input('Концентрация NT-proBNP (пг/мл)')
nt_check = st.checkbox('NT_proBNP', value=True)
# with col8:
f8 = st.text_input('Концентрация ST2 (нг/мл)')
st2_check = st.checkbox('ST2', value=True)
filename_model = 'class_model_logreg.pickle'
filename_scaler = 'class_scaler.pickle'
filename_ohe = 'class_one_hot_enc.pickle'
filename_cat = 'class_model_catboost.pickle'
loaded_model = pickle.load(open(filename_model, 'rb'))
loaded_scaler = pickle.load(open(filename_scaler, 'rb'))
loaded_ohe = pickle.load(open(filename_ohe, 'rb'))
loaded_cat = pickle.load(open(filename_cat, 'rb'))
def get_interval_by_class(a):
pref = 'Прогнозируемое значение фракции выброса левого желудочка '
if a == 1:
return pref + 'больше 50%'
elif a == 2:
return pref + 'лежит в интервале от 40 до 49%'
else:
return pref + 'меньше 40%'
if st.button('OK'):
if nyha_check:
if f1 == '':
st.write('Вы не ввели NYHA, будет использовано медианное значение')
f1 = nyha
else:
f1 = 0
if vozrast_check:
if f2 == '':
st.write('Вы не ввели возраст, будет использовано медианное значение')
f2 = vozrast
else:
f2 = 0
if ckf_check:
if f3 == '':
st.write('Вы не ввели СКФ, будет использовано медианное значение')
f3 = ckf
else:
f3 = 0
if pim_check:
if f4 == '':
st.write('Вы не ввели ПИМ, будет использовано медианное значение')
f4 = pim
else:
f4 = 0
if fp_check:
if f5 == '':
st.write('Вы не ввели ФП, будет использовано медианное значение')
f5 = fp
else:
f5 = 0
if cd_check:
if f6 == '':
st.write('Вы не ввели СД, будет использовано медианное значение')
f6 = cd
else:
f6 = 0
if nt_check:
if f7 == '':
st.write('Вы не ввели NT_proBNP, будет использовано медианное значение')
f7 = nt
else:
f7 = 0
if st2_check:
if f8 == '':
st.write('Вы не ввели ST2, будет использовано медианное значение')
f8 = st2
else:
f8 = 0
# line = np.array([[float(f1), str(f2), str(f3), str(f4), str(f5), float(f6), float(f7), float(f8), float(f9), float(f10)]])
if f4 == 'Да':
f4 = '1'
else:
f4 = '2'
if f5 == 'Да':
f5 = '1'
elif f5 == 'НТГ':
f5 = '2'
else:
f5 = '3'
if f6 == 'Да':
f6 = '1'
else:
f6 = '2'
line = np.array([[str(f1), float(f2), float(f3), str(f4), str(f5), str(f6), float(f7), float(f8)]])
picked_cols = ['NYHA', 'возраст', 'СКФ CKD-EPI', 'ПИМ', 'ФП', 'СД', 'NT_proBNP', 'ST2']
categorical_cols = ['NYHA', 'ПИМ', 'ФП', 'СД']
num_cols = ['возраст', 'СКФ CKD-EPI', 'NT_proBNP', 'ST2']
X = pd.DataFrame(line, columns=picked_cols)
X_transform = pd.DataFrame(loaded_ohe.transform(X[categorical_cols]).toarray()).set_index(X.index)
X_transform.columns = loaded_ohe.get_feature_names_out()
X_encode = pd.concat([X_transform, X[num_cols]], axis=1)
line_norm = loaded_scaler.transform(X_encode)
#if mod == 'Линейная':
# res = loaded_model.predict(line_norm)[0]
# st.header(get_interval_by_class(int(res)))
#else:
res = loaded_cat.predict(line_norm)[0]
st.header(get_interval_by_class(int(res)))