File size: 4,711 Bytes
b37c4e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from pathlib import Path
import pickle

import streamlit as st
from PIL import Image
import pandas as pd


# ====================== главная страница ============================

# параметры главной страницы
# https://docs.streamlit.io/library/api-reference/utilities/st.set_page_config
st.set_page_config(
    layout='wide',
    initial_sidebar_state='auto',
    page_title='Diabetes app',
    page_icon='🧊',
)


# ----------- функции -------------------------------------

# функция для загрузки картики с диска
# кэшируем иначе каждый раз будет загружатся заново
@st.cache_data
def load_image(image_path):
    image = Image.open(image_path)
    return image

# функция загрузки модели
# кэшируем иначе каждый раз будет загружатся заново
@st.cache_data
def load_model(model_path):
    # загрузка сериализованной модели
    with open(model_path, 'rb') as f:
        model = pickle.load(f)
    return model


# ------------- загрузка картинки для страницы и модели ---------

# путь до картинки
image_path = 'main_page_image.jpg'
image = load_image(image_path)

# путь до модели
model_path = 'model.pkl'
diabet_model = load_model(model_path)


# ---------- отрисовка текста и картинки ------------------------
st.write(
    """

    ### Диагностика диабета

    Введите ваши данные и получите результат

    """
)

# отрисовка картинки на странице
st.image(image, width=600)


# ====================== боковое меню для ввода данных ===============

st.sidebar.header('Входные данные пользователя')

# словарь с названиями признаков на русском для отображения в приложении
features = dict(
    gender='Пол',
    age='Возраст',
    hypertension='Гипертония',
    heart_disease='Заболевание сердца',
    smoking_history='История курения',
    bmi='Индекс массы тела',
    HbA1c_level='Гемоглобин',
    blood_glucose_level='Глюкоза',
)

# словари с названиями признаков и соответствующими индексами
gender_label_to_index = {'Female': 0, 'Male': 1}
smok_label_to_index = {
    'Нет информации': 0,
    'Курю': 1,
    'Курил когда-либо': 2,
    'Не курю (курил)': 3,
    'Никогда не курил': 4,
    'Бросил курить': 5}

# кнопки - слайдеры для ввода данных человека
gender = st.sidebar.radio(features['gender'], gender_label_to_index.keys(), horizontal=True)
age = st.sidebar.slider(features['age'], min_value=11, max_value=80, value=45, step=1)
hypertension = st.sidebar.checkbox(features['hypertension'], value=False)
heart_disease = st.sidebar.checkbox(features['heart_disease'], value=False)
smoking_history = st.sidebar.radio(features['smoking_history'], smok_label_to_index.keys())
bmi = st.sidebar.slider(features['bmi'], min_value=10.0, max_value=60.0, value=30.0, step=0.1)
HbA1c_level = st.sidebar.slider(features['HbA1c_level'], min_value=3.5, max_value=9.0, value=5.5, step=0.01)
blood_glucose_level = st.sidebar.slider(features['blood_glucose_level'], min_value=80, max_value=300, value=138, step=1)


# записать входные данные в словарь и в датафрейм
data_df = pd.DataFrame([dict(
    gender=gender_label_to_index[gender],
    age=age,
    hypertension=hypertension,
    heart_disease=heart_disease,
    smoking_history=smok_label_to_index[smoking_history],
    bmi=bmi,
    HbA1c_level=HbA1c_level,
    blood_glucose_level=blood_glucose_level,
)])


# =========== вывод входных данных и предсказания модели ==========

# вывести входные данные на страницу
st.write("##### Ваши данные")
st.write(data_df)


# предикт моделью входных данных, на выходе вероятность диабета
diabetes_prob = diabet_model.predict_proba(data_df.values)[0, 1]


# вывести предсказание модели
st.write("##### Вероятность диабета")
st.write(f'{diabetes_prob:.2f}')