micmic0o0's picture
app.py
cb6c488 verified
import gradio as gr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
def forecast_stock(file, model_choice="ARIMA", horizon=30):
df = pd.read_csv(file, parse_dates=["Date"])
df = df.set_index("Date").asfreq("B")
df["Aclose"] = df["Aclose"].interpolate()
series = df["Aclose"].dropna()
if model_choice == "ARIMA":
model = ARIMA(series, order=(2,1,2))
model_fit = model.fit()
forecast = model_fit.forecast(steps=horizon)
else: # LSTM
scaler = MinMaxScaler()
data = scaler.fit_transform(series.values.reshape(-1,1))
X, y = [], []
seq_len = 60
for i in range(len(data)-seq_len):
X.append(data[i:i+seq_len])
y.append(data[i+seq_len])
X, y = np.array(X), np.array(y)
model = Sequential([
LSTM(50, input_shape=(seq_len,1)),
Dense(1)
])
model.compile(optimizer="adam", loss="mse")
model.fit(X, y, epochs=3, batch_size=32, verbose=0)
# Forecast
last_seq = data[-seq_len:].reshape(1,seq_len,1)
preds = []
for _ in range(horizon):
p = model.predict(last_seq, verbose=0)[0,0]
preds.append(p)
last_seq = np.append(last_seq[:,1:,:], [[[p]]], axis=1)
forecast = scaler.inverse_transform(np.array(preds).reshape(-1,1)).flatten()
# Plot results
plt.figure(figsize=(10,5))
plt.plot(series[-200:], label="History")
plt.plot(pd.date_range(series.index[-1], periods=horizon+1, freq="B")[1:], forecast, label="Forecast")
plt.legend()
plt.title(f"{model_choice} Stock Forecast")
plt.xlabel("Date")
plt.ylabel("Price")
plt.tight_layout()
return plt
demo = gr.Interface(
fn=forecast_stock,
inputs=[
gr.File(label="Upload Stock CSV"),
gr.Radio(["ARIMA","LSTM"], value="ARIMA", label="Model"),
gr.Slider(5,60,step=5,label="Forecast Horizon (days)")
],
outputs=gr.Plot(label="Forecast Plot"),
title="📈 Stock Price Forecasting",
description="Upload stock data (CSV with Date,Aclose). Choose ARIMA or LSTM."
)
if __name__ == "__main__":
demo.launch()