Spaces:
Running
Running
| 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}') |