Update app.py
Browse files
app.py
CHANGED
@@ -113,10 +113,37 @@ class StockPredictor:
|
|
113 |
|
114 |
return mse, mape, rmse
|
115 |
|
116 |
-
def cross_validate_model(self):
|
117 |
-
|
118 |
-
|
119 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
|
121 |
def fetch_stock_data(ticker):
|
122 |
try:
|
@@ -319,6 +346,15 @@ def test_model():
|
|
319 |
cv_results = predictor.cross_validate_model()
|
320 |
st.dataframe(cv_results)
|
321 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
322 |
# Feature importance
|
323 |
st.subheader("Feature Importance")
|
324 |
feature_importance = pd.DataFrame(predictor.model.params['regressor_coefficients'].items(), columns=['Feature', 'Importance'])
|
@@ -331,6 +367,8 @@ def test_model():
|
|
331 |
st.error("Failed to generate predictions. The predicted data is None.")
|
332 |
else:
|
333 |
st.error("Failed to train the Prophet model. Please try a different dataset.")
|
|
|
|
|
334 |
|
335 |
def predict_stock_prices():
|
336 |
st.header("Predict Stock Prices with Enhanced Model")
|
|
|
113 |
|
114 |
return mse, mape, rmse
|
115 |
|
116 |
+
def cross_validate_model(self, n_splits=5):
|
117 |
+
tscv = TimeSeriesSplit(n_splits=n_splits)
|
118 |
+
cv_results = []
|
119 |
+
|
120 |
+
for train_index, test_index in tscv.split(self.data):
|
121 |
+
train_data = self.data.iloc[train_index]
|
122 |
+
test_data = self.data.iloc[test_index]
|
123 |
+
|
124 |
+
# Train the model
|
125 |
+
model = Prophet()
|
126 |
+
model.fit(train_data)
|
127 |
+
|
128 |
+
# Make predictions
|
129 |
+
future = model.make_future_dataframe(periods=len(test_data))
|
130 |
+
forecast = model.predict(future)
|
131 |
+
|
132 |
+
# Calculate metrics
|
133 |
+
y_true = test_data['y'].values
|
134 |
+
y_pred = forecast['yhat'].tail(len(test_data)).values
|
135 |
+
|
136 |
+
mse = mean_squared_error(y_true, y_pred)
|
137 |
+
rmse = np.sqrt(mse)
|
138 |
+
mape = mean_absolute_percentage_error(y_true, y_pred)
|
139 |
+
|
140 |
+
cv_results.append({
|
141 |
+
'mse': mse,
|
142 |
+
'rmse': rmse,
|
143 |
+
'mape': mape
|
144 |
+
})
|
145 |
+
|
146 |
+
return pd.DataFrame(cv_results)
|
147 |
|
148 |
def fetch_stock_data(ticker):
|
149 |
try:
|
|
|
346 |
cv_results = predictor.cross_validate_model()
|
347 |
st.dataframe(cv_results)
|
348 |
|
349 |
+
# Calculate and display average metrics
|
350 |
+
avg_mse = cv_results['mse'].mean()
|
351 |
+
avg_rmse = cv_results['rmse'].mean()
|
352 |
+
avg_mape = cv_results['mape'].mean()
|
353 |
+
|
354 |
+
st.write(f"Average MSE: {avg_mse:.4f}")
|
355 |
+
st.write(f"Average RMSE: {avg_rmse:.4f}")
|
356 |
+
st.write(f"Average MAPE: {avg_mape:.4f}")
|
357 |
+
|
358 |
# Feature importance
|
359 |
st.subheader("Feature Importance")
|
360 |
feature_importance = pd.DataFrame(predictor.model.params['regressor_coefficients'].items(), columns=['Feature', 'Importance'])
|
|
|
367 |
st.error("Failed to generate predictions. The predicted data is None.")
|
368 |
else:
|
369 |
st.error("Failed to train the Prophet model. Please try a different dataset.")
|
370 |
+
else:
|
371 |
+
st.error("Failed to fetch stock data. Please try again.")
|
372 |
|
373 |
def predict_stock_prices():
|
374 |
st.header("Predict Stock Prices with Enhanced Model")
|