class_docstr: Implementation of the AbstractAggregator interface for data aggregation.
  
  DataAggregator differs from DataPointSelector in that it doesn't select data points,
  but rather aggregates the data (e.g., mean).
  As such, the `_aggregate` method is responsible for aggregating the data, and thus
  returns a tuple of the aggregated x and y values.
  
  Concrete implementations of this class must implement the `_aggregate` method, and
  have full responsibility on how they deal with other high-frequency properties, such
  as `hovertext`, `marker_size`, 'marker_color`, etc ...
code: def _aggregate(
      self,
      x: np.ndarray | None,
      y: np.ndarray,
      n_out: int,
  ) -> Tuple[np.ndarray, np.ndarray]:
      raise NotImplementedError
  
imports: from __future__ import annotations
  import re
  from abc import ABC, abstractmethod
  from typing import List, Optional, Tuple
  import numpy
label_desc: Use image node_id 1 for calling the DataAggregator obj's underlying member method code with example usage: obj._aggregate(x, y, n_out) without return types