File size: 2,837 Bytes
0048da4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41ce399
0048da4
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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 tensorflow import keras  # Use full TensorFlow Keras for custom_objects
import joblib
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')

# Load your saved models/data (upload these files to Colab if needed via !wget or upload)
arima_model = ARIMA(pd.read_pickle('final_df.pkl')['Target'].tail(750), order=(5,1,0)).fit()  # Re-fit or load saved

# Fixed: Load LSTM with custom_objects to resolve 'mse' deserialization issue
lstm_model = keras.models.load_model('lstm_model.h5', 
                                     custom_objects={'mse': keras.losses.MeanSquaredError()})

target_scaler = joblib.load('target_scaler.pkl')
final_df = pd.read_pickle('final_df.pkl')

def forecast_aapl(start_date_str, model_type='LSTM', days=30):
    try:
        start_date = pd.to_datetime(start_date_str)
        # Simple forecast logic (adapt from your notebook)
        if model_type == 'ARIMA':
            forecast = arima_model.forecast(steps=days)
        else:  # LSTM
            # Use last window for input (simplified)
            recent_data = final_df.tail(30).values  # n_lags=30
            X_input = recent_data.reshape(1, 30, recent_data.shape[1])
            preds_scaled = lstm_model.predict(X_input)[0][0]
            forecast = np.full(days, target_scaler.inverse_transform([[preds_scaled]])[0][0])  # Placeholder; extend for multi-step

        future_dates = pd.date_range(start=start_date, periods=days, freq='D')
        results_df = pd.DataFrame({'Date': future_dates, 'Forecast': forecast})

        # Plot
        fig, ax = plt.subplots(figsize=(10, 5))
        ax.plot(results_df['Date'], results_df['Forecast'], marker='o', label=f'{model_type} Forecast')
        ax.set_title(f'AAPL {days}-Day Forecast from {start_date_str}')
        ax.set_xlabel('Date')
        ax.set_ylabel('Price ($)')
        ax.legend()
        ax.grid(True)
        plt.xticks(rotation=45)
        plt.tight_layout()
        return fig, results_df.to_string(index=False)
    except Exception as e:
        return None, f"Error: {str(e)}"

# Gradio interface
iface = gr.Interface(
    fn=forecast_aapl,
    inputs=[
        gr.Textbox(label="Start Date (YYYY-MM-DD)", value="2020-03-01"),
        gr.Dropdown(choices=['LSTM', 'ARIMA'], label="Model", value='LSTM'),
        gr.Slider(1, 90, value=30, label="Forecast Days")
    ],
    outputs=[gr.Plot(label="Forecast Plot"), gr.Textbox(label="Forecast Table")],
    title="AAPL Stock Price Forecaster",
    description="Enter a start date to get future AAPL price forecasts using ARIMA or LSTM."
)

# Launch locally first (test in Colab)
iface.launch(share=True, debug=True)  # This gives a public link for testing