Spaces:
Sleeping
Sleeping
| from pathlib import Path | |
| import pickle | |
| import streamlit as st | |
| import datetime | |
| from PIL import Image | |
| import pandas as pd | |
| from datetime import timedelta | |
| import time | |
| import os | |
| # Принудительная настройка для Hugging Face | |
| if 'HUGGINGFACE_SPACE' in os.environ: | |
| st.set_page_config( | |
| page_title="My App", | |
| layout="wide" | |
| ) | |
| else: | |
| st.set_page_config( | |
| page_title="My App", | |
| layout="wide" | |
| ) | |
| st.title("🚀 Тестовый заголовок") | |
| st.success("Приложение работает!") | |
| # ====================== главная страница ============================ | |
| # параметры главной страницы | |
| # https://docs.streamlit.io/library/api-reference/utilities/st.set_page_config | |
| # st.set_page_config( | |
| # layout="wide", | |
| # initial_sidebar_state="auto", | |
| # page_title="M-cycle", | |
| # page_icon="🧊", | |
| # ) | |
| # ----------- функции ------------------------------------- | |
| # функция для загрузки картинки с диска | |
| # кэшируем, иначе каждый раз будет загружаться заново | |
| def load_image(image_path): | |
| image = Image.open(image_path) | |
| # обрезка до нужного размера с сохранением пропорций | |
| MAX_SIZE = (600, 400) | |
| image.thumbnail(MAX_SIZE) | |
| return image | |
| # функция загрузки модели | |
| # кэшируем, иначе каждый раз будет загружаться заново | |
| def load_model(model_path): | |
| # загрузка сериализованной модели | |
| with open(model_path, 'rb') as f: | |
| model = pickle.load(f) | |
| return model | |
| # ------------- загрузка картинки для страницы и модели --------- | |
| # путь до картинки | |
| image_path = Path.cwd() / 'Dias-fertiles-de-una-mujer.jpg' | |
| image = load_image(image_path) | |
| # путь до модели | |
| model_path = Path.cwd() / 'model_sar.pkl' | |
| model_sar = load_model(model_path) | |
| # ---------- отрисовка текста и картинки ------------------------ | |
| st.write( | |
| """ | |
| # Прогноз менструального цикла | |
| Введите ваши данные и получите результат | |
| """ | |
| ) | |
| # отрисовка картинки на странице | |
| st.image(image) | |
| # ====================== боковое меню для ввода данных =============== | |
| st.sidebar.header('Введите данные') | |
| # словарь с названиями признаков и описанием для удобства | |
| features_dict = { | |
| 'date_last': 'Дата последней менструации', | |
| 'pred_num': 'Прогноз (количество месяцев)', | |
| } | |
| # кнопки - слайдеры для ввода данных человека | |
| date_last = st.sidebar.date_input(features_dict['date_last'], value=None) | |
| pred_num = st.sidebar.slider(features_dict['pred_num'], min_value=1, max_value=3, value=1, step=1) | |
| # предикт моделью входных данных, на выходе даты цикла | |
| st_prediction = model_sar.forecast(pred_num) | |
| st_prediction_int = st_prediction.astype(int) | |
| pred_list = st_prediction_int.to_list() | |
| new_list = [] | |
| for i in range(len(pred_list)): | |
| new_list.append(pred_list[i] + sum(pred_list[:i])) | |
| pred_cicle = pd.DataFrame(new_list, columns=['sarima_pred']) | |
| pred_cicle['sarima_pred'] = pred_cicle['sarima_pred'].astype(str) | |
| pred_cicle['sarima_pred'] = pred_cicle['sarima_pred'] + ' days' | |
| pred_cicle['sarima_pred'] = pd.to_timedelta(pred_cicle['sarima_pred']) | |
| pred_cicle['Даты цикла'] = pd.Timestamp(date_last) + pred_cicle['sarima_pred'] | |
| pred_cicle["Дни овуляции"] = pred_cicle["Даты цикла"] - timedelta(days=14) | |
| pred_cicle['a'] = '/' | |
| # вывести предсказание модели | |
| st.write("## Даты начала менструального цикла") | |
| st.write(pred_cicle[['Даты цикла', 'a']].to_string(index=False, header=False)) | |
| st.write("## Дни овуляции") | |
| st.write(pred_cicle[['Дни овуляции', 'a']].to_string(index=False, header=False)) | |