MajorProject / app.py
Dang01's picture
Update app.py
2df0026 verified
Raw
History Blame Contribute Delete
6.85 kB
import numpy as np
import pandas as pd
import streamlit as st
import matplotlib.pyplot as plt
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from keras.models import load_model
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# Load the data
data = pd.read_csv('Solar_Irradiance.csv')
data['Latitude'] = data['Latitude'].str.rstrip('°').astype(float)
data['Longitude'] = data['Longitude'].str.rstrip('°').astype(float)
# Extract features and target
features = data[['Month', 'Hour', 'Latitude', 'Longitude', 'Panel_Capacity(W)', 'Panel_Efficiency', 'Wind_Speed(km/h)', 'Cloud_Cover(%)', 'temperature (°f)']]
target = data['Irradiance(W/m^2)']
# Set up the encoder and scaler
encoder = OneHotEncoder(sparse=False, categories='auto')
categorical_features = features[['Month', 'Hour']]
encoder.fit(categorical_features)
scaler = StandardScaler()
scaler.fit(features[['Latitude', 'Longitude', 'Panel_Capacity(W)', 'Panel_Efficiency', 'Wind_Speed(km/h)', 'Cloud_Cover(%)', 'temperature (°f)']])
# Load the saved model
loaded_model = load_model('solar_irradiance_model.h5')
# Streamlit app setup
st.title("Solar Irradiance Prediction")
st.sidebar.header("Input Parameters")
# User inputs from sidebar
month = st.sidebar.selectbox("Month", data['Month'].unique())
hour = st.sidebar.slider("Hour", 0, 23, 12)
latitude = st.sidebar.number_input("Latitude", value=28.570633)
longitude = st.sidebar.number_input("Longitude", value=77.327215)
panel_capacity = st.sidebar.number_input("Panel Capacity (W)", value=500)
panel_efficiency = st.sidebar.number_input("Panel Efficiency", value=0.15)
wind_speed = st.sidebar.number_input("Wind Speed (km/h)", value=6.43988)
cloud_cover = st.sidebar.number_input("Cloud Cover (%)", value=17.7)
temperature = st.sidebar.number_input("Temperature (°F)", value=55.0)
# Function to predict irradiance
def predict_irradiance(month, hour, latitude, longitude, panel_capacity, panel_efficiency, wind_speed, cloud_cover, temperature):
encoded_month_hour = encoder.transform([[month, hour]])
scaled_features = scaler.transform([[latitude, longitude, panel_capacity, panel_efficiency, wind_speed, cloud_cover, temperature]])
processed_features = np.concatenate((encoded_month_hour, scaled_features), axis=1)
reshaped_features = np.reshape(processed_features, (1, 1, processed_features.shape[1]))
predicted_irradiance = loaded_model.predict(reshaped_features)
return max(predicted_irradiance[0][0], 0.0)
# Display the predicted irradiance
predicted_irradiance = predict_irradiance(month, hour, latitude, longitude, panel_capacity, panel_efficiency, wind_speed, cloud_cover, temperature)
st.write(f"Predicted irradiance for {month}, hour {hour}: {predicted_irradiance:.2f} W/m^2")
# Plot actual vs. predicted irradiance
def plot_actual_vs_predicted(month):
actual_irradiance = data[data['Month'] == month]['Irradiance(W/m^2)'].values
predicted_irradiances = []
for hour in range(24):
irradiance = predict_irradiance(month, hour, latitude, longitude, panel_capacity, panel_efficiency, wind_speed, cloud_cover, temperature)
predicted_irradiances.append(irradiance)
plt.figure(figsize=(12, 6))
plt.plot(range(24), actual_irradiance, label='Actual Irradiance', color='blue')
plt.plot(range(24), predicted_irradiances, label='Predicted Irradiance', color='red')
plt.xlabel('Hour')
plt.ylabel('Irradiance (W/m^2)')
plt.title(f'Actual vs. Predicted Irradiance for {month}')
plt.legend()
st.pyplot(plt)
# Display the plot
plot_actual_vs_predicted(month)
# Function to calculate and display evaluation metrics
def display_evaluation_metrics():
metrics_df = pd.DataFrame(columns=['Month', 'MSE', 'RMSE', 'MAE', 'R-squared'])
for month in data['Month'].unique():
actual_irradiance = get_actual_irradiance(month)
predicted_irradiance = []
for hour in range(24):
irradiance = predict_irradiance(month, hour, latitude, longitude, panel_capacity, panel_efficiency, wind_speed, cloud_cover, temperature)
predicted_irradiance.append(irradiance)
mse = mean_squared_error(actual_irradiance, predicted_irradiance)
rmse = np.sqrt(mse)
mae = mean_absolute_error(actual_irradiance, predicted_irradiance)
r2 = r2_score(actual_irradiance, predicted_irradiance)
metrics_df = metrics_df.append({'Month': month, 'MSE': mse, 'RMSE': rmse, 'MAE': mae, 'R-squared': r2}, ignore_index=True)
st.write("Evaluation Metrics for Each Month")
st.dataframe(metrics_df)
# Display evaluation metrics
display_evaluation_metrics()
# Function to plot actual vs. predicted irradiance scatter plot
def plot_irradiance_scatter(month):
actual_irradiance = get_actual_irradiance(month)
predicted_irradiances = []
for hour in range(24):
irradiance = predict_irradiance(month, hour, latitude, longitude, panel_capacity, panel_efficiency, wind_speed, cloud_cover, temperature)
predicted_irradiances.append(irradiance)
plt.figure(figsize=(8, 6))
plt.scatter(range(24), actual_irradiance, label='Actual Irradiance', color='blue')
plt.scatter(range(24), predicted_irradiances, label='Predicted Irradiance', color='red')
plt.xlabel('Hour')
plt.ylabel('Irradiance (W/m^2)')
plt.title(f'Actual vs. Predicted Irradiance for {month}')
plt.legend()
st.pyplot(plt)
# Example usage: scatter plot for selected month
plot_irradiance_scatter(month)
# Function to plot hour vs. irradiance for all months
def plot_hour_vs_irradiance():
months = data['Month'].unique()
hour_range = range(24)
predicted_irradiances = np.zeros((len(months), 24))
actual_irradiances = np.zeros((len(months), 24))
for i, month in enumerate(months):
for hour in hour_range:
if hour in range(6) or hour in range(18, 24):
irradiance = 0 # Set predicted irradiance to 0
else:
irradiance = predict_irradiance(month, hour, latitude, longitude, panel_capacity, panel_efficiency, wind_speed, cloud_cover, temperature)
predicted_irradiances[i][hour] = irradiance
actual_irradiances[i][hour] = get_actual_irradiance(month)[hour]
bar_width = 0.35
index = np.arange(len(hour_range))
plt.figure(figsize=(12, 6))
plt.bar(index, predicted_irradiances.mean(axis=0), bar_width, label='Predicted Irradiance')
plt.bar(index + bar_width, actual_irradiances.mean(axis=0), bar_width, label='Actual Irradiance')
plt.xlabel('Hour')
plt.ylabel('Irradiance (W/m^2)')
plt.title('Hour vs. Irradiance (Average for All Months)')
plt.xticks(index + bar_width/2, hour_range)
plt.legend()
st.pyplot(plt)
# Plot hour vs. irradiance for all months
plot_hour_vs_irradiance()