stock_predictor / utils.py
jsebdev's picture
Implement model after mock predict
0e5c662
raw
history blame
3.06 kB
import numpy as np
import pandas as pd
import pandas_datareader as web
import datetime as dt
import yfinance as yfin
import os
from huggingface_hub import from_pretrained_keras
def get_data(ticker='AAPL', start=None, end=None):
if end is None:
end = dt.date.today()
if start is None:
start = end - dt.timedelta(days=800)
yfin.pdr_override()
data = web.data.get_data_yahoo(ticker, start, end)
# data = pd.read_csv('train_data.csv', index_col='Date')
return data
def get_last_candle_value(data, column):
val = data.iloc[-1][column]
return "{:.2f}".format(val)
# Preprocessing functions copied from notebook where model was trained
def create_remove_columns(data):
# create jump column
data = pd.DataFrame.copy(data)
data['Jump'] = data['Open'] - data['Close'].shift(1)
data['Jump'].fillna(0, inplace=True)
data.insert(0,'Jump', data.pop('Jump'))
return data
def normalize_data(data):
# Returns a tuple with the normalized data, the scaler and the decoder
# The normalized data is a dataframe with the following columns:
# ['Jump', 'High', 'Low', 'Close', 'Adj Close', 'Volume']
the_data = pd.DataFrame.copy(data)
# substract the open value to all columns but the first one and the last one which are "Jump" and "Volume"
the_data.iloc[:, 1:-1] = the_data.iloc[:,1:-1] - the_data['Open'].values[:, np.newaxis]
# print('the_data')
# print(the_data)
the_data.pop('Open')
# Create the scaler
max_value = float(os.getenv('SCALER_MAX_VALUE'))
max_volume = float(os.getenv('SCALER_MAX_VOLUME'))
def scaler(d):
data = pd.DataFrame.copy(d)
print('max_value: ', max_value)
print('max_volume: ', max_volume)
data.iloc[:, :-1] = data.iloc[:,:-1].apply(lambda x: x/max_value)
data.iloc[:, -1] = data.iloc[:,-1].apply(lambda x: x/max_volume)
return data
def decoder(values):
decoded_values = values * max_value
return decoded_values
normalized_data = scaler(the_data)
return normalized_data, scaler, decoder
def preprocessing(data):
# print(data.head(3))
data_0 = create_remove_columns(data)
# print(data_0.head(3))
#todo: save the_scaler somehow to use in new runtimes
norm_data, scaler, decoder = normalize_data(data_0)
# print(norm_data.head(3))
# print(x_train.shape, y_train.shape)
norm_data_array = np.array(norm_data)
return np.expand_dims(norm_data_array, axis=0), decoder
# Model prediction
model = from_pretrained_keras("jsebdev/apple_stock_predictor")
def predict(data):
input, decoder = preprocessing(data)
print("input")
print(input.shape)
result = decoder(model.predict(input))
last_close = data.iloc[-1]['Close']
next_candle = result[0, -1]
print('next_candle')
print(next_candle)
jump = next_candle[0]
next_candle = next_candle + last_close
return (jump, next_candle[0], next_candle[1], next_candle[2], next_candle[3])
def predict_mock(data):
return (0,1,2,3,4)