File size: 4,248 Bytes
7ea2c78
 
 
 
 
 
 
740b9c1
8089eef
740b9c1
4b1dd4e
e1e728b
 
 
 
 
 
 
 
 
 
 
4b1dd4e
e1e728b
 
7ea2c78
 
 
 
4b1dd4e
 
 
 
 
 
7ea2c78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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="🧊",
# )
# ----------- функции -------------------------------------

# функция для загрузки картинки с диска
# кэшируем, иначе каждый раз будет загружаться заново
@st.cache_data
def load_image(image_path):
    image = Image.open(image_path)
    # обрезка до нужного размера с сохранением пропорций
    MAX_SIZE = (600, 400)
    image.thumbnail(MAX_SIZE)
    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 = 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))