abhi.2000 / app.py
Abhisesh7's picture
Update app.py
b131992 verified
raw
history blame
3.99 kB
import numpy as np
import pandas as pd
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
import gradio as gr
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
# Fetch historical stock data
def fetch_data(ticker, start_date, end_date):
data = yf.download(ticker, start=start_date, end=end_date)
return data
# Preprocess data
def preprocess_data(data):
# Use only the 'Close' prices for prediction
data = data[['Close']]
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
# Prepare training data
x_train, y_train = [], []
for i in range(60, len(scaled_data)):
x_train.append(scaled_data[i-60:i, 0])
y_train.append(scaled_data[i, 0])
x_train, y_train = np.array(x_train), np.array(y_train)
# Reshape for LSTM [samples, time steps, features]
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
return x_train, y_train, scaler
# Build the LSTM model
def build_model():
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(60, 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=25))
model.add(Dense(units=1)) # Output layer for price prediction
model.compile(optimizer='adam', loss='mean_squared_error')
return model
# Train the model
def train_model(ticker, start_date, end_date):
data = fetch_data(ticker, start_date, end_date)
x_train, y_train, scaler = preprocess_data(data)
model = build_model()
model.fit(x_train, y_train, batch_size=1, epochs=1)
return model, scaler, data
# Predict the stock price for tomorrow
def predict_next_day(model, scaler, data):
last_60_days = data['Close'][-60:].values
last_60_days_scaled = scaler.transform(last_60_days.reshape(-1, 1))
x_test = []
x_test.append(last_60_days_scaled)
x_test = np.array(x_test)
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
predicted_price = model.predict(x_test)
predicted_price = scaler.inverse_transform(predicted_price) # Convert back to original scale
return predicted_price[0][0]
# Create a graph of historical and predicted prices
def create_graph(data, predicted_price):
plt.figure(figsize=(14, 5))
plt.plot(data.index, data['Close'], label='Historical Prices', color='blue')
tomorrow = datetime.now() + timedelta(days=1)
plt.scatter(tomorrow, predicted_price, label='Predicted Price for Tomorrow', color='red')
plt.title('Stock Price Prediction')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('/mnt/data/stock_prediction_graph.png') # Save the graph
plt.close()
# Gradio Interface
def stock_prediction_app(ticker, start_date, end_date):
model, scaler, data = train_model(ticker, start_date, end_date)
predicted_price = predict_next_day(model, scaler, data)
create_graph(data, predicted_price)
return f'The predicted stock price for tomorrow is ${predicted_price:.2f}', '/mnt/data/stock_prediction_graph.png'
# Stock tickers for dropdown
stock_tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'FB', 'TSLA', 'NFLX', 'NVDA', 'INTC', 'AMD']
# Create Gradio Interface
ticker_input = gr.Dropdown(choices=stock_tickers, label="Select Stock Ticker")
start_date_input = gr.Date(label="Start Date") # Corrected date input
end_date_input = gr.Date(label="End Date") # Corrected date input
iface = gr.Interface(
fn=stock_prediction_app,
inputs=[ticker_input, start_date_input, end_date_input],
outputs=["text", "image"],
title="Stock Price Prediction App",
description="Predict tomorrow's stock price based on historical data.",
)
iface.launch()