Code covered by the BSD License  

Highlights from
Electricity Load and Price Forecasting Webinar Case Study

image thumbnail

Electricity Load and Price Forecasting Webinar Case Study



10 Sep 2010 (Updated )

Slides and MATLABĀ® code for the day-ahead system load and price forecasting case study.

genPredictors(data, term, holidays)
function [X, dates, labels] = genPredictors(data, term, holidays)
% GENPREDICTORS generates a matrix of predictor variables for the price
% forecasting model. 
% [X, dates, labels] = genPredictors(data, term, holidays)
% Inputs:
% data     : A Dataset array of historical weather, price and load information
% term     : 'long' or 'short' indicating the horizon of the forecast.
%            Predictors such as previous day load are not included in the 
%            long term forecast.
% holidays : A vector of holidays. If this is not specified, holidays are
%            generated by the function CREATEHOLIDAYDATES
% Outputs:
% X     : A matrix of predictor data where each row corresponds to an
%         observation (hourly load) and each column corresponds to a variable
% dates : A vector of dates for each observation
% labels: A cell array of strings describing each predictor

% Convert Dates into a Numeric Representation
    dates = data.NumDate;
catch %#ok<CTCH>
    dates = datenum(data.Date, 'yyyy-mm-dd HH:MM:SS') + (data.Hour-1)/24;
if all(floor(dates)==dates) % true if dates don't include any hour information
    dates = dates + (data.Hour-1)/24;

% Process Holidays
if nargin < 3 || isempty(holidays)
    holidays = createHolidayDates(min(dates), max(dates));
    holidays = datenum(holidays);

% Create Predictors

% Short term forecasting inputs
% Lagged load inputs
prevDaySameHourLoad = [NaN(24,1); data.SYSLoad(1:end-24)];
prevWeekSameHourLoad = [NaN(168,1); data.SYSLoad(1:end-168)];
prev24HrAveLoad = filter(ones(1,24)/24, 1, data.SYSLoad);

% Lagged electricity price inputs
prevDaySameHourPrice = [NaN(24,1); data.ElecPrice(1:end-24)];
prevWeekSameHourPrice = [NaN(168,1); data.ElecPrice(1:end-168)];
prev24HrAvePrice = filter(ones(1,24)/24, 1, data.ElecPrice);

% Lagged fuel price inputs
prevDayNGPrice = [NaN(24,1); data.NGPrice(1:end-24)];
prevWeekAveNGPrice = filter(ones(1,168)/168, 1, data.NGPrice);

% Date predictors
dayOfWeek = weekday(dates);

% Non-business days
isWorkingDay = ~ismember(floor(dates),holidays) & ~ismember(dayOfWeek,[1 7]);
%[~,~,isWorkingDay] = createHolidayDates(data.NumDate);

if strncmpi(term, 'long', 4);
    % Long Term Forecast Predictors
    X = [data.DryBulb data.DewPnt daily5dayHighAve daily5dayLowAve data.Hour dayOfWeek isWorkingDay];
    labels = {'DryBulb', 'DewPoint', 'Prev5DayHighAve', 'Prev5DayLowAve', 'Hour', 'Weekday', 'IsWorkingDay'};
    % Short Term
    X = [data.DryBulb data.DewPnt data.Hour dayOfWeek isWorkingDay data.SYSLoad prevWeekSameHourLoad prevDaySameHourLoad prev24HrAveLoad...
        prevWeekSameHourPrice prevDaySameHourPrice prev24HrAvePrice prevDayNGPrice prevWeekAveNGPrice];
    labels = {'DryBulb', 'DewPoint', 'Hour', 'Weekday', 'IsWorkingDay', 'CurrentLoad', 'PrevWeekSameHourLoad', 'prevDaySameHourLoad', 'prev24HrAveLoad'...
        'PrevWeekSameHourPrice', 'prevDaySameHourPrice', 'prev24HrAvePrice', 'prevDayNGPrice', 'prevWeekAveNGPrice'};

function y = rep24(x)
y = repmat(x(:), 1, 24)';
y = y(:);

Contact us