faizrazadec's picture
Upload 3430 files
20dc157 verified
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")