Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Описания. Часть 2 #13

Merged
merged 1 commit into from
May 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion TimeSeriesApp/App_descriptions_streamlit.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,22 @@ def convert_df(df):

def intro_text():
with st.expander("О комплексе?"):
st.write("Комплекс разработан для работы с временными рядами метеорологических данных. Он позволяет совершить предобаботку ряда, а также его анализ и прогнозирование используя один из представленных в боковом меню методов. Комплекс доступен для запуска с любого устройства онлайн по ссылке https://time-series-msu-ff.streamlit.app/")
st.write(
"Комплекс разработан для работы с временными рядами метеорологических данных. Он позволяет совершить предобаботку ряда, а также его анализ и прогнозирование используя один из представленных в боковом меню методов. Комплекс доступен для запуска с любого устройства онлайн по ссылке https://time-series-msu-ff.streamlit.app/"
)


def preprocessing():
st.write(
"На этапе предобработки ряда мы можем выявить пропуски в данных, проверить ряд на стационарность и провести его сглаживание"
)


def stationar_test():
st.write(
"Проводится стандартный тест Дики-Фуллера (DF-тест), который является статистическим методом, применяемым для проверки стационарности временных рядов. Он используется для определения наличия единичного корня в ряде, что указывает на его нестационарность. \n Получаемый параметр p-value является уровнем значимости гипотезы. Если он не выходит за пределы 5%, то мы считаем наш ряд стационарным."
)

def moving_average():
st.write("Сглаживание позволяет устранить шумы и случайные колебания. Оно реализуется методом скользящего среднего. Его суть заключается в преобразовании исходного ряда в новый, где каждое значение является средним арифметическим значений в окне заданной ширины")
st.latex(r''' MA(t) = \frac{1}{2n+1} \sum_{i=t-n}^{t+n} y_i''')
48 changes: 34 additions & 14 deletions TimeSeriesApp/Time_Series_App.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def df_chart_display_iloc(df, data_col_iloc):
# trigonometric_args = [S_1_coef, S_1_freq, S_2_coef, S_2_freq, S_3_coef, S_3_freq, C_1_coef, C_1_freq, C_2_coef, C_2_freq, C_3_coef, C_3_freq]

st.title("Комплекс для работы с временными ря дами")
st.sidebar.header("Первичная обработка ряда")
st.sidebar.header("Выбор временного ряда для обработки")

txt.intro_text()

Expand All @@ -104,14 +104,16 @@ def df_chart_display_iloc(df, data_col_iloc):

if data_radio == "":
if st.session_state.final_dataframe.empty:
st.warning("Отсутствует ряд для анализа")
st.warning("Отсутствует ряд для анализа. Загрузите или сгененируйте его в боковом меню.")
# st.sidebar.write('Ожидается ответ от пользователя...')
st.stop()
else:
time_series = st.session_state.final_dataframe


if data_radio == "Загруженный ряд":
st.sidebar.info('Важно, чтобы временной индекс был в одной колонке в файле!', icon="ℹ️")

upload_file = st.sidebar.file_uploader(label="Загрузите файл CSV", type="CSV")
if upload_file == None:
st.stop()
Expand Down Expand Up @@ -144,6 +146,8 @@ def df_chart_display_iloc(df, data_col_iloc):
"Выберите параметры для генерируемого ряда", paramName_default
)



paramDict_default = {paramName_default[i]: 0 for i in range(len(paramName_default))}
# paramDict_default

Expand All @@ -159,8 +163,10 @@ def df_chart_display_iloc(df, data_col_iloc):

time_series = syntetic_time_series(date_range, **paramDict_default)

st.write("---") #Вставка разделителя

# Отображение ряда
"Исходный временной ряд"
st.subheader("Исходный временной ряд")
df_chart_display_loc(
time_series,
data_col_loc=time_series.select_dtypes(include=["int", "float"]).columns,
Expand All @@ -171,6 +177,11 @@ def df_chart_display_iloc(df, data_col_iloc):

# НАДО ПОНЯТЬ, КАК ИЗБЕГАТ ОШИБКУ ВЕЗДЕ, ПОКА Я ЕЩЕ НЕ ЗАРУЗИЛ ДАННЫЕ, А НЕ ПИСАТЬ ВЕЗДЕ if != None


st.sidebar.header("Предобработка ряда")
with st.sidebar.expander("Что это такое?"):
txt.preprocessing()

numeric_columns = list(time_series.select_dtypes(include=["int", "float"]).columns)
other_columns = list(time_series.columns)

Expand All @@ -196,7 +207,7 @@ def df_chart_display_iloc(df, data_col_iloc):

# Слайдер для выбора и отображения нужного интервала ряда
start_point, end_point = st.sidebar.slider(
"Выберите диапазон данных",
"Выберите диапазон данных для дальнейшей работы",
0,
time_series_selected.shape[0] - 1,
(0, time_series_selected.shape[0] - 1),
Expand All @@ -205,57 +216,66 @@ def df_chart_display_iloc(df, data_col_iloc):

time_series_selected_limited = time_series_selected.iloc[start_point:end_point]

"Выбранный временной ряд"
st.write("---") #Вставка разделителя

st.subheader("Выбранный временной ряд")
df_chart_display_iloc(time_series_selected_limited, 1)
# st.write(time_series_selected.loc[start_point:end_point])
# st.line_chart(time_series_selected.iloc[start_point:end_point, 1])

T_s_len = end_point - start_point # Размер выбранного диапазона
st.sidebar.write("Размер выбранного диапазона:", T_s_len)

MA_checkbox = st.sidebar.checkbox("Усреднить ряд", key="MA_checkbox")
MA_checkbox = st.sidebar.checkbox("Сгладить ряд", key="MA_checkbox")
with st.sidebar.expander("Что значит «сгладить»?"):
txt.moving_average()
MA_step = 0 # объявление нулевого шага MA
if MA_checkbox == False:
pass
else:
st.write("---") #Вставка разделителя
st.subheader("Сглаживание ряда")
MA_step = st.sidebar.number_input(
"Введите шаг скользящего среднего", min_value=1, max_value=T_s_len
)

st.write("Шаг скользящего среднего: ", MA_step, value=1)
# time_series_avg = time_series_selected.loc[start_point:end_point].rolling(window=MA_step, min_periods=1).mean()
time_series_selected_limited["Усредненный"] = time_series_selected_limited.rolling(
time_series_selected_limited["Сглаженный"] = time_series_selected_limited.rolling(
window=MA_step, min_periods=1
).mean()

compare_dframe = st.dataframe(time_series_selected_limited)

col1, col2 = st.columns(2)
with col1:
"Усредненный ряд"
"Сглаженный ряд"
dframe_chart_MA = st.line_chart(
time_series_selected_limited.loc[MA_step:, ["Усредненный"]]
time_series_selected_limited.loc[MA_step:, ["Сглаженный"]]
)
with col2:
"Исходный ряд"
st.line_chart(time_series_selected_limited.iloc[:, 1])

time_series_selected_limited[value_select] = time_series_selected_limited[
"Усредненный"
"Сглаженный"
]
del time_series_selected_limited["Усредненный"]
del time_series_selected_limited["Сглаженный"]


stationar_test_checkbox = st.sidebar.checkbox(
"Тест на стационарность", key="stat_test_checkbox"
)
with st.sidebar.expander("Что это за тест?"):
txt.stationar_test()
if stationar_test_checkbox:
stat_test_res = adfuller(time_series_selected_limited.iloc[MA_step:, -1])[1]
st.sidebar.write("Результаты теста на стационарность (p-value): ", stat_test_res)
if stat_test_res < 0.05:
st.sidebar.write("Ряд стационарен по критерию 5%")
st.sidebar.write("Ряд стационарен")
else:
st.sidebar.write("Ряд НЕ стационарен по критерию 5%")
st.sidebar.write("Ряд НЕ стационарен")


st.session_state.final_dataframe = time_series_selected_limited
st.session_state
# st.session_state
Binary file not shown.