Forecast module

Important

This module is only available in the Enterprise Edition.

This module provides the functionality to manage the forecasted customer demand.

Forecasting process

It provides the following capabilities to support the forecasting process in your company:

  • Statistical forecast calculation to extrapolate historical demand into the future
    A first step in the process is to collect the historical demand and run a time series analysis to predict the future demand.

    FrePPLe implements the following classic time series methods:

    • Single exponential smoothing, which is applicable for constant demands
    • Double exponential smoothing, which is applicable for trended demands
    • Holt-Winter’s exponential smoothing with mutiplicative seasonality, which is applicable for seasonal demands
    • Croston’s method, which is applicable for intermittent demand (i.e. demand patterns with a lot of zero demand buckets)
    • Moving average, which is applicable when there is little demand history

    The algorithm will automatically tune the parameters of each of these methods to minimize the forecast error.

    During the calculation the algorithm scans for exceptional demand outliers, and filter them out from the demand history.

    The algorithm also automatically selects the most appropriate forecasting method. The user has the ability to override this automatic selection.

    The statistical base forecast is normally computed in batch mode.

  • Forecast review and manual corrections
    In a second step users will review the statistical forecast proposed by the system. Users have the ability to override the forecast, and apply their business knowledge (eg new products, products phasing out, promotions, competition, etc…) to come up with the final sales forecast.

    See forecast report.

    The process of reviewing the sales forecast is typically a weekly or monthly process, involving both the sales and production departments.

  • Preprocess the sales forecast for production planning
    The sales forecast needs some preprocessing to make it suitable for the production planning.
    • Profiling the forecast in smaller time buckets
      This functionality allows to translate between different time granularities.
      The forecast entered by the sales department could for instance be in monthly buckets, while the manufacturing department requires the forecast to be in weekly or even daily buckets to generate accurate manufacturing and procurement plans.
      Another usage is to model a delivery date profile of the customers. Each bucket has a weight that is used to model situations where the demand is not evenly spread across buckets: e.g. when more orders are expected due on a monday than on a friday, or when a peak of orders is expected for delivery near the end of a month.
    • Consuming/netting the forecast with actual sales orders
      As customer orders are being received they need to be deducted from the forecast to avoid double-counting it.
      For example, assume the forecast for customer A in January is 100 pieces, and we have already received orders of 20 from the customer. Without the forecast netting the demand in January would be 120 pieces, which is (very likely) not correct.
      The netting solver will deduct the orders of 20 from the forecast. The total demand that is planned in January will then be equal to 100: 80 remaining net forecast + 20 orders.
      The netting algorithm has logic to match a demand with the most appropriate forecast at the right level in the customer and product hierarchies, and it can also consider netting in previous and subsequent time buckets.
    This process step is recalculated as part of the production plan generation.

Module configuration

The module support the following configuration parameters:

  • DueWithinBucket:
    Specifies whether forecasted demand is due at the ‘start’, ‘middle’ or ‘end’ of the bucket.
    Using the middle of the bucket gives the most realistic approximation and is the recommended default value.
    Using the start date of the bucket is a more conservative setting: it assures that all forecast supply is already available at the start of the month.
  • Net_CustomerThenItemHierarchy:
    As part of the forecast netting a demand is assiociated with a certain forecast. When no matching forecast is found for the customer and item of the demand, frePPLe looks for forecast at higher level customers and items.
    This flag allows us to control whether we first search the customer hierarchy and then the item hierarchy, or the other way around.
    The default value is true, ie search higher customer levels before searching higher levels of the item.
  • Net_MatchUsingDeliveryOperation:
    Specifies whether or not a demand and a forecast require to have the same delivery operation to be a match.
    The default value is true.
  • Net_NetEarly:
    Defines how much time before the due date of an order we are allowed to search for a forecast bucket to net from.
    The default value is 0, meaning that we can net only from the bucket where the demand is due.
  • Net_NetLate:
    Defines how much time after the due date of an order we are allowed to search for a forecast bucket to net from.
    The default value is 0, meaning that we can net only from the bucket where the demand is due.
  • Forecast_Iterations:
    Specifies the maximum number of iterations allowed for a forecast method to tune its parameters.
    Only positive values are allowed and the default value is 10.
    Set the parameter to 1 to disable the tuning and generate a forecast based on the user-supplied parameters.
  • Forecast_smapeAlfa:
    Specifies how the sMAPE forecast error is weighted for different time buckets. The sMPAPE value in the most recent bucket is 1.0, and the weight decreases exponentially for earlier buckets.
    Acceptable values are in the interval 0.5 and 1.0, and the default is 0.95.
  • Forecast_Skip:
    Specifies the number of time series values used to initialize the forecasting method. The forecast error in these bucket isn’t counted.
  • Forecast_MovingAverage_buckets:
    This parameter controls the number of buckets to be averaged by the moving average forecast method.
  • Forecast_SingleExponential_initialAlfa, Forecast_SingleExponential_minAlfa, Forecast_SingleExponential_maxAlfa:
    Specifies the initial value and the allowed range of the smoothing parameter in the single exponential forecasting method.
    The allowed range is between 0 and 1. Values lower than about 0.05 are not advisable.
  • Forecast_DoubleExponential_initialAlfa, Forecast_DoubleExponential_minAlfa, Forecast_DoubleExponential_maxAlfa:
    Specifies the initial value and the allowed range of the smoothing parameter in the double exponential forecasting method.
    The allowed range is between 0 and 1. Values lower than about 0.05 are not advisible.
  • Forecast_DoubleExponential_initialGamma, Forecast_DoubleExponential_minGamma, Forecast_DoubleExponential_maxGamma:
    Specifies the initial value and the allowed range of the trend smoothing parameter in the double exponential forecasting method.
    The allowed range is between 0 and 1.
  • Forecast_DoubleExponential_dampenTrend:
    Specifies how the trend is dampened for future buckets.
    The allowed range is between 0 and 1, and the default value is 0.8.
  • Forecast_Seasonal_initialAlfa, Forecast_Seasonal_minAlfa, Forecast_Seasonal_maxAlfa:
    Specifies the initial value and the allowed range of the smoothing parameter in the seasonal forecasting method.
    The allowed range is between 0 and 1. Values lower than about 0.05 are not advisible.
  • Forecast_Seasonal_initialBeta, Forecast_Seasonal_minBeta, Forecast_Seasonal_maxBeta:
    Specifies the initial value and the allowed range of the trend smoothing parameter in the seasonal forecasting method.
    The allowed range is between 0 and 1.
  • Forecast_Seasonal_initialGamma, Forecast_Seasonal_minGamma, Forecast_Seasonal_maxGamma:
    Specifies the initial value and the allowed range of the seasonal smoothing parameter in the seasonal forecasting method.
    The allowed range is between 0 and 1.
  • Forecast_Seasonal_minPeriod, Forecast_Seasonal_maxPeriod:
    Specifies the periodicity of the seasonal cycles to check for.
    The interval of cycles we try to detect should be broad enough. For instance, if we expect to find a yearly cycle use a minimum period of 10 and maximum period of 14.
  • Forecast_Seasonal_dampenTrend:
    Specifies how the trend is dampened for future buckets.
    The allowed range is between 0 and 1, and the default value is 0.8.
  • Forecast_Croston_initialAlfa, Forecast_Croston_minAlfa, Forecast_Croston_maxAlfa:
    Specifies the initial value and the allowed range of the smoothing parameter in the Croston forecasting method.
    The allowed range is between 0 and 1. Values lower than about 0.05 are not advisable.
  • Forecast_Croston_minIntermittence:
    Minimum intermittence (defined as the percentage of zero demand buckets) before the Croston method is applied.
    When the intermittence exceeds this value, only Croston and moving average are considered suitable forecast methods.
    The default value is 0.33.

Example Python code

Adding or changing a forecast

it = frepple.item(name="item")
cust = frepple.customer(name="customer")
cal = frepple.calendar(name="planningbuckets")
fcst = frepple.demand_forecast(name="My forecast",
  item=it, customer=cust, calendar=cal)

Loading the module

frepple.loadmodule("mod_forecast.so",
   Net_CustomerThenItemHierarchy=True,
   Net_MatchUsingDeliveryOperation=True,
   Net_NetEarly="P7D",
   Net_NetLate="P7D")

Creating a time series forecast

# The first argument is the demand history in previous buckets.
# The second argument are the time buckets where we want to create a forecast value.
thebuckets = [ i.start for i in thecalendar.buckets ]
fcst.timeseries([10,12,9,11,8,15,19,11], thebuckets)

Netting customer orders from the forecast

frepple_forecast.solver_forecast(name="Netting", loglevel=1).solve()