zendeer commited on
Commit
179e465
·
1 Parent(s): 788de41

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -92
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, col9, col10 = st.columns(10)
14
 
15
- vozrast = 57
 
 
16
  pim = 2
17
- cd = 3
18
  fp = 2
19
- nyha = 2
20
- ckf= 78
21
- nt = 235
22
- kcr = 36
23
- lp = 38
24
- st2 = 38
25
 
26
  mod = st.radio(
27
  "Выберите модель",
28
  options=["Линейная", "Нелинейная"]
29
  )
30
 
31
- with col1:
32
- f1 = st.text_input('возраст')
33
- vozrast_check = st.checkbox('возраст', value=True)
34
- with col2:
35
- f2 =st.text_input('ПИМ')
36
- pim_check = st.checkbox('ПИМ', value=True)
37
- with col3:
38
- f3 = st.text_input('СД')
39
- cd_check = st.checkbox('СД', value=True)
40
- with col4:
41
- f4 = st.text_input('ФП')
42
- fp_check = st.checkbox('ФП', value=True)
43
- with col5:
44
- f5 = st.text_input('NYHA')
45
- nyha_check = st.checkbox('NYHA', value=True)
46
- with col6:
47
- f6 = st.text_input('СКФ CKD-EPI')
48
- ckf_check = st.checkbox('СКФ CKD-EPI', value=True)
49
- with col7:
50
- f7 =st.text_input('NT_proBNP')
51
- nt_check = st.checkbox('NT_proBNP', value=True)
52
- with col8:
53
- f8 = st.text_input('КСР')
54
- kcr_check = st.checkbox('КСР', value=True)
55
- with col9:
56
- f9 = st.text_input('ЛП')
57
- lp_check = st.checkbox('ЛП', value=True)
58
- with col10:
59
- f10 = st.text_input('ST2')
60
- st2_check = st.checkbox('ST2', value=True)
 
 
61
 
62
 
63
 
64
- filename_model = 'huber2.pickle'
65
- filename_scaler = 'scaler2.pickle'
66
- filename_cat = 'catboost2.pickle'
67
- filename_ohe = 'ohe2.pickle'
 
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
- cd = 3
76
- fp = 2
77
- nyha = 2
78
- ckf= 78
79
- nt = 235
80
- kcr = 36
81
- lp = 38
82
- st2 = 38
 
83
 
84
  if st.button('OK'):
85
 
86
- if vozrast_check:
87
  if f1 == '':
88
- st.write('Вы не ввели возраст, будет использовано медианное значение')
89
- f1 = vozrast
90
  else:
91
  f1 = 0
92
 
93
- if pim_check:
94
  if f2 == '':
95
- st.write('Вы не ввели ПИМ, будет использовано медианное значение')
96
- f2 = pim
97
  else:
98
  f2 = 0
99
 
100
- if cd_check:
101
  if f3 == '':
102
- st.write('Вы не ввели СД, будет использовано медианное значение')
103
- f3 = cd
104
  else:
105
  f3 = 0
106
 
107
- if fp_check:
108
  if f4 == '':
109
- st.write('Вы не ввели ФП, будет использовано медианное значение')
110
- f4 = fp
111
  else:
112
  f4 = 0
113
 
114
- if nyha_check:
115
  if f5 == '':
116
- st.write('Вы не ввели NYHA, будет использовано медианное значение')
117
- f5 = nyha
118
  else:
119
  f5 = 0
120
 
121
- if ckf_check:
122
  if f6 == '':
123
- st.write('Вы не ввели СКФ CKD-EPI, будет использовано медианное значение')
124
- f6 = ckf
125
  else:
126
  f6 = 0
127
 
@@ -132,33 +134,38 @@ if st.button('OK'):
132
  else:
133
  f7 = 0
134
 
135
- if kcr_check:
136
  if f8 == '':
137
- st.write('Вы не ввели КСР, будет использовано медианное значение')
138
- f8 = kcr
139
  else:
140
  f8 = 0
141
 
142
- if lp_check:
143
- if f9 == '':
144
- st.write('Вы не ввели ЛП, будет использовано медианное значение')
145
- f9 = lp
 
146
  else:
147
- f9 = 0
 
 
 
 
 
 
 
148
 
149
- if st2_check:
150
- if f10 == '':
151
- st.write('Вы не ввели ST2, будет использовано медианное значение')
152
- f10 = st2
153
  else:
154
- f10 = 0
155
 
156
- # line = np.array([[float(f1), str(f2), str(f3), str(f4), str(f5), float(f6), float(f7), float(f8), float(f9), float(f10)]])
157
 
158
- line = np.array([[float(f1), str(f2), str(f3), str(f4), str(f5), float(f6), float(f7), float(f8), float(f9), float(f10)]])
159
- picked_cols = ['возраст', 'ПИМ', 'СД', 'ФП', 'NYHA', 'СКФ CKD-EPI', 'NT_proBNP', 'КСР', 'ЛП', 'ST2']
160
- categorical_cols = ['ПИМ', 'СД', 'ФП', 'NYHA']
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