in kats/models/ensemble/kats_ensemble.py [0:0]
def predict(self, steps: int) -> KatsEnsemble:
"""Predit future for each individual model
Args:
steps : number of steps ahead to forecast
Returns:
None
"""
fitted = self.fitted
if fitted is None:
raise _logged_error("fit must be called before predict.")
self.steps = steps
if self.seasonality:
sea_data = self.sea_data
assert sea_data is not None
# we should pred two types of model
desea_fitted = {k: v for k, v in fitted.items() if "_smodel" not in k}
desea_predict = {
k: v.predict(self.steps).set_index("time")
for k, v in desea_fitted.items()
}
# re-seasonalize
predicted = KatsEnsemble.reseasonalize(
sea_data=sea_data,
desea_predict=desea_predict,
decomposition_method=self.decomposition_method,
seasonality_length=self.params["seasonality_length"],
steps=self.steps,
)
# add extra model prediction results from smodels
fitted_smodel = {k: v for k, v in fitted.items() if "_smodel" in k}
extra_predict = {
k: v.predict(self.steps).set_index("time")
for k, v in fitted_smodel.items()
}
predicted.update(extra_predict)
self.predicted = predicted
else:
predicted = {
k: v.predict(self.steps).set_index("time") for k, v in fitted.items()
}
# add dummy C.I if the model doesn't have native C.I
# this is a hack for median ensemble; everyone model needs to have
# its native C.I if user choose weighted average ensemble.
for k, v in predicted.items():
# if predicted df doesn't have fcst_lower and fcst_upper
if not {"fcst_lower", "fcst_upper"}.issubset(v.columns):
# add dummy C.I
tmp_v = copy(v)
tmp_v["fcst_lower"] = np.nan
tmp_v["fcst_upper"] = np.nan
predicted[k] = tmp_v
self.predicted = predicted
return self