| import streamlit as st |
| import json |
| import os |
| from utils import load_and_process_data, create_time_series_plot, display_statistics, call_api |
|
|
|
|
| if 'api_token' not in st.session_state: |
| st.session_state.api_token = os.getenv('NILM_API_TOKEN') |
|
|
| page_id = 1 |
| if 'current_page' not in st.session_state: |
| st.session_state.current_page = page_id |
| elif st.session_state.current_page != page_id: |
| |
| if 'api_response' in st.session_state: |
| st.session_state.api_response = None |
| |
| st.session_state.current_page = page_id |
|
|
| |
| if 'current_file' not in st.session_state: |
| st.session_state.current_file = None |
| if 'json_data' not in st.session_state: |
| st.session_state.json_data = None |
| if 'api_response' not in st.session_state: |
| st.session_state.api_response = None |
| if 'using_default_file' not in st.session_state: |
| st.session_state.using_default_file = True |
|
|
| st.title("Short Term Energy Consumption Forecasting") |
|
|
| st.markdown(""" |
| This service provides short-term forecasting of energy consumption patterns. |
| Upload your energy consumption data to generate predictions for the near future. |
| |
| ### Features |
| - Hourly consumption forecasting |
| - Interactive visualizations |
| - Statistical analysis of predictions |
| """) |
|
|
| |
| default_file_path = "samples/1_short_term_consumption.json" |
|
|
| |
| uploaded_file = st.file_uploader("Upload JSON file (or use default)", type=['json']) |
|
|
| |
| if uploaded_file is None and st.session_state.using_default_file: |
| if os.path.exists(default_file_path): |
| st.info(f"Using default file: {default_file_path}") |
| with open(default_file_path, 'r') as f: |
| file_contents = f.read() |
| if st.session_state.current_file != file_contents: |
| st.session_state.current_file = file_contents |
| st.session_state.json_data = json.loads(file_contents) |
| else: |
| st.warning(f"Default file not found at: {default_file_path}") |
| st.session_state.using_default_file = False |
|
|
| |
| if uploaded_file: |
| st.session_state.using_default_file = False |
| try: |
| file_contents = uploaded_file.read() |
| st.session_state.current_file = file_contents |
| st.session_state.json_data = json.loads(file_contents) |
| except Exception as e: |
| st.error(f"Error processing file: {str(e)}") |
|
|
| |
| if st.session_state.json_data: |
| try: |
| dfs = load_and_process_data(st.session_state.json_data) |
| if dfs: |
| st.header("Input Data") |
| tabs = st.tabs(["Visualization", "Raw JSON", "Statistics"]) |
| |
| with tabs[0]: |
| for unit, df in dfs.items(): |
| st.plotly_chart(create_time_series_plot(df, unit), use_container_width=True) |
| |
| with tabs[1]: |
| st.json(st.session_state.json_data) |
| |
| with tabs[2]: |
| display_statistics(dfs) |
| |
| if st.button("Generate Short Term Forecast"): |
| if not st.session_state.api_token: |
| st.error("Please enter your API token in the sidebar first.") |
| else: |
| with st.spinner("Generating forecast..."): |
| st.session_state.api_response = call_api( |
| st.session_state.current_file, |
| st.session_state.api_token, |
| "inference_consumption_short_term" |
| ) |
| except Exception as e: |
| st.error(f"Error processing data: {str(e)}") |
|
|
| |
| if st.session_state.api_response: |
| st.header("Forecast Results") |
| tabs = st.tabs(["Visualization", "Raw JSON", "Statistics"]) |
| |
| with tabs[0]: |
| response_dfs = load_and_process_data( |
| st.session_state.api_response, |
| input_data=st.session_state.json_data |
| ) |
| if response_dfs: |
| if 'Celsius' in response_dfs: |
| del response_dfs['Celsius'] |
| for unit, df in response_dfs.items(): |
| st.plotly_chart(create_time_series_plot(df, unit), use_container_width=True) |
| |
| with tabs[1]: |
| st.json(st.session_state.api_response) |
| |
| with tabs[2]: |
| if response_dfs: |
| display_statistics(response_dfs) |