""" UI модуль для мониторинга топлива """ import streamlit as st import pandas as pd from api_client import upload_file_to_api, make_api_request from config import FUEL_COLUMNS def render_monitoring_fuel_tab(): """Рендер вкладки мониторинга топлива""" st.header("⛽ Мониторинг топлива - Полный функционал") # Секция загрузки файлов st.subheader("📤 Загрузка файлов") uploaded_fuel = st.file_uploader( "Выберите ZIP архив с мониторингом топлива", type=['zip'], key="fuel_upload" ) if uploaded_fuel is not None: if st.button("📤 Загрузить мониторинг топлива", key="upload_fuel_btn"): with st.spinner("Загружаю файл..."): result, status = upload_file_to_api( "/monitoring_fuel/upload-zip", uploaded_fuel.read(), uploaded_fuel.name ) if status == 200: st.success(f"✅ {result.get('message', 'Файл загружен')}") st.info(f"ID объекта: {result.get('object_id', 'N/A')}") else: st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") st.markdown("---") # Секция получения данных st.subheader("🔍 Получение данных") col1, col2 = st.columns(2) with col1: st.subheader("Агрегация по колонкам") columns_fuel = st.multiselect( "Выберите столбцы", FUEL_COLUMNS, default=["normativ", "total"], key="fuel_columns" ) if st.button("🔍 Получить агрегированные данные", key="fuel_total_btn"): if columns_fuel: with st.spinner("Получаю данные..."): data = { "columns": columns_fuel } result, status = make_api_request("/monitoring_fuel/get_total_by_columns", data) if status == 200: st.success("✅ Данные получены") st.json(result) else: st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") else: st.warning("⚠️ Выберите столбцы") with col2: st.subheader("Данные за месяц") month = st.selectbox( "Выберите месяц", [f"{i:02d}" for i in range(1, 13)], key="fuel_month" ) if st.button("🔍 Получить данные за месяц", key="fuel_month_btn"): with st.spinner("Получаю данные..."): data = { "month": month } result, status = make_api_request("/monitoring_fuel/get_month_by_code", data) if status == 200: st.success("✅ Данные получены") st.json(result) else: st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") st.markdown("---") # Новая секция для временных рядов st.subheader("📈 Временные ряды") col1, col2 = st.columns(2) with col1: st.subheader("Временные ряды по колонкам") # Выбор колонок для временного ряда series_columns = st.multiselect( "Выберите столбцы для временного ряда", FUEL_COLUMNS, default=["total", "normativ"], key="fuel_series_columns" ) if st.button("📊 Получить временные ряды", key="fuel_series_btn"): if series_columns: with st.spinner("Получаю временные ряды..."): data = { "columns": series_columns } result, status = make_api_request("/monitoring_fuel/get_series_by_id_and_columns", data) if status == 200: st.success("✅ Временные ряды получены") # Отображаем данные if result.get('data'): series_data = result['data'] # Показываем количество найденных ID st.info(f"📊 Найдено {len(series_data)} объектов") # Показываем JSON данные st.json(result) else: st.warning("⚠️ Данные не найдены") else: st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") else: st.warning("⚠️ Выберите столбцы") with col2: st.subheader("ℹ️ Справка") st.info(""" **Временные ряды** показывают изменение значений по месяцам для всех объектов. **Формат данных:** - Каждый ID объекта содержит массивы значений по месяцам - Массивы упорядочены по месяцам (01, 02, 03, ..., 12) - Отсутствующие месяцы пропускаются **Доступные колонки:** - `total` - общее потребление - `normativ` - нормативное потребление - И другие колонки из загруженных данных **Пример результата:** ``` SNPZ.VISB: { "total": [23.86, 26.51, 19.66, ...], "normativ": [19.46, 19.45, 18.57, ...] } ``` """)