FVLG / app.py
zendeer's picture
Update app.py
cb97519
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.title("Калькулятор прогнозирования значения фракции выброса левого желудочка")
st.header("Кафедра пропедевтической терапии с курсом кардиологи")
# 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)))