Spaces:
Sleeping
Sleeping
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='🧊', | |
) | |
# ----------- функции ------------------------------------- | |
# функция для загрузки картики с диска | |
# кэшируем иначе каждый раз будет загружатся заново | |
def load_image(image_path): | |
image = Image.open(image_path) | |
return image | |
# функция загрузки модели | |
# кэшируем иначе каждый раз будет загружатся заново | |
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}') |