Skip to content

Workforce Demand Forecasting

The Workforce Demand Forecasting model predicts the number of field crew hours required across skill categories over an 18-month forward horizon. It uses a Prophet + XGBoost ensemble architecture, with Prophet modelling temporal structure (trend, seasonality) and XGBoost modelling exogenous business drivers (capex programs, vegetation seasons, storm events).

# Ensemble structure
class WorkforceForecastEnsemble:
"""
Stage 1: Prophet models temporal patterns
Stage 2: XGBoost models residuals using exogenous features
Final: Blend Prophet base + XGBoost adjustment
"""
def __init__(self):
self.prophet_models = {} # One per skill category
self.xgb_models = {} # One per skill category
self.blend_weights = {} # Learned blending weights
def predict(self, horizon_months: int, exog_features: dict) -> pd.DataFrame:
prophet_forecast = self.prophet_predict(horizon_months)
xgb_adjustment = self.xgb_predict(exog_features)
return prophet_forecast + xgb_adjustment
MetricValueNotes
MAE124 crew-hours/monthAbsolute error per skill category
MAPE4.2%Percentage error
Forecast horizon18 monthsBeyond 12 months, interval widens significantly
Update frequencyMonthlyRetrains on full history + new actuals

The Prophet base model captures:

Workforce requirements grow with network expansion (capex programs, DER connections). The trend is modelled as a piecewise linear function with change points at regulatory period boundaries.

  • Summer peak (Nov–Feb): +35–80% above base for vegetation clearance during bushfire season
  • Autumn taper (Mar–Apr): +15% above base for post-summer remediation
  • Winter base (May–Aug): lowest demand, focus on planned asset replacement
  • Spring ramp (Sep–Oct): pre-season vegetation clearance preparation
  • Monday: peak of planned work (fresh week)
  • Friday: reduced (most crews return to depot)
  • Saturday/Sunday: emergency response only (small baseline)
FeatureLagDescription
approved_capex_qtr0Approved capex for next quarter ($M)
vegetation_program_km0Planned vegetation clearance km
scheduled_replacements0Count of scheduled asset replacements
storm_season_flag0Binary: Oct–Mar bushfire/storm season
public_holiday_density0Number of public holidays in month
prior_month_actual1Prior month actual crew-hours (lag 1)
prior_year_actual12Same month prior year (lag 12)

The model produces separate forecasts for 6 skill categories:

Skill CategoryDescriptionForecast Accuracy (MAPE)
HV LinespersonHigh-voltage overhead line work3.8%
LV LinespersonLow-voltage and service work4.1%
Cable JointerUnderground cable work5.2%
Protection EngineerProtection relay testing and design6.1%
Project ManagerCapital project management5.8%
Field InspectorVegetation and asset inspections3.4%

The model produces P10/P50/P90 prediction intervals:

# Prediction interval calculation
def get_prediction_intervals(forecast: np.ndarray, residuals_std: np.ndarray) -> dict:
"""
P10 (lower bound): 10th percentile — used for minimum staffing planning
P50 (base case): median — primary planning figure
P90 (upper bound): 90th percentile — contingency staffing buffer
"""
return {
"P10": forecast - 1.28 * residuals_std,
"P50": forecast,
"P90": forecast + 1.28 * residuals_std
}

Interval width increases with horizon:

  • 1–3 months: ±8% (narrow)
  • 4–12 months: ±15% (moderate)
  • 13–18 months: ±25% (wide)

The skills gap is computed by comparing forecast demand against current workforce capacity:

Gap_month_skill = Forecast_demand_month_skill - (FTE_count_skill × Available_hours_per_FTE)

Positive gap = shortage (need contractors or hire) Negative gap = surplus (potential redeployment or reduced contractor spend)

Bushfire season creates the most significant demand spikes. The model explicitly incorporates:

  1. Historical fire weather index: days above Fire Danger Rating thresholds per region
  2. DNSP vegetation risk scores: aggregate risk score drives inspection and clearance demand
  3. Post-fire remediation factor: after significant fire events, network rebuilding demand is elevated for 6–12 months
Terminal window
# 18-month workforce demand forecast
GET /api/dnsp/workforce/forecast?dnsp=ausgrid&horizon=18m
# Specific skill category
GET /api/dnsp/workforce/forecast?dnsp=ergon&skill=hv_linesperson&horizon=12m
# Skills gap analysis
GET /api/dnsp/workforce/skills-gap?dnsp=sa_power_networks&horizon=12m
# Forecast with prediction intervals
GET /api/dnsp/workforce/forecast?dnsp=energex&include_intervals=true