class_docstr: Mean absolute scaled error.
  
  Normalizes the absolute error for each time series by the historic seasonal error of this time series.
  
  .. math::
  
      \operatorname{MASE} = \frac{1}{N} \frac{1}{H} \sum_{i=1}^{N} \frac{1}{a_i} \sum_{t=T+1}^{T+H} |y_{i,t} - f_{i,t}|
  
  where :math:`a_i` is the historic absolute seasonal error defined as
  
  .. math::
  
      a_i = \frac{1}{T-m} \sum_{t=m+1}^T |y_{i,t} - y_{i,t-m}|
  
  and :math:`m` is the seasonal period of the time series (``eval_metric_seasonal_period``).
  
  Properties:
  
  - scaled metric (normalizes the error for each time series by the scale of that time series)
  - undefined for constant time series
  - not sensitive to outliers
  - prefers models that accurately estimate the median
  
  References
  ----------
  - `Wikipedia <https://en.wikipedia.org/wiki/Mean_absolute_scaled_error>`_
  - `Forecasting: Principles and Practice <https://otexts.com/fpp3/accuracy.html#scaled-errors>`_
code: def compute_metric(
      self,
      data_future: TimeSeriesDataFrame,
      predictions: TimeSeriesDataFrame,
      target: str = "target",
      **kwargs,
  ) -> float:
      y_true, y_pred = self._get_point_forecast_score_inputs(
          data_future, predictions, target=target
      )
      if self._past_abs_seasonal_error is None:
          raise AssertionError(
              "Call `save_past_metrics` before `compute_metric`"
          )
  
      mae_per_item = (
          (y_true - y_pred)
          .abs()
          .groupby(level=ITEMID, sort=False)
          .mean()
      )
      return self._safemean(
          mae_per_item / self._past_abs_seasonal_error
      )
  
imports: import logging
  from typing import Optional
  import numpy
  import pandas
  from autogluon.timeseries import TimeSeriesDataFrame
  from autogluon.timeseries.dataset.ts_dataframe import ITEMID
  from .abstract import TimeSeriesScorer
  from .utils import _in_sample_abs_seasonal_error, _in_sample_squared_seasonal_error
label_desc: Use image node_id 4 for calling the MASE obj's underlying member method code with example usage: obj.compute_metric(data_future, predictions, target) and returns: self