Update app.py
Browse files
app.py
CHANGED
@@ -5,123 +5,125 @@ import pandas as pd
|
|
5 |
import numpy as np
|
6 |
import pickle
|
7 |
|
8 |
-
st.set_page_config(layout="wide")
|
9 |
|
10 |
-
st.title("
|
11 |
|
12 |
|
13 |
-
col1, col2, col3, col4, col5, col6, col7, col8
|
14 |
|
15 |
-
|
|
|
|
|
16 |
pim = 2
|
17 |
-
cd = 3
|
18 |
fp = 2
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
kcr = 36
|
23 |
-
lp = 38
|
24 |
-
st2 = 38
|
25 |
|
26 |
mod = st.radio(
|
27 |
"Выберите модель",
|
28 |
options=["Линейная", "Нелинейная"]
|
29 |
)
|
30 |
|
31 |
-
with col1:
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
with
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
|
|
|
|
61 |
|
62 |
|
63 |
|
64 |
-
filename_model = '
|
65 |
-
filename_scaler = '
|
66 |
-
|
67 |
-
|
|
|
68 |
|
69 |
loaded_model = pickle.load(open(filename_model, 'rb'))
|
70 |
loaded_scaler = pickle.load(open(filename_scaler, 'rb'))
|
71 |
-
loaded_cat = pickle.load(open(filename_cat, 'rb'))
|
72 |
loaded_ohe = pickle.load(open(filename_ohe, 'rb'))
|
|
|
73 |
|
74 |
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
|
|
83 |
|
84 |
if st.button('OK'):
|
85 |
|
86 |
-
if
|
87 |
if f1 == '':
|
88 |
-
st.write('Вы не ввели
|
89 |
-
f1 =
|
90 |
else:
|
91 |
f1 = 0
|
92 |
|
93 |
-
if
|
94 |
if f2 == '':
|
95 |
-
st.write('Вы не ввели
|
96 |
-
f2 =
|
97 |
else:
|
98 |
f2 = 0
|
99 |
|
100 |
-
if
|
101 |
if f3 == '':
|
102 |
-
st.write('Вы не ввели
|
103 |
-
f3 =
|
104 |
else:
|
105 |
f3 = 0
|
106 |
|
107 |
-
if
|
108 |
if f4 == '':
|
109 |
-
st.write('Вы не ввели
|
110 |
-
f4 =
|
111 |
else:
|
112 |
f4 = 0
|
113 |
|
114 |
-
if
|
115 |
if f5 == '':
|
116 |
-
st.write('Вы не ввели
|
117 |
-
f5 =
|
118 |
else:
|
119 |
f5 = 0
|
120 |
|
121 |
-
if
|
122 |
if f6 == '':
|
123 |
-
st.write('Вы не ввели
|
124 |
-
f6 =
|
125 |
else:
|
126 |
f6 = 0
|
127 |
|
@@ -132,33 +134,38 @@ if st.button('OK'):
|
|
132 |
else:
|
133 |
f7 = 0
|
134 |
|
135 |
-
if
|
136 |
if f8 == '':
|
137 |
-
st.write('Вы не ввели
|
138 |
-
f8 =
|
139 |
else:
|
140 |
f8 = 0
|
141 |
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
|
|
146 |
else:
|
147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
|
149 |
-
if
|
150 |
-
|
151 |
-
st.write('Вы не ввели ST2, будет использовано медианное значение')
|
152 |
-
f10 = st2
|
153 |
else:
|
154 |
-
|
155 |
|
156 |
-
|
157 |
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
num_cols = ['возраст', 'СКФ CKD-EPI', 'NT_proBNP', 'КСР', 'ЛП', 'ST2']
|
162 |
|
163 |
X = pd.DataFrame(line, columns=picked_cols)
|
164 |
|
@@ -171,8 +178,8 @@ if st.button('OK'):
|
|
171 |
|
172 |
if mod == 'Линейная':
|
173 |
res = loaded_model.predict(line_norm)[0]
|
174 |
-
st.header(int(res))
|
175 |
else:
|
176 |
res = loaded_cat.predict(line_norm)[0]
|
177 |
-
st.header(int(res))
|
178 |
|
|
|
5 |
import numpy as np
|
6 |
import pickle
|
7 |
|
8 |
+
# st.set_page_config(layout="wide")
|
9 |
|
10 |
+
st.title("Калькулятор оценки фракции выброса левого желудочка у пациентов с хронической сердечной недостаточностью на основании клинических и лабораторных параметров")
|
11 |
|
12 |
|
13 |
+
# col1, col2, col3, col4, col5, col6, col7, col8 = st.rows(8)
|
14 |
|
15 |
+
nyha = 2
|
16 |
+
vozrast = 65
|
17 |
+
ckf = 71.5
|
18 |
pim = 2
|
|
|
19 |
fp = 2
|
20 |
+
cd = 3
|
21 |
+
nt = 394.05
|
22 |
+
st2 = 30.8
|
|
|
|
|
|
|
23 |
|
24 |
mod = st.radio(
|
25 |
"Выберите модель",
|
26 |
options=["Линейная", "Нелинейная"]
|
27 |
)
|
28 |
|
29 |
+
# with col1:
|
30 |
+
f1 = st.selectbox(
|
31 |
+
'Функциональный класс по NYHA',
|
32 |
+
('1', '2', '3', '4'))
|
33 |
+
nyha_check = st.checkbox('NYHA', value=True)
|
34 |
+
# with col2:
|
35 |
+
f2 = st.text_input('Возраст лет')
|
36 |
+
vozrast_check = st.checkbox('Возраст', value=True)
|
37 |
+
# with col3:
|
38 |
+
f3 = st.text_input('Скорость клубочковой фильтрации по формуле CKD-EPI (мл/мин/1,73м2)')
|
39 |
+
ckf_check = st.checkbox('СКФ CKD-EPI', value=True)
|
40 |
+
# with col4:
|
41 |
+
f4 = st.selectbox(
|
42 |
+
'Перенесенный инфаркт миокарда',
|
43 |
+
('Да', 'Нет'))
|
44 |
+
pim_check = st.checkbox('ПИМ', value=True)
|
45 |
+
# with col5:
|
46 |
+
f5 = st.selectbox(
|
47 |
+
'Фибрилляция/Трепетание предсердий',
|
48 |
+
('Да', 'Нет'))
|
49 |
+
fp_check = st.checkbox('ФП', value=True)
|
50 |
+
# with col6:
|
51 |
+
f6 = st.selectbox(
|
52 |
+
'Сахарный диабет ',
|
53 |
+
('Да', 'НТГ', 'Нет'))
|
54 |
+
cd_check = st.checkbox('СД', value=True)
|
55 |
+
# with col7:
|
56 |
+
f7 =st.text_input('Концентрация NT-proBNP (пг/мл)')
|
57 |
+
nt_check = st.checkbox('NT_proBNP', value=True)
|
58 |
+
# with col8:
|
59 |
+
f8 = st.text_input('Концентрация ST2 (нг/мл)')
|
60 |
+
st2_check = st.checkbox('ST2', value=True)
|
61 |
|
62 |
|
63 |
|
64 |
+
filename_model = 'class_model_logreg.pickle'
|
65 |
+
filename_scaler = 'class_scaler.pickle'
|
66 |
+
filename_ohe = 'class_one_hot_enc.pickle'
|
67 |
+
filename_cat = 'class_model_catboost.pickle'
|
68 |
+
|
69 |
|
70 |
loaded_model = pickle.load(open(filename_model, 'rb'))
|
71 |
loaded_scaler = pickle.load(open(filename_scaler, 'rb'))
|
|
|
72 |
loaded_ohe = pickle.load(open(filename_ohe, 'rb'))
|
73 |
+
loaded_cat = pickle.load(open(filename_cat, 'rb'))
|
74 |
|
75 |
|
76 |
+
|
77 |
+
def get_interval_by_class(a):
|
78 |
+
if a == 1:
|
79 |
+
return 'Значение фракции выброса больше 50%'
|
80 |
+
elif a == 2:
|
81 |
+
return 'Значение фракции выброса лежит в интервале от 40 до 49%'
|
82 |
+
else:
|
83 |
+
return 'Значение фракции выброса меньше 40%'
|
84 |
+
|
85 |
|
86 |
if st.button('OK'):
|
87 |
|
88 |
+
if nyha_check:
|
89 |
if f1 == '':
|
90 |
+
st.write('Вы не ввели NYHA, будет использовано медианное значение')
|
91 |
+
f1 = nyha
|
92 |
else:
|
93 |
f1 = 0
|
94 |
|
95 |
+
if vozrast_check:
|
96 |
if f2 == '':
|
97 |
+
st.write('Вы не ввели возраст, будет использовано медианное значение')
|
98 |
+
f2 = vozrast
|
99 |
else:
|
100 |
f2 = 0
|
101 |
|
102 |
+
if ckf_check:
|
103 |
if f3 == '':
|
104 |
+
st.write('Вы не ввели СКФ, будет использовано медианное значение')
|
105 |
+
f3 = ckf
|
106 |
else:
|
107 |
f3 = 0
|
108 |
|
109 |
+
if pim_check:
|
110 |
if f4 == '':
|
111 |
+
st.write('Вы не ввели ПИМ, будет использовано медианное значение')
|
112 |
+
f4 = pim
|
113 |
else:
|
114 |
f4 = 0
|
115 |
|
116 |
+
if fp_check:
|
117 |
if f5 == '':
|
118 |
+
st.write('Вы не ввели ФП, будет использовано медианное значение')
|
119 |
+
f5 = fp
|
120 |
else:
|
121 |
f5 = 0
|
122 |
|
123 |
+
if cd_check:
|
124 |
if f6 == '':
|
125 |
+
st.write('Вы не ввели СД, будет использовано медианное значение')
|
126 |
+
f6 = cd
|
127 |
else:
|
128 |
f6 = 0
|
129 |
|
|
|
134 |
else:
|
135 |
f7 = 0
|
136 |
|
137 |
+
if st2_check:
|
138 |
if f8 == '':
|
139 |
+
st.write('Вы не ввели ST2, будет использовано медианное значение')
|
140 |
+
f8 = st2
|
141 |
else:
|
142 |
f8 = 0
|
143 |
|
144 |
+
|
145 |
+
# line = np.array([[float(f1), str(f2), str(f3), str(f4), str(f5), float(f6), float(f7), float(f8), float(f9), float(f10)]])
|
146 |
+
|
147 |
+
if f4 == 'Да':
|
148 |
+
f4 = '1'
|
149 |
else:
|
150 |
+
f4 = '2'
|
151 |
+
|
152 |
+
if f5 == 'Да':
|
153 |
+
f5 = '1'
|
154 |
+
elif f5 == 'НТГ':
|
155 |
+
f5 = '2'
|
156 |
+
else:
|
157 |
+
f5 = '3'
|
158 |
|
159 |
+
if f6 == 'Да':
|
160 |
+
f6 = '1'
|
|
|
|
|
161 |
else:
|
162 |
+
f6 = '2'
|
163 |
|
164 |
+
line = np.array([[str(f1), float(f2), float(f3), str(f4), str(f5), str(f6), float(f7), float(f8)]])
|
165 |
|
166 |
+
picked_cols = ['NYHA', 'возраст', 'СКФ CKD-EPI', 'ПИМ', 'ФП', 'СД', 'NT_proBNP', 'ST2']
|
167 |
+
categorical_cols = ['NYHA', 'ПИМ', 'ФП', 'СД']
|
168 |
+
num_cols = ['возраст', 'СКФ CKD-EPI', 'NT_proBNP', 'ST2']
|
|
|
169 |
|
170 |
X = pd.DataFrame(line, columns=picked_cols)
|
171 |
|
|
|
178 |
|
179 |
if mod == 'Линейная':
|
180 |
res = loaded_model.predict(line_norm)[0]
|
181 |
+
st.header(get_interval_by_class(int(res)))
|
182 |
else:
|
183 |
res = loaded_cat.predict(line_norm)[0]
|
184 |
+
st.header(get_interval_by_class(int(res)))
|
185 |
|