├── renewable_energy_demand_data.xlsx ├── README.md ├── the code └── renewable_energy_demand_forecasting.py /renewable_energy_demand_data.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Okes2024/Renewable-Energy-Demand-Forecasting-Using-Time-Series/HEAD/renewable_energy_demand_data.xlsx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Renewable Energy Demand Forecasting Using Time Series 2 | 3 | This project provides a solution for forecasting renewable energy demand using time series models, particularly Long Short-Term Memory (LSTM) networks. 4 | 5 | ## Overview 6 | - **Task**: Time Series Forecasting of renewable energy demand. 7 | - **Model**: LSTM (Long Short-Term Memory) Neural Network. 8 | - **Data**: Historical energy demand data. 9 | - **Libraries**: TensorFlow, Keras, Pandas, Matplotlib, scikit-learn. 10 | 11 | ## Project Structure 12 | - `data.csv`: CSV file containing historical energy demand data. 13 | - `prepare_data()`: Function to prepare the time series dataset. 14 | - `build_lstm_model()`: Function defining the LSTM model. 15 | - `train_test_split()`: Split data into training and testing sets. 16 | - `train_model()`: Function to train the model. 17 | - `forecast()`: Function to make future predictions. 18 | 19 | ## How to Run 20 | 1. Prepare a dataset (`data.csv`) with timestamps and demand values. 21 | 2. Load and preprocess the dataset. 22 | 3. Train the LSTM model. 23 | 4. Evaluate and forecast future energy demand. 24 | 25 | ## Requirements 26 | - Python 3.8+ 27 | - TensorFlow 2.x 28 | - Pandas 29 | - Matplotlib 30 | - scikit-learn 31 | 32 | Install dependencies: 33 | ```bash 34 | pip install tensorflow pandas matplotlib scikit-learn 35 | ``` 36 | 37 | ## Output 38 | - Trained LSTM model for demand forecasting. 39 | - Forecasted energy demand plot. 40 | 41 | ## Author 42 | **Okes Imoni** 43 | 44 | --- 45 | Feel free to fork and contribute to the project! 46 | -------------------------------------------------------------------------------- /the code: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import matplotlib.pyplot as plt 4 | from sklearn.preprocessing import MinMaxScaler 5 | from tensorflow.keras.models import Sequential 6 | from tensorflow.keras.layers import LSTM, Dense 7 | 8 | # Load dataset 9 | data = pd.read_csv('data.csv', parse_dates=['date'], index_col='date') 10 | values = data['demand'].values.reshape(-1, 1) 11 | 12 | # Normalize data 13 | scaler = MinMaxScaler(feature_range=(0, 1)) 14 | scaled_values = scaler.fit_transform(values) 15 | 16 | # Prepare dataset 17 | def create_dataset(dataset, look_back=1): 18 | X, Y = [], [] 19 | for i in range(len(dataset) - look_back - 1): 20 | a = dataset[i:(i + look_back), 0] 21 | X.append(a) 22 | Y.append(dataset[i + look_back, 0]) 23 | return np.array(X), np.array(Y) 24 | 25 | look_back = 24 # e.g., last 24 hours 26 | X, y = create_dataset(scaled_values, look_back) 27 | X = np.reshape(X, (X.shape[0], X.shape[1], 1)) 28 | 29 | # Split into train and test sets 30 | train_size = int(len(X) * 0.8) 31 | trainX, testX = X[:train_size], X[train_size:] 32 | trainY, testY = y[:train_size], y[train_size:] 33 | 34 | # Build LSTM model 35 | model = Sequential() 36 | model.add(LSTM(50, return_sequences=True, input_shape=(look_back, 1))) 37 | model.add(LSTM(50)) 38 | model.add(Dense(1)) 39 | model.compile(loss='mean_squared_error', optimizer='adam') 40 | 41 | # Train the model 42 | model.fit(trainX, trainY, epochs=20, batch_size=32, validation_data=(testX, testY)) 43 | 44 | # Forecast 45 | trainPredict = model.predict(trainX) 46 | testPredict = model.predict(testX) 47 | 48 | # Inverse transform predictions 49 | trainPredict = scaler.inverse_transform(trainPredict) 50 | testPredict = scaler.inverse_transform(testPredict) 51 | trainY = scaler.inverse_transform([trainY]) 52 | testY = scaler.inverse_transform([testY]) 53 | 54 | # Plot results 55 | plt.figure(figsize=(10,6)) 56 | plt.plot(data.index[look_back+1:train_size+look_back+1], trainY.flatten(), label='Train Actual') 57 | plt.plot(data.index[look_back+1:train_size+look_back+1], trainPredict.flatten(), label='Train Predict') 58 | plt.plot(data.index[train_size+look_back+1:], testY.flatten(), label='Test Actual') 59 | plt.plot(data.index[train_size+look_back+1:], testPredict.flatten(), label='Test Predict') 60 | plt.xlabel('Time') 61 | plt.ylabel('Energy Demand') 62 | plt.title('Renewable Energy Demand Forecasting') 63 | plt.legend() 64 | plt.show() 65 | -------------------------------------------------------------------------------- /renewable_energy_demand_forecasting.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import matplotlib.pyplot as plt 4 | from sklearn.preprocessing import MinMaxScaler 5 | from tensorflow.keras.models import Sequential 6 | from tensorflow.keras.layers import LSTM, Dense 7 | 8 | # Load dataset 9 | data = pd.read_csv('data.csv', parse_dates=['date'], index_col='date') 10 | values = data['demand'].values.reshape(-1, 1) 11 | 12 | # Normalize data 13 | scaler = MinMaxScaler(feature_range=(0, 1)) 14 | scaled_values = scaler.fit_transform(values) 15 | 16 | # Prepare dataset 17 | def create_dataset(dataset, look_back=1): 18 | X, Y = [], [] 19 | for i in range(len(dataset) - look_back - 1): 20 | a = dataset[i:(i + look_back), 0] 21 | X.append(a) 22 | Y.append(dataset[i + look_back, 0]) 23 | return np.array(X), np.array(Y) 24 | 25 | look_back = 24 # e.g., last 24 hours 26 | X, y = create_dataset(scaled_values, look_back) 27 | X = np.reshape(X, (X.shape[0], X.shape[1], 1)) 28 | 29 | # Split into train and test sets 30 | train_size = int(len(X) * 0.8) 31 | trainX, testX = X[:train_size], X[train_size:] 32 | trainY, testY = y[:train_size], y[train_size:] 33 | 34 | # Build LSTM model 35 | model = Sequential() 36 | model.add(LSTM(50, return_sequences=True, input_shape=(look_back, 1))) 37 | model.add(LSTM(50)) 38 | model.add(Dense(1)) 39 | model.compile(loss='mean_squared_error', optimizer='adam') 40 | 41 | # Train the model 42 | model.fit(trainX, trainY, epochs=20, batch_size=32, validation_data=(testX, testY)) 43 | 44 | # Forecast 45 | trainPredict = model.predict(trainX) 46 | testPredict = model.predict(testX) 47 | 48 | # Inverse transform predictions 49 | trainPredict = scaler.inverse_transform(trainPredict) 50 | testPredict = scaler.inverse_transform(testPredict) 51 | trainY = scaler.inverse_transform([trainY]) 52 | testY = scaler.inverse_transform([testY]) 53 | 54 | # Plot results 55 | plt.figure(figsize=(10,6)) 56 | plt.plot(data.index[look_back+1:train_size+look_back+1], trainY.flatten(), label='Train Actual') 57 | plt.plot(data.index[look_back+1:train_size+look_back+1], trainPredict.flatten(), label='Train Predict') 58 | plt.plot(data.index[train_size+look_back+1:], testY.flatten(), label='Test Actual') 59 | plt.plot(data.index[train_size+look_back+1:], testPredict.flatten(), label='Test Predict') 60 | plt.xlabel('Time') 61 | plt.ylabel('Energy Demand') 62 | plt.title('Renewable Energy Demand Forecasting') 63 | plt.legend() 64 | plt.show() 65 | --------------------------------------------------------------------------------