162 lines
6.6 KiB
Python
162 lines
6.6 KiB
Python
"""
|
||
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, ...]
|
||
}
|
||
```
|
||
""") |