Team Ai
Apppublic

CodingMaster24/SolarAnalysis

sourceHugging Faceapache-2.0updated 2y agoView on Hugging Face
0likes
lstm.py91 linesDownload Raw Back to pages
1import streamlit as st
2import pandas as pd
3import numpy as np
4import tensorflow as tf
5from tensorflow.keras.models import Sequential
6from tensorflow.keras.layers import LSTM, Dense
7from sklearn.preprocessing import MinMaxScaler
8from sklearn.model_selection import train_test_split
9
10st.title("LSTM Model for Solar Energy Prediction")
11
12# File Upload for Generation Data
13uploaded_gen = st.file_uploader("Upload Generation Data CSV", type=["csv"], key="lstm_gen")
14uploaded_weather = st.file_uploader("Upload Weather Sensor Data CSV", type=["csv"], key="lstm_weather")
15
16def load_data(file):
17    if file is not None:
18        return pd.read_csv(file)
19    return None
20
21# Load Data Separately
22gen_data = load_data(uploaded_gen)
23weather_data = load_data(uploaded_weather)
24
25# Default Data (if no file is uploaded)
26default_gen_data = pd.read_csv('https://github.com/Sivatech24/Streamlit/raw/refs/heads/main/Plant_1_Generation_Data.csv')
27default_weather_data = pd.read_csv('https://github.com/Sivatech24/Streamlit/raw/refs/heads/main/Plant_1_Weather_Sensor_Data.csv')
28
29if gen_data is None:
30    gen_data = default_gen_data
31if weather_data is None:
32    weather_data = default_weather_data
33
34# Choose which dataset to use
35dataset_choice = st.radio("Select dataset:", ("Generation Data", "Weather Data"))
36
37if dataset_choice == "Generation Data":
38    df = gen_data
39    target_col = "DAILY_YIELD"
40elif dataset_choice == "Weather Data":
41    df = weather_data
42    target_col = "MODULE_TEMPERATURE"
43
44# Feature Selection
45features = [col for col in df.columns if col not in ["DATE_TIME", target_col, "SOURCE_KEY"]]
46st.write("Selected Features:", features)
47
48# Normalize Data
49scaler = MinMaxScaler()
50scaled_data = scaler.fit_transform(df[features + [target_col]])
51
52# Create Sequences for LSTM
53def create_sequences(data, seq_length):
54    X, y = [], []
55    for i in range(len(data) - seq_length):
56        X.append(data[i : i + seq_length, :-1])  # All features except target
57        y.append(data[i + seq_length, -1])  # Target value
58    return np.array(X), np.array(y)
59
60seq_length = st.slider("Select Sequence Length", 1, 30, 10)
61X, y = create_sequences(scaled_data, seq_length)
62
63# Train-Test Split
64X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
65
66# Define LSTM Model
67model = Sequential([
68    LSTM(50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])),
69    LSTM(50, return_sequences=False),
70    Dense(25),
71    Dense(1)
72])
73
74model.compile(optimizer='adam', loss='mse')
75
76# Train Model
77epochs = st.slider("Select Number of Epochs", 1, 100, 10)
78progress_bar = st.progress(0)
79history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=16, verbose=1, callbacks=[tf.keras.callbacks.LambdaCallback(on_epoch_end=lambda epoch, logs: progress_bar.progress((epoch+1)/epochs))])
80
81# Predictions
82y_pred = model.predict(X_test)
83
84# Inverse Transform Predictions
85y_test_actual = scaler.inverse_transform(np.hstack((X_test[:, -1, :], y_test.reshape(-1, 1))))[:, -1]
86y_pred_actual = scaler.inverse_transform(np.hstack((X_test[:, -1, :], y_pred)))[:, -1]
87
88# Display Results
89st.write("LSTM Model Performance:")
90st.line_chart(pd.DataFrame({"Actual": y_test_actual, "Predicted": y_pred_actual}))
91