class_docstr: Base forecaster template class.
  
  The base forecaster specifies the methods and method signatures that all forecasters
  have to implement.
  
  Specific implementations of these methods is deferred to concrete forecasters.
class_docstr_tok: ["Base","forecaster","template","class",".","The","base","forecaster","specifies","the","methods","and","method","signatures","that","all","forecasters","have","to","implement",".","Specific","implementations","of","these","methods","is","deferred","to","concrete","forecasters","."]
docstr: Compute/return fully probabilistic forecasts.
  
  private _predict_proba containing the core logic, called from predict_proba
  
  Parameters
  ----------
  fh : guaranteed to be ForecastingHorizon
      The forecasting horizon with the steps ahead to to predict.
  X : optional (default=None)
      guaranteed to be of a type in self.get_tag("X_inner_mtype")
      Exogeneous time series to predict from.
  marginal : bool, optional (default=True)
      whether returned distribution is marginal by time index
  
  Returns
  -------
  pred_dist : sktime BaseDistribution
      predictive distribution
      if marginal=True, will be marginal distribution by time point
      if marginal=False and implemented by method, will be joint
docstr_tok: ["Compute\/return","fully","probabilistic","forecasts",".","private","_predict_proba","containing","the","core","logic",",","called","from","predict_proba","Parameters","--","--","--","--","--","fh",":","guaranteed","to","be","ForecastingHorizon","The","forecasting","horizon","with","the","steps","ahead","to","to","predict",".","X",":","optional","(","default=None",")","guaranteed","to","be","of","a","type","in","self.get_tag","(","``","X_inner_mtype","''",")","Exogeneous","time","series","to","predict","from",".","marginal",":","bool",",","optional","(","default=True",")","whether","returned","distribution","is","marginal","by","time","index","Returns","--","--","--","-","pred_dist",":","sktime","BaseDistribution","predictive","distribution","if","marginal=True",",","will","be","marginal","distribution","by","time","point","if","marginal=False","and","implemented","by","method",",","will","be","joint"]
code: def _predict_proba(self, fh, X, marginal=True):
      """Compute/return fully probabilistic forecasts.
  
      private _predict_proba containing the core logic, called from predict_proba
  
      Parameters
      ----------
      fh : guaranteed to be ForecastingHorizon
          The forecasting horizon with the steps ahead to to predict.
      X : optional (default=None)
          guaranteed to be of a type in self.get_tag("X_inner_mtype")
          Exogeneous time series to predict from.
      marginal : bool, optional (default=True)
          whether returned distribution is marginal by time index
  
      Returns
      -------
      pred_dist : sktime BaseDistribution
          predictive distribution
          if marginal=True, will be marginal distribution by time point
          if marginal=False and implemented by method, will be joint
      """
      # default behaviour is implemented if one of the following three is implemented
      implements_interval = self._has_implementation_of(
          "_predict_interval"
      )
      implements_quantiles = self._has_implementation_of(
          "_predict_quantiles"
      )
      implements_var = self._has_implementation_of("_predict_var")
      can_do_proba = (
          implements_interval or implements_quantiles or implements_var
      )
  
      if not can_do_proba:
          raise RuntimeError(
              f"{self.__class__.__name__} does not implement "
              "probabilistic forecasting, "
              'but "capability:pred_int" flag has been set to True incorrectly. '
              "This is likely a bug, please report, and/or set the flag to False."
          )
  
      # if any of the above are implemented, predict_var will have a default
      #   we use predict_var to get scale, and predict to get location
      pred_var = self._predict_var(fh=fh, X=X)
      pred_std = np.sqrt(pred_var)
      pred_mean = self.predict(fh=fh, X=X)
      # ensure that pred_mean is a pd.DataFrame
      df_types = ["pd.DataFrame", "pd-multiindex", "pd_multiindex_hier"]
      pred_mean = convert_to(pred_mean, to_type=df_types)
      # pred_mean and pred_var now have the same format
  
      # default is normal with predict as mean and pred_var as variance
      from sktime.proba.normal import Normal
  
      index = pred_mean.index
      columns = pred_mean.columns
      pred_dist = Normal(
          mu=pred_mean, sigma=pred_std, index=index, columns=columns
      )
  
      return pred_dist
  
imports: from copy import deepcopy
  from itertools import product
  import numpy
  import pandas
  from sktime.base import BaseEstimator
  from sktime.datatypes import VectorizedDF, check_is_scitype, convert_to, get_cutoff, mtype_to_scitype, scitype_to_mtype, update_data
  from sktime.forecasting.base._fh import ForecastingHorizon
  from sktime.utils.datetime import _shift
  from sktime.utils.validation._dependencies import _check_estimator_deps
  from sktime.utils.validation.forecasting import check_alpha, check_cv, check_fh, check_X
  from sktime.utils.validation.series import check_equal_time_index
  from sktime.utils.warnings import warn
label_desc: Use image node_id 37 for calling the BaseForecaster obj's underlying member method code with example usage: obj._predict_proba(fh, X, marginal) and returns: pred_dist