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()