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")
|