Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| import pickle | |
| import os | |
| from statsmodels.tsa.arima.model import ARIMA | |
| from sklearn.tree import DecisionTreeRegressor | |
| from xgboost import XGBRegressor | |
| # Paths for model directories | |
| arima_models_folder = 'models/arima_Models' | |
| dt_models_folder = 'models/decision_tree_Models' | |
| xgb_models_folder = 'models/xgb_Models' | |
| merged_data = pd.read_csv('./data/merged_data.csv') | |
| # Prepare weekly sales data for top 10 products | |
| top_10_products = merged_data.groupby('StockCode')['Quantity'].sum().nlargest(10).index | |
| weekly_sales = merged_data.groupby(['StockCode', 'Year', 'Week'])['Quantity'].sum().reset_index() | |
| # Load product codes (as an example, you can modify this to load from your source) | |
| product_codes = ['85123A', '85099B', '22197', '84879', '23084', | |
| '21181', '22423', '21212', '20713', '21915'] | |
| # Title of the app | |
| st.title("Sales Forecasting with ARIMA, Decision Tree, and XGBoost") | |
| # Model selection dropdown | |
| model_option = st.selectbox("Select Model", ["ARIMA", "Decision Tree", "XGBoost"]) | |
| # Product selection dropdown | |
| selected_product = st.selectbox("Select Product", product_codes) | |
| # Initialize session state to store forecasts | |
| if 'arima_forecast' not in st.session_state: | |
| st.session_state.arima_forecast = None | |
| if 'dt_forecast' not in st.session_state: | |
| st.session_state.dt_forecast = None | |
| if 'xgb_forecast' not in st.session_state: | |
| st.session_state.xgb_forecast = None | |
| # Forecasting button | |
| if st.button("Forecast"): | |
| if model_option == "ARIMA": | |
| # Load ARIMA model | |
| model_filename = os.path.join(arima_models_folder, f'arima_model_product_{selected_product}.pkl') | |
| with open(model_filename, 'rb') as file: | |
| arima_model = pickle.load(file) | |
| # Forecasting with ARIMA | |
| st.session_state.arima_forecast = arima_model.forecast(steps=15) | |
| st.write(f"ARIMA Forecast for Product {selected_product}:") | |
| st.write(st.session_state.arima_forecast) | |
| # Plot ARIMA results | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| ax.plot(st.session_state.arima_forecast, label='ARIMA Forecast', color='blue') | |
| ax.set_title(f'ARIMA Forecast for Product {selected_product}') | |
| ax.set_xlabel('Weeks') | |
| ax.set_ylabel('Sales Quantity') | |
| ax.legend() | |
| st.pyplot(fig) | |
| elif model_option == "Decision Tree": | |
| # Load Decision Tree model | |
| dt_model_filename = os.path.join(dt_models_folder, f'decision_tree_model_product_{selected_product}.pkl') | |
| with open(dt_model_filename, 'rb') as file: | |
| dt_model = pickle.load(file) | |
| # Prepare input data for Decision Tree | |
| future_weeks = np.array([[2023, week] for week in range(40, 55)]) # Future weeks for prediction | |
| st.session_state.dt_forecast = dt_model.predict(future_weeks) | |
| st.write(f"Decision Tree Forecast for Product {selected_product}:") | |
| st.write(st.session_state.dt_forecast) | |
| # Plot Decision Tree results | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| ax.plot(st.session_state.dt_forecast, label='Decision Tree Forecast', color='green') | |
| ax.set_title(f'Decision Tree Forecast for Product {selected_product}') | |
| ax.set_xlabel('Weeks') | |
| ax.set_ylabel('Sales Quantity') | |
| ax.legend() | |
| st.pyplot(fig) | |
| elif model_option == "XGBoost": | |
| # Load XGBoost model | |
| xgb_model_filename = os.path.join(xgb_models_folder, f'xgb_model_product_{selected_product}.pkl') | |
| with open(xgb_model_filename, 'rb') as file: | |
| xgb_model = pickle.load(file) | |
| # Prepare input data for XGBoost | |
| future_weeks = np.array([[2023, week] for week in range(40, 55)]) # Future weeks for prediction | |
| st.session_state.xgb_forecast = xgb_model.predict(future_weeks) | |
| st.write(f"XGBoost Forecast for Product {selected_product}:") | |
| st.write(st.session_state.xgb_forecast) | |
| # Plot XGBoost results | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| ax.plot(st.session_state.xgb_forecast, label='XGBoost Forecast', color='orange') | |
| ax.set_title(f'XGBoost Forecast for Product {selected_product}') | |
| ax.set_xlabel('Weeks') | |
| ax.set_ylabel('Sales Quantity') | |
| ax.legend() | |
| st.pyplot(fig) | |
| # Comparison button | |
| if st.button("Compare Models"): | |
| # Load and forecast with ARIMA | |
| model_filename_arima = os.path.join(arima_models_folder, f'arima_model_product_{selected_product}.pkl') | |
| with open(model_filename_arima, 'rb') as file: | |
| arima_model = pickle.load(file) | |
| # Prepare input data for ARIMA (you may need to adjust this based on your data structure) | |
| product_sales_series = weekly_sales[weekly_sales['StockCode'] == selected_product].set_index(['Year', 'Week'])['Quantity'] | |
| arima_result = ARIMA(product_sales_series, order=(1, 1, 1)).fit() | |
| st.session_state.arima_forecast = arima_result.forecast(steps=15) | |
| # Load and forecast with Decision Tree | |
| dt_model_filename = os.path.join(dt_models_folder, f'decision_tree_model_product_{selected_product}.pkl') | |
| with open(dt_model_filename, 'rb') as file: | |
| dt_model = pickle.load(file) | |
| # Prepare input data for Decision Tree | |
| future_data = np.array([[2023, week] for week in range(40, 55)]) # Adjust weeks based on your need | |
| st.session_state.dt_forecast = dt_model.predict(future_data) | |
| # Load and forecast with XGBoost | |
| xgb_model_filename = os.path.join(xgb_models_folder, f'xgb_model_product_{selected_product}.pkl') | |
| with open(xgb_model_filename, 'rb') as file: | |
| xgb_model = pickle.load(file) | |
| # Forecast using XGBoost | |
| st.session_state.xgb_forecast = xgb_model.predict(future_data) | |
| # Now plot all the forecasts | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| # ARIMA forecast | |
| if st.session_state.arima_forecast is not None: | |
| ax.plot(st.session_state.arima_forecast, label='ARIMA Forecast', color='blue') | |
| # Decision Tree forecast | |
| if st.session_state.dt_forecast is not None: | |
| ax.plot(st.session_state.dt_forecast, label='Decision Tree Forecast', color='green') | |
| # XGBoost forecast | |
| if st.session_state.xgb_forecast is not None: | |
| ax.plot(st.session_state.xgb_forecast, label='XGBoost Forecast', color='orange') | |
| ax.set_title(f'Comparison of Forecasts for Product {selected_product}') | |
| ax.set_xlabel('Weeks') | |
| ax.set_ylabel('Sales Quantity') | |
| ax.legend() | |
| st.pyplot(fig) | |