code: def _predict(self, fit, df):
          
  
          # Add model results to data as column 'predictions'
          df_res = df.copy()
          if 'Intercept' in fit.model.exog_names:
              df_res['Intercept'] = 1.0
          df_res['predicted'] = fit.predict(df_res)
          if not self.allow_negative_predictions:
              df_res.loc[df_res['predicted'] < 0, 'predicted'] = 0
  
          prstd, interval_l, interval_u = wls_prediction_std(fit,
                                                             df_res[fit.model.exog_names],
                                                             alpha=1 - self.confint)
          df_res['interval_l'] = interval_l
          df_res['interval_u'] = interval_u
  
          if 'Intercept' in df_res:
              df_res.drop(labels=['Intercept'], axis=1, inplace=True)
  
          return df_res
docs: Return a df with predictions and confidence interval
  
          Notes
          -----
          The df will contain the following columns:
          - 'predicted': the model output
          - 'interval_u', 'interval_l': upper and lower confidence bounds.
  
          The result will depend on the following attributes of self:
          confint : float (default=0.95)
              Confidence level for two-sided hypothesis
          allow_negative_predictions : bool (default=True)
              If False, correct negative predictions to zero (typically for energy consumption predictions)
  
          Parameters
          ----------
          fit : Statsmodels fit
          df : pandas DataFrame or None (default)
              If None, use self.df
  
  
          Returns
          -------
          df_res : pandas DataFrame
              Copy of df with additional columns 'predicted', 'interval_u' and 'interval_l'