sergey21000's picture
Upload 4 files
b37c4e6 verified
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}')