JayLacoma's picture
Rename Stock_Market_Forecast.py to app.py
4f45de5 verified
raw
history blame
3.5 kB
# %%
import gradio as gr
import pandas as pd
import numpy as np
import yfinance as yf
from prophet import Prophet
import matplotlib.pyplot as plt
import io
from PIL import Image
from datetime import datetime
import plotly.express as px # Make sure plotly.express is imported
import warnings
# Suppress specific FutureWarnings
warnings.simplefilter(action='ignore', category=FutureWarning)
def stock_forecast(ticker, start_date='2022-01-01', end_date=None):
# Set end_date to today's date if not provided
if end_date is None:
end_date = datetime.today().strftime('%Y-%m-%d')
# Download stock market data
df = yf.download(ticker, start=start_date, end=end_date)
# Reset the index to get 'Date' back as a column
df_plot = df.reset_index()
# Prepare the data for Prophet
df1 = df_plot[['Date', 'Close']].rename(columns={'Date': 'ds', 'Close': 'y'})
# Fit the model
m = Prophet()
m.fit(df1)
# Create future dataframe and make predictions
future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)
# Plotting stock closing prices
fig1 = px.line(df1.tail(90), x="ds", y="y", title='Stock Closing Prices by Date')
fig1.update_layout(
plot_bgcolor='black',
paper_bgcolor='black',
font=dict(color='white')
)
# Plotting forecast
forecast_40 = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(40)
fig2 = px.line(forecast_40, x="ds", y=['yhat', 'yhat_lower', 'yhat_upper'], title=f'{ticker} 30 Days Forecast')
fig2.update_layout(
plot_bgcolor='black',
paper_bgcolor='black',
font=dict(color='white')
)
# Customizing Matplotlib plot for forecast components
plt.style.use('dark_background') # Use dark background style
# Plot the components of the forecast using Matplotlib
fig, ax = plt.subplots(figsize=(10, 8))
m.plot_components(forecast)
# Apply customizations to the plot
for line in ax.get_lines():
line.set_color('purple') # Set line color to purple
ax.set_facecolor('black') # Set background color of the axes to black
fig.patch.set_facecolor('black') # Set background color of the figure to black
# Save the plot to a BytesIO object
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
plt.close(fig)
# Convert the image to a PIL Image
img = Image.open(buf)
return fig1, fig2, img
# %%
# Create Gradio interface
interface = gr.Interface(
fn=stock_forecast, # Function to run
inputs=[gr.Textbox(label="Enter Stock Ticker", value="NVDA"), # Input: stock ticker
gr.Textbox(label="Enter Start Date (YYYY-MM-DD)", value="2022-01-01"), # Input: start date
gr.Textbox(label="Enter End Date (YYYY-MM-DD)", value=datetime.today().strftime('%Y-%m-%d'))], # Input: end date
outputs=[gr.Plot(label="Stock Closing Prices"), # Output: Plotly chart
gr.Plot(label="30 Days Forecast"),
gr.Image(label="Forecast Components")], # Output: Image
title="Stock Market Forecast",
description="Enter a stock ticker symbol, a start date, and an end date (in YYYY-MM-DD format) to view the historical closing prices, a 30-day forecast, and the forecast components."
)
# Launch the Gradio app
interface.launch()