Spaces:
Sleeping
Sleeping
File size: 6,847 Bytes
e13071e 6e01e3c e13071e 6e01e3c c615cec 6e01e3c 2df0026 e13071e 6e01e3c e13071e 6e01e3c 78eeacf 6e01e3c e13071e 6e01e3c e13071e 6e01e3c e13071e 6e01e3c 78eeacf e13071e 78eeacf e13071e 6e01e3c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
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()
|