class_docstr: Stores predicted and actual values.
  Provides functionality to evaluate a forecast:
  
      - plots true against actual with prediction bands.
      - evaluates model performance.
  
  Input should be one of two kinds of forecast results:
  
      - model fit to train data, forecast on test set (actuals available).
      - model fit to all data, forecast on future dates (actuals not available).
  
  The input ``df`` is a concatenation of fitted and forecasted values.
  
  Attributes
  ----------
  df : `pandas.DataFrame`
      Timestamp, predicted, and actual values.
  time_col : `str`
      Column in ``df`` with timestamp (default "ts").
  actual_col : `str`
      Column in ``df`` with actual values (default "y").
  predicted_col : `str`
      Column in ``df`` with predicted values (default "forecast").
  predicted_lower_col : `str` or None
      Column in ``df`` with predicted lower bound (default "forecast_lower", optional).
  predicted_upper_col : `str` or None
      Column in ``df`` with predicted upper bound (default "forecast_upper", optional).
  null_model_predicted_col : `str` or None
      Column in ``df`` with predicted value of null model (default "forecast_null", optional).
  ylabel : `str`
      Unit of measurement (default "y")
  train_end_date : `str` or `datetime` or None, default None
      End date for train period. If `None`, assumes all data were used for training.
  test_start_date : `str` or `datetime` or None, default None
      Start date of test period. If `None`, set to the ``time_col`` value immediately after
      ``train_end_date``. This assumes that all data not used in training were used for testing.
  forecast_horizon : `int` or None, default None
      Number of periods forecasted into the future. Must be > 0.
  coverage : `float` or None
      Intended coverage of the prediction bands (0.0 to 1.0).
  r2_loss_function : `function`
      Loss function to calculate ``cst.R2_null_model_score``, with signature
      ``loss_func(y_true, y_pred)`` (default mean_squared_error)
  estimator : An instance of an estimator that implements `greykite.models.base_forecast_estimator.BaseForecastEstimator`.
      The fitted estimator, the last step in the forecast pipeline.
  relative_error_tolerance : `float` or None, default None
      Threshold to compute the ``Outside Tolerance`` metric,
      defined as the fraction of forecasted values whose relative
      error is strictly greater than ``relative_error_tolerance``.
      For example, 0.05 allows for 5% relative error.
      If `None`, the metric is not computed.
  df_train : `pandas.DataFrame`
      Subset of ``df`` where ``df[time_col]`` <= ``train_end_date``.
  df_test : `pandas.DataFrame`
      Subset of ``df`` where ``df[time_col]`` > ``train_end_date``.
  train_evaluation : `dict` [`str`, `float`]
      Evaluation metrics on training set.
  test_evaluation : `dict` [`str`, `float`]
      Evaluation metrics on test set (if actual values provided after train_end_date).
  test_na_count : `int`
      Count of NA values in test data.
docstr: Group-wise computation of forecasting error.
  Can be used to evaluate error/ aggregated value by a time feature,
  over time, or by a user-provided column.
  
  Exactly one of: ``groupby_time_feature``, ``groupby_sliding_window_size``,
  ``groupby_custom_column`` must be provided.
  
  Parameters
  ----------
  score_func : callable, optional
      Function that maps two arrays to a number.
      Signature (y_true: array, y_pred: array) -> error: float
  score_func_name : `str` or None, optional
      Name of the score function used to report results.
      If None, defaults to "metric".
  which: `str`
      "train" or "test". Which dataset to evaluate.
  groupby_time_feature : `str` or None, optional
      If provided, groups by a column generated by
      `~greykite.common.features.timeseries_features.build_time_features_df`.
      See that function for valid values.
  groupby_sliding_window_size : `int` or None, optional
      If provided, sequentially partitions data into groups of size
      ``groupby_sliding_window_size``.
  groupby_custom_column : `pandas.Series` or None, optional
      If provided, groups by this column value. Should be same length as the DataFrame.
  
  Returns
  -------
  grouped_df : `pandas.DataFrame` with two columns:
  
      (1) grouping_func_name:
          evaluation metric computing forecasting error of timeseries.
      (2) group name:
          group name depends on the grouping method:
          ``groupby_time_feature`` for ``groupby_time_feature``
          ``cst.TIME_COL`` for ``groupby_sliding_window_size``
          ``groupby_custom_column.name`` for ``groupby_custom_column``.
docstr_tok: ["Group-wise","computation","of","forecasting","error",".","Can","be","used","to","evaluate","error\/","aggregated","value","by","a","time","feature",",","over","time",",","or","by","a","user-provided","column",".","Exactly","one","of",":","``","groupby_time_feature","``",",","``","groupby_sliding_window_size","``",",","``","groupby_custom_column","``","must","be","provided",".","Parameters","--","--","--","--","--","score_func",":","callable",",","optional","Function","that","maps","two","arrays","to","a","number",".","Signature","(","y_true",":","array",",","y_pred",":","array",")","-",">","error",":","float","score_func_name",":","`","str","`","or","None",",","optional","Name","of","the","score","function","used","to","report","results",".","If","None",",","defaults","to","``","metric","''",".","which",":","`","str","`","``","train","''","or","``","test","''",".","Which","dataset","to","evaluate",".","groupby_time_feature",":","`","str","`","or","None",",","optional","If","provided",",","groups","by","a","column","generated","by","`","~greykite.common.features.timeseries_features.build_time_features_df","`",".","See","that","function","for","valid","values",".","groupby_sliding_window_size",":","`","int","`","or","None",",","optional","If","provided",",","sequentially","partitions","data","into","groups","of","size","``","groupby_sliding_window_size","``",".","groupby_custom_column",":","`","pandas.Series","`","or","None",",","optional","If","provided",",","groups","by","this","column","value",".","Should","be","same","length","as","the","DataFrame",".","Returns","--","--","--","-","grouped_df",":","`","pandas.DataFrame","`","with","two","columns",":","(","1",")","grouping_func_name",":","evaluation","metric","computing","forecasting","error","of","timeseries",".","(","2",")","group","name",":","group","name","depends","on","the","grouping","method",":","``","groupby_time_feature","``","for","``","groupby_time_feature","``","``","cst.TIME_COL","``","for","``","groupby_sliding_window_size","``","``","groupby_custom_column.name","``","for","``","groupby_custom_column","``","."]
code: def get_grouping_evaluation(
      self,
      score_func=EvaluationMetricEnum.MeanAbsolutePercentError.get_metric_func(),
      score_func_name=EvaluationMetricEnum.MeanAbsolutePercentError.get_metric_name(),
      which="train",
      groupby_time_feature=None,
      groupby_sliding_window_size=None,
      groupby_custom_column=None,
  ):
      """Group-wise computation of forecasting error.
      Can be used to evaluate error/ aggregated value by a time feature,
      over time, or by a user-provided column.
  
      Exactly one of: ``groupby_time_feature``, ``groupby_sliding_window_size``,
      ``groupby_custom_column`` must be provided.
  
      Parameters
      ----------
      score_func : callable, optional
          Function that maps two arrays to a number.
          Signature (y_true: array, y_pred: array) -> error: float
      score_func_name : `str` or None, optional
          Name of the score function used to report results.
          If None, defaults to "metric".
      which: `str`
          "train" or "test". Which dataset to evaluate.
      groupby_time_feature : `str` or None, optional
          If provided, groups by a column generated by
          `~greykite.common.features.timeseries_features.build_time_features_df`.
          See that function for valid values.
      groupby_sliding_window_size : `int` or None, optional
          If provided, sequentially partitions data into groups of size
          ``groupby_sliding_window_size``.
      groupby_custom_column : `pandas.Series` or None, optional
          If provided, groups by this column value. Should be same length as the DataFrame.
  
      Returns
      -------
      grouped_df : `pandas.DataFrame` with two columns:
  
          (1) grouping_func_name:
              evaluation metric computing forecasting error of timeseries.
          (2) group name:
              group name depends on the grouping method:
              ``groupby_time_feature`` for ``groupby_time_feature``
              ``cst.TIME_COL`` for ``groupby_sliding_window_size``
              ``groupby_custom_column.name`` for ``groupby_custom_column``.
      """
      df = (
          self.df_train.copy()
          if which.lower() == "train"
          else self.df_test.copy()
      )
      score_func = add_finite_filter_to_scorer(
          score_func
      )  # in case it's not already added
      if score_func_name:
          grouping_func_name = f"{which} {score_func_name}"
      else:
          grouping_func_name = f"{which} metric"
  
      def grouping_func(grp):
          return score_func(
              grp[self.actual_col], grp[self.predicted_col]
          )
  
      result = add_groupby_column(
          df=df,
          time_col=self.time_col,
          groupby_time_feature=groupby_time_feature,
          groupby_sliding_window_size=groupby_sliding_window_size,
          groupby_custom_column=groupby_custom_column,
      )
  
      grouped_df = grouping_evaluation(
          df=result["df"],
          groupby_col=result["groupby_col"],
          grouping_func=grouping_func,
          grouping_func_name=grouping_func_name,
      )
      return grouped_df
  
imports: from functools import partial
  import pandas
  from sklearn.metrics import mean_squared_error
  from greykite.common import constants
  from greykite.common.evaluation import ElementwiseEvaluationMetricEnum
  from greykite.common.evaluation import EvaluationMetricEnum
  from greykite.common.evaluation import add_finite_filter_to_scorer
  from greykite.common.evaluation import calc_pred_coverage
  from greykite.common.evaluation import calc_pred_err
  from greykite.common.evaluation import fraction_outside_tolerance
  from greykite.common.evaluation import r2_null_model_score
  from greykite.common.python_utils import apply_func_to_columns
  from greykite.common.time_properties import infer_freq
  from greykite.common.viz.timeseries_plotting import add_groupby_column
  from greykite.common.viz.timeseries_plotting import flexible_grouping_evaluation
  from greykite.common.viz.timeseries_plotting import grouping_evaluation
  from greykite.common.viz.timeseries_plotting import plot_forecast_vs_actual
  from greykite.common.viz.timeseries_plotting import plot_multivariate
  from greykite.common.viz.timeseries_plotting import plot_univariate
  from greykite.framework.input.univariate_time_series import UnivariateTimeSeries
label_desc: Use image node_id 5 for calling the UnivariateForecast obj's underlying member method code with example usage: obj.get_grouping_evaluation(score_func, score_func_name, which, groupby_time_feature, groupby_sliding_window_size, groupby_custom_column) and returns: grouped_df, score_func