Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import pickle | |
import os | |
from pathlib import Path | |
# Set page title and configuration | |
st.set_page_config(page_title="ISA414: Energy Consumption Estimator", layout="wide") | |
st.title("ISA 414: Energy Consumption Estimator") | |
# Create a function to load models | |
def load_models(): | |
# Check if model files exist in the current directory | |
model_path = Path("model.pickle") | |
encoder_path = Path("encoder.pickle") | |
if not model_path.exists() or not encoder_path.exists(): | |
st.error("Model files not found. Please make sure 'model.pickle' and 'encoder.pickle' are in the same directory as this script.") | |
st.stop() | |
# Load model and encoding from files | |
model = pickle.load(open("model.pickle", 'rb')) | |
enc = pickle.load(open("encoder.pickle", 'rb')) | |
return model, enc | |
# Try to load models | |
try: | |
model, enc = load_models() | |
except Exception as e: | |
st.error(f"Error loading models: {str(e)}") | |
st.info("For demonstration purposes, you can continue using the app without the models.") | |
model, enc = None, None | |
# Create sidebar with form inputs | |
with st.form("consumption_form"): | |
st.subheader("Enter Client Information") | |
# Create two columns for form layout | |
col1, col2 = st.columns(2) | |
with col1: | |
age = st.number_input("Age", min_value=0, max_value=120, value=30) | |
marital_status_options = ["Single", "Married", "Separated", "Divorced", "Widowed", "Other"] | |
marital_status = st.selectbox("Marital Status", options=marital_status_options, index=0) | |
marital_status_value = str(marital_status_options.index(marital_status) + 1) | |
consumption = st.number_input("Day/Night Consumption", min_value=0.0, value=1.0, format="%.2f") | |
income_options = ["Less than 10,000", "Between 10,000 and 30,000", | |
"Between 40,000 and 60,000", "Between 60,000 and 100,000", "More than 100,000"] | |
income = st.selectbox("Income Level", options=income_options, index=0) | |
income_value = str(income_options.index(income) + 1) | |
area_options = ["City centre", "City outskirts", "Rural", "Remote"] | |
area = st.selectbox("Dwelling Area", options=area_options, index=0) | |
area_value = str(area_options.index(area) + 1) | |
with col2: | |
children_options = ["No", "Yes"] | |
children = st.selectbox("Children", options=children_options, index=0) | |
children_value = False if children_options.index(children) == 0 else True | |
solar_options = ["No", "Yes"] | |
solar = st.selectbox("Solar Panel", options=solar_options, index=0) | |
solar_value = False if solar_options.index(solar) == 0 else True | |
sustainability_options = ["Favorable", "Undecided", "Unfavorable"] | |
sustainability = st.selectbox("Attitude Towards Sustainability", options=sustainability_options, index=0) | |
sustainability_value = str(sustainability_options.index(sustainability) + 1) | |
tariff_options = ["Flat", "Time-of-Use", "Dynamic"] | |
tariff = st.selectbox("Tariff", options=tariff_options, index=0) | |
tariff_value = "Tariff " + str(tariff_options.index(tariff) + 1) | |
# Submit button | |
submitted = st.form_submit_button("Estimate Consumption") | |
# Function to make prediction | |
def forecast(age, marital_status, consumption, income, area, children, solar, sustainability, tariff): | |
# Creating a DataFrame having a new client | |
new_client = [age, marital_status, consumption, income, area, children, solar, sustainability, tariff] | |
new_client = pd.DataFrame([new_client], | |
columns=("Age", "MaritalStatus", "DayNightConsumption", "IncomeLevel", | |
"DwellingArea", "HasChildren", "SolarRoof", "AttitudeSustainability", "Tariff")) | |
# Categorical columns | |
cat_columns = ["MaritalStatus", "IncomeLevel", "DwellingArea", "AttitudeSustainability", "Tariff"] | |
# Using the previously created encoding and list of categorical variables to generate dummies | |
dummies = enc.transform(new_client[cat_columns]) | |
# Creating a DataFrame of the dummies | |
dummies_df = pd.DataFrame(dummies, columns=enc.get_feature_names_out(input_features=cat_columns)) | |
# Concatenating with the original data | |
new_client = pd.concat([new_client, dummies_df], axis=1) | |
# Dropping old columns | |
new_client = new_client.drop(columns=cat_columns, axis=1) | |
# Making prediction | |
prediction = model.predict(new_client)[0] | |
return prediction | |
# Display results if form is submitted | |
if submitted: | |
try: | |
if model is not None and enc is not None: | |
# Make prediction | |
prediction = forecast( | |
age, | |
marital_status_value, | |
consumption, | |
income_value, | |
area_value, | |
children_value, | |
solar_value, | |
sustainability_value, | |
tariff_value | |
) | |
# Display result | |
st.success(f"Estimated annual consumption: {prediction:.2f} kWh") | |
else: | |
st.warning("This is a demo mode. Models are not loaded.") | |
st.info("In a real deployment, the prediction would be calculated here.") | |
except Exception as e: | |
st.error(f"Error making prediction: {str(e)}") | |
# Add information about the app | |
with st.expander("About this app"): | |
st.write(""" | |
This app estimates energy consumption based on various client attributes. | |
It uses a machine learning model to make predictions. | |
To use the app: | |
1. Enter the client information in the form | |
2. Click 'Estimate Consumption' to see the prediction | |
Note: This app requires 'model.pickle' and 'encoder.pickle' files to make actual predictions. | |
""") | |