in orbit/template/ktrlite.py [0:0]
def _set_kernel_matrix(self, df, training_meta):
"""set all kernel related metrics
1. knot index (knot_idx)
2. knot time point (knot_tp)
3. kernel matrix (kernel)
4. knot dates (knot_dates) based on frequency implied from df
5. do the same on regression (seasonality regression) if regressors are available
Parameters
----------
df : pd.DataFrame
training_meta : dict
"""
num_of_observations = training_meta[TrainingMetaKeys.NUM_OF_OBS.value]
date_array = training_meta[TrainingMetaKeys.DATE_ARRAY.value]
self._level_knots_idx = get_knot_idx(
num_of_obs=num_of_observations,
knot_distance=self.level_knot_distance,
num_of_segments=self.level_segments,
date_array=date_array,
knot_dates=self.level_knot_dates,
)
# kernel of coefficients calculations
# set some default
self.kernel_coefficients = np.zeros((num_of_observations, 0), dtype=np.double)
self.num_knots_coefficients = 0
if self.num_of_regressors > 0:
self._seas_knots_idx = get_knot_idx(
date_array=None,
num_of_obs=num_of_observations,
knot_dates=None,
knot_distance=None,
num_of_segments=self.seasonality_segments,
)
tp = np.arange(1, num_of_observations + 1) / num_of_observations
self.knots_tp_level = (1 + self._level_knots_idx) / num_of_observations
self.kernel_level = sandwich_kernel(tp, self.knots_tp_level)
self.num_knots_level = len(self.knots_tp_level)
if self.date_freq is None:
self.date_freq = pd.infer_freq(date_array)
# self.time_delta = date_array.diff().min()
self._level_knot_dates = get_knot_dates(
date_array[0], self._level_knots_idx, self.date_freq
)
# update rest of the seasonality related fields
if self.num_of_regressors > 0:
self.knots_tp_coefficients = (
1 + self._seas_knots_idx
) / num_of_observations
self.kernel_coefficients = sandwich_kernel(tp, self.knots_tp_coefficients)
self.num_knots_coefficients = len(self.knots_tp_coefficients)
self._coef_knot_dates = get_knot_dates(
date_array[0], self._seas_knots_idx, self.date_freq
)