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}')