Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
from keras.models import load_model | |
from sklearn.preprocessing import MinMaxScaler | |
from sklearn.metrics import mean_squared_error, r2_score | |
import yfinance as yf | |
import matplotlib.pyplot as plt | |
from datetime import datetime | |
st.sidebar.title("Stock Price Prediction App π") | |
st.sidebar.subheader("About the Developer") | |
st.sidebar.markdown( | |
"Developed by [Tajeddine Bourhim ](https://tajeddine-portfolio.netlify.app/)." | |
) | |
st.sidebar.markdown( | |
"[](https://github.com/scorpionTaj)" | |
) | |
st.sidebar.markdown( | |
"[](https://www.linkedin.com/in/tajeddine-bourhim/)" | |
) | |
st.sidebar.subheader("π About This App") | |
st.sidebar.markdown( | |
"This is a stock price prediction app that uses a Long Short-Term Memory (LSTM) neural network to predict the closing price of a stock. The app uses the Yahoo Finance API to fetch the stock data." | |
) | |
stock = st.text_input("Enter the stock symbol (e.g. AAPL):") | |
if stock: | |
end = st.date_input("End Date", datetime.now()) | |
start = st.date_input("Start Date", datetime(end.year - 20, end.month, end.day)) | |
apple_data = yf.download(stock, start, end) | |
if not apple_data.empty: | |
model = load_model("Latest_stock_price_prediction.keras") | |
st.subheader("π Stock Data") | |
st.write(apple_data) | |
else: | |
st.error("No data found for the given stock symbol.") | |
else: | |
st.warning("Please enter a stock symbol.") | |
split_len = int(len(apple_data) * 0.8) | |
x_test = pd.DataFrame(apple_data.Close[split_len:]) | |
def graph_plotting(figsize, values, data, extra_data=0, extra_dataset=None): | |
""" | |
Function to plot graphs with given parameters. | |
""" | |
fig = plt.figure(figsize=figsize) | |
plt.plot(values, "Red") | |
plt.plot(data.Close, "b") | |
if extra_data: | |
plt.plot(extra_dataset) | |
return fig | |
try: | |
# Display the original close price and moving average for 250 days | |
st.subheader("π Original Close Price and 250-Day Moving Average") | |
apple_data["MA_for_250_days"] = apple_data.Close.rolling(250).mean() | |
st.pyplot(graph_plotting((15, 6), apple_data["MA_for_250_days"], apple_data, 0)) | |
# Display the original close price and moving average for 200 days | |
st.subheader("π Original Close Price and 200-Day Moving Average") | |
apple_data["MA_for_200_days"] = apple_data.Close.rolling(200).mean() | |
st.pyplot(graph_plotting((15, 6), apple_data["MA_for_200_days"], apple_data, 0)) | |
# Display the original close price and moving average for 100 days | |
st.subheader("π Original Close Price and 100-Day Moving Average") | |
apple_data["MA_for_100_days"] = apple_data.Close.rolling(100).mean() | |
st.pyplot(graph_plotting((15, 6), apple_data["MA_for_100_days"], apple_data, 0)) | |
# Display the original close price and moving average for 100 days and 250 days | |
st.subheader("π Original Close Price and 100-Day and 250-Day Moving Average") | |
st.pyplot( | |
graph_plotting( | |
(15, 6), | |
apple_data["MA_for_100_days"], | |
apple_data, | |
1, | |
apple_data["MA_for_250_days"], | |
) | |
) | |
scaler = MinMaxScaler(feature_range=(0, 1)) | |
scaled_data = scaler.fit_transform(x_test[["Close"]]) | |
x_data = [] | |
y_data = [] | |
for i in range(100, len(scaled_data)): | |
x_data.append(scaled_data[i - 100 : i]) | |
y_data.append(scaled_data[i]) | |
x_data, y_data = np.array(x_data), np.array(y_data) | |
predictions = model.predict(x_data) | |
# Inverse transform the predictions and test data to original scale | |
inv_pre = scaler.inverse_transform(predictions) | |
inv_y_test = scaler.inverse_transform(y_data) | |
# Create a DataFrame to hold the original test data and predictions | |
ploting_data = pd.DataFrame( | |
{ | |
"original_test_data": inv_y_test.reshape(-1), | |
"predictions": inv_pre.reshape(-1), | |
}, | |
index=apple_data.index[split_len + 100 :], | |
) | |
# Display the original values vs predicted values | |
st.subheader("π Original values vs Predicted values") | |
st.write(ploting_data) | |
# Plot the original close price vs predicted close price | |
st.subheader("π Original Close Price vs Predicted Close price") | |
fig = plt.figure(figsize=(15, 6)) | |
plt.plot(pd.concat([apple_data.Close[: split_len + 100], ploting_data], axis=0)) | |
plt.legend(["Data- not used", "Original Test data", "Predicted Test data"]) | |
st.pyplot(fig) | |
# Calculate and display performance metrics | |
mse = mean_squared_error(inv_y_test, inv_pre) | |
r2 = r2_score(inv_y_test, inv_pre) | |
st.subheader("π Performance Metrics") | |
st.write(f"Mean Squared Error: {mse}") | |
st.write(f"R-squared: {r2}") | |
except Exception as e: | |
st.error(f"An error occurred: {e}") | |