enacimie commited on
Commit
f5aed0c
·
verified ·
1 Parent(s): 9e28cdd

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +91 -1
src/streamlit_app.py CHANGED
@@ -272,4 +272,94 @@ if forecast is not None:
272
  # Metrics
273
  mae = mean_absolute_error(test, forecast)
274
  mse = mean_squared_error(test, forecast)
275
- rm
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
272
  # Metrics
273
  mae = mean_absolute_error(test, forecast)
274
  mse = mean_squared_error(test, forecast)
275
+ rmse = np.sqrt(mse)
276
+
277
+ st.subheader("📈 Forecast Results")
278
+ col1, col2, col3 = st.columns(3)
279
+ col1.metric("MAE", f"{mae:.2f}")
280
+ col2.metric("MSE", f"{mse:.2f}")
281
+ col3.metric("RMSE", f"{rmse:.2f}")
282
+
283
+ # Plot forecast vs actual
284
+ fig = go.Figure()
285
+ fig.add_trace(go.Scatter(x=train.index, y=train, mode='lines', name='Training', line=dict(color='blue')))
286
+ fig.add_trace(go.Scatter(x=test.index, y=test, mode='lines', name='Actual', line=dict(color='green')))
287
+ fig.add_trace(go.Scatter(x=test.index, y=forecast, mode='lines+markers', name='Forecast', line=dict(color='red', dash='dash')))
288
+ fig.update_layout(
289
+ title=f"{model_choice} Forecast",
290
+ xaxis_title="Date",
291
+ yaxis_title=value_col,
292
+ legend=dict(x=0, y=1)
293
+ )
294
+ st.plotly_chart(fig, use_container_width=True)
295
+
296
+ # Allow forecasting into future
297
+ st.subheader("🔮 Forecast Future Periods")
298
+ future_periods = st.number_input("Number of future periods to forecast:", min_value=1, max_value=365, value=30, step=1)
299
+
300
+ if st.button("🚀 Generate Future Forecast"):
301
+ try:
302
+ if model_choice == "Holt-Winters Exponential Smoothing":
303
+ future_forecast = model.forecast(future_periods)
304
+ last_date = ts.index[-1]
305
+ if freq == 'D':
306
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=future_periods, freq='D')
307
+ elif freq == 'W':
308
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(weeks=1), periods=future_periods, freq='W')
309
+ elif freq == 'M':
310
+ future_dates = pd.date_range(start=last_date + pd.DateOffset(months=1), periods=future_periods, freq='M')
311
+ else:
312
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=future_periods, freq='D')
313
+
314
+ elif model_choice == "ARIMA":
315
+ future_forecast = model.forecast(future_periods)
316
+ last_date = ts.index[-1]
317
+ if freq == 'D':
318
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=future_periods, freq='D')
319
+ elif freq == 'W':
320
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(weeks=1), periods=future_periods, freq='W')
321
+ elif freq == 'M':
322
+ future_dates = pd.date_range(start=last_date + pd.DateOffset(months=1), periods=future_periods, freq='M')
323
+ else:
324
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=future_periods, freq='D')
325
+
326
+ elif model_choice == "Prophet":
327
+ last_date = ts.index[-1]
328
+ if freq == 'D':
329
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=future_periods, freq='D')
330
+ elif freq == 'W':
331
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(weeks=1), periods=future_periods, freq='W')
332
+ elif freq == 'M':
333
+ future_dates = pd.date_range(start=last_date + pd.DateOffset(months=1), periods=future_periods, freq='M')
334
+ else:
335
+ future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=future_periods, freq='D')
336
+
337
+ future_df = pd.DataFrame({'ds': future_dates})
338
+ forecast_df = model.predict(future_df)
339
+ future_forecast = forecast_df['yhat'].values
340
+
341
+ # Plot future forecast
342
+ fig_future = go.Figure()
343
+ fig_future.add_trace(go.Scatter(x=ts.index, y=ts.values, mode='lines', name='Historical', line=dict(color='blue')))
344
+ fig_future.add_trace(go.Scatter(x=future_dates, y=future_forecast, mode='lines+markers', name='Future Forecast', line=dict(color='red', dash='dash')))
345
+ fig_future.update_layout(
346
+ title="Future Forecast",
347
+ xaxis_title="Date",
348
+ yaxis_title=value_col
349
+ )
350
+ st.plotly_chart(fig_future, use_container_width=True)
351
+
352
+ # Show as table
353
+ forecast_df = pd.DataFrame({
354
+ 'Date': future_dates,
355
+ 'Forecast': future_forecast
356
+ })
357
+ with st.expander("📋 View Forecast Table"):
358
+ st.dataframe(forecast_df)
359
+
360
+ except Exception as e:
361
+ st.error(f"Could not generate future forecast: {e}")
362
+
363
+ # Footer
364
+ st.markdown("---")
365
+ st.caption(f"© {AUTHOR} | License {LICENSE} | Contact: {EMAIL}")