Johan713 commited on
Commit
bf56cf6
·
verified ·
1 Parent(s): 11c4092

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -4
app.py CHANGED
@@ -113,10 +113,37 @@ class StockPredictor:
113
 
114
  return mse, mape, rmse
115
 
116
- def cross_validate_model(self):
117
- df_cv = cross_validation(self.model, initial='730 days', period='180 days', horizon='90 days')
118
- df_p = performance_metrics(df_cv)
119
- return df_p
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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")