halme's picture
Update app.py
2c35d30 verified
import os
import gradio as gr
import matplotlib.pyplot as plt
import numpy as np
import hopsworks
from tensorflow.keras.models import load_model
from inference_data_pipeline import InferenceDataPipeline
from sklearn.preprocessing import MinMaxScaler
name_to_ticker = {
"ABB Ltd": "ABB.ST",
"Alfa Laval": "ALFA.ST",
"Assa Abloy B": "ASSA-B.ST",
"Astra Zeneca": "AZN.ST",
"Atlas Copco A": "ATCO-A.ST",
"Atlas Copco B": "ATCO-B.ST",
"Boliden": "BOL.ST",
"Electrolux B": "ELUX-B.ST",
"Ericsson B": "ERIC-B.ST",
"Essity B": "ESSITY-B.ST",
"Evolution": "EVO.ST",
"Getinge B": "GETI-B.ST",
"Hennes & Mauritz B": "HM-B.ST",
"Hexagon AB": "HEXA-B.ST",
"Investor B": "INVE-B.ST",
"Kinnevik B": "KINV-B.ST",
"Nordea Bank Abp": "NDA-SE.ST",
"Sandvik": "SAND.ST",
"Sinch B": "SINCH.ST",
"SEB A": "SEB-A.ST",
"Skanska B": "SKA-B.ST",
"SKF B": "SKF-B.ST",
"SCA B": "SCA-B.ST",
"Svenska Handelsbanken A": "SHB-A.ST",
"Swedbank A": "SWED-A.ST",
"Tele2 B": "TEL2-B.ST",
"Telia": "TELIA.ST",
"Volvo B": "VOLV-B.ST",
}
def predict(stock_name):
ticker = name_to_ticker[stock_name]
# Load the model
project = hopsworks.login(
api_key_value=os.environ['Hopsworks_API_Key'] # For running on Huggingface spaces
)
mr = project.get_model_registry()
model = mr.get_model("FinanceModel", version=11)
saved_model_dir = model.download()
model = load_model(saved_model_dir + "/model.keras")
# Fetch the data used to train the model
time_period_news = "30d"
time_period_price = "3mo" # Needed to make sure we get 30 days of price data. Stock markets are closed on weekends and holidays
data_loader = InferenceDataPipeline(ticker, time_period_news, time_period_price)
data = data_loader.get_data()
# Get the previous closing price
previous_closing_prices = data["Close"].values
data = data[-30:]
# Load the input and output scalers used to train the model
input_scaler = MinMaxScaler()
output_scaler = MinMaxScaler()
# Scale output to specific stock
output_scaler.fit_transform(previous_closing_prices.reshape(-1, 1))
# Scale the data
data = input_scaler.fit_transform(data)
# Format the data to be used by the model. The model expects the data to be in the shape (1, 30, 7)
data = data.reshape(1, 30, 8)
prediction = model.predict(data)
print(f"PREDICTION: {prediction}")
# Inverse the scaling
prediction = output_scaler.inverse_transform(prediction)[0]
# Create the plot
fig, ax = plt.subplots(figsize=(8, 4))
previous_indices = range(len(previous_closing_prices))
ax.plot(
previous_indices,
previous_closing_prices,
label="True Values",
color="blue",
)
predicted_indices = np.arange(
len(previous_closing_prices), len(previous_closing_prices) + len(prediction)
)
ax.plot([previous_indices[-1], predicted_indices[0]], [previous_closing_prices[-1], prediction[0]], color="red")
ax.plot(predicted_indices, prediction, color="red", label="Predicted Values")
ax.axvline(len(previous_closing_prices) - 1, linestyle="--", color="gray", alpha=0.6)
ax.set_title(f"Prediction for {stock_name}")
ax.set_xlabel("Time")
ax.set_ylabel("Price")
ax.legend()
return fig
# Create the Gradio interface
interface = gr.Interface(
fn=predict,
inputs=gr.Dropdown(
label="Stock name",
choices=list(name_to_ticker.keys()),
value="ABB.ST", # Default value
),
outputs=gr.Plot(label="Stock Prediction Plot"),
title="Stock Predictor",
description="Enter the name of a stock to generate a plot showing true values for the past 60 days and the predicted values for the next 5 days.",
)
# Launch the app
if __name__ == "__main__":
interface.launch()