Spaces:
Build error
Build error
| import numpy as np | |
| import pandas as pd | |
| import joblib | |
| import matplotlib.pyplot as plt | |
| from tensorflow.keras.models import load_model | |
| from datetime import timedelta | |
| MODEL_PATH = '/home/faizraza/Personal/Projects/SmartWareHouseSystem/models/forecasting_model/Farah_model5.h5' | |
| SCALER_PATH = '/home/faizraza/Personal/Projects/SmartWareHouseSystem/models/forecasting_model/minmax_scaler.pkl' | |
| TIME_STEPS = 30 | |
| DAYS_TO_FORECAST = 30 | |
| PRODUCTS_TO_PLOT = ['Product_1263', 'Product_0374', 'Product_0349', 'Product_0033', 'Product_1341'] | |
| DATA_PATH = '/home/faizraza/Personal/Projects/SmartWareHouseSystem/models/forecasting_model/data_resampled_daily.pkl' | |
| # -------------------------------------------- | |
| def load_scaler_and_model(): | |
| scaler = joblib.load(SCALER_PATH) | |
| model = load_model(MODEL_PATH) | |
| return scaler, model | |
| def create_forecast_input(scaled_data, time_steps=30): | |
| return scaled_data[-time_steps:] | |
| def forecast_future(model, input_seq, time_steps, forecast_days): | |
| forecasted = [] | |
| current_seq = input_seq.copy() | |
| for _ in range(forecast_days): | |
| pred = model.predict(current_seq.reshape(1, time_steps, current_seq.shape[1]), verbose=0) | |
| forecasted.append(pred[0]) | |
| current_seq = np.append(current_seq[1:], [pred[0]], axis=0) | |
| return np.array(forecasted) | |
| def run_inference(data_resampled_daily, forecast_days=DAYS_TO_FORECAST): | |
| scaler, model = load_scaler_and_model() | |
| # Scale data | |
| scaled_data = scaler.transform(data_resampled_daily) | |
| # Prepare input for forecasting | |
| last_input = create_forecast_input(scaled_data, time_steps=TIME_STEPS) | |
| # Forecast | |
| forecast_scaled = forecast_future(model, last_input, TIME_STEPS, forecast_days) | |
| # Inverse scale | |
| forecast = scaler.inverse_transform(forecast_scaled) | |
| # Prepare output DataFrame | |
| forecast_dates = pd.date_range(start=data_resampled_daily.index[-1] + timedelta(days=1), periods=forecast_days) | |
| forecast_df = pd.DataFrame(data=forecast, index=forecast_dates, columns=data_resampled_daily.columns) | |
| return forecast_df | |
| def plot_forecast_vs_actual(actual_df, forecast_df, selected_products=PRODUCTS_TO_PLOT): | |
| plt.figure(figsize=(14, 6)) | |
| for product in selected_products: | |
| if product in actual_df.columns and product in forecast_df.columns: | |
| plt.plot(actual_df.index, actual_df[product], label=f'{product} (Last 30 days)', linestyle='--') | |
| plt.plot(forecast_df.index, forecast_df[product], label=f'{product} (Forecast)', linewidth=2) | |
| plt.title("Last 30 Days vs Forecasted Demand (Next 30 Days)") | |
| plt.xlabel("Date") | |
| plt.ylabel("Order Demand") | |
| plt.legend() | |
| plt.tight_layout() | |
| plt.show() | |
| if __name__ == "__main__": | |
| # Load historical resampled daily data | |
| historical_df = pd.read_pickle(DATA_PATH) | |
| # Extract last 30 days of actual data | |
| actual_last_30 = historical_df[-30:] | |
| # Run inference to forecast next 30 days | |
| forecast_df = run_inference(historical_df) | |
| # Plot both actual and forecast | |
| plot_forecast_vs_actual(actual_last_30, forecast_df) | |
| # Optional: Save forecast to CSV | |
| forecast_df.to_csv("forecast_next_30_days.csv") | |