File size: 2,006 Bytes
ef94dec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
import warnings
warnings.filterwarnings("ignore")

class Model:
    def __init__(self, data):
        self.data = data
        self.scaler = MinMaxScaler(feature_range=(0, 1))
        self.model = None

    def prepare_data(self, look_back=1):
        scaled_data = self.scaler.fit_transform(self.data['Close'].values.reshape(-1, 1))
        def create_dataset(dataset):
            X, Y = [], []
            for i in range(len(dataset) - look_back):
                a = dataset[i:(i + look_back), 0]
                X.append(a)
                Y.append(dataset[i + look_back, 0])
            return np.array(X), np.array(Y)
        
        X, Y = create_dataset(scaled_data)
        X = np.reshape(X, (X.shape[0], 1, X.shape[1]))
        return X, Y

    def train_lstm(self, epochs=5, batch_size=1):
        X, Y = self.prepare_data()
        self.model = Sequential()
        self.model.add(LSTM(50, input_shape=(1, 1)))
        self.model.add(Dense(1))
        self.model.compile(loss='mean_squared_error', optimizer='adam')
        self.model.fit(X, Y, epochs=epochs, batch_size=batch_size, verbose=0)

    def make_predictions(self):
        X, _ = self.prepare_data()
        predictions = self.model.predict(X)
        predictions = self.scaler.inverse_transform(predictions)
        return predictions

    def forecast_future(self, days=5):
        last_value = self.data['Close'].values[-1:].reshape(-1, 1)
        last_scaled = self.scaler.transform(last_value)
        future_predictions = []
        for _ in range(days):
            prediction = self.model.predict(last_scaled.reshape(1, 1, 1))[0]
            future_predictions.append(prediction)
            last_scaled = prediction  
        future_predictions = self.scaler.inverse_transform(future_predictions)
        return future_predictions