class_docstr: Aggregation method which performs binned min-max aggregation over 50% overlapping
  windows.
  
  ![minmax operator image](https://github.com/predict-idlab/plotly-resampler/blob/main/docs/sphinx/_static/minmax_operator.png)
  
  In the above image, **bin_size**: represents the size of *(len(series) / n_out)*.
  As the windows have 50% overlap and are consecutive, the min & max values are
  calculated on a windows with size (2x bin-size).
  
  This is *very* similar to the MinMaxAggregator, emperical results showed no
  observable difference between both approaches.
  
  !!! note
  
      This method is implemented in Python (leveraging numpy for vecotrization), but
      is **significantly slower than the MinMaxAggregator** (which is implemented in
      the tsdownsample toolkit in Rust). <br/>
      As such, this class does not support any downsample kwargs.
  
  !!! note
  
      This downsampler supports all dtypes.
class_docstr_tok: ["Aggregation","method","which","performs","binned","min-max","aggregation","over","50","%","overlapping","windows",".","!","[","minmax","operator","image","]","(","https",":","\/\/github.com\/predict-idlab\/plotly-resampler\/blob\/main\/docs\/sphinx\/_static\/minmax_operator.png",")","In","the","above","image",",","*","*","bin_size","*","*",":","represents","the","size","of","*","(","len","(","series",")","\/","n_out",")","*",".","As","the","windows","have","50","%","overlap","and","are","consecutive",",","the","min","&","max","values","are","calculated","on","a","windows","with","size","(","2x","bin-size",")",".","This","is","*","very","*","similar","to","the","MinMaxAggregator",",","emperical","results","showed","no","observable","difference","between","both","approaches",".","!","!","!","note","This","method","is","implemented","in","Python","(","leveraging","numpy","for","vecotrization",")",",","but","is","*","*","significantly","slower","than","the","MinMaxAggregator","*","*","(","which","is","implemented","in","the","tsdownsample","toolkit","in","Rust",")",".","<","br\/",">","As","such",",","this","class","does","not","support","any","downsample","kwargs",".","!","!","!","note","This","downsampler","supports","all","dtypes","."]
code: def _arg_downsample(
      self,
      x: np.ndarray | None,
      y: np.ndarray,
      n_out: int,
  ) -> np.ndarray:
      # The block size 2x the bin size we also perform the ceil-operation
      # to ensure that the block_size * n_out / 2 < len(x)
      block_size = math.ceil(y.shape[0] / (n_out + 1) * 2)
      argmax_offset = block_size // 2
  
      # Calculate the offset range which will be added to the argmin and argmax pos
      offset = np.arange(
          0,
          stop=y.shape[0] - block_size - argmax_offset,
          step=block_size,
      )
  
      # Calculate the argmin & argmax on the reshaped view of `y` &
      # add the corresponding offset
      argmin = (
          y[: block_size * offset.shape[0]]
          .reshape(-1, block_size)
          .argmin(axis=1)
          + offset
      )
      argmax = (
          y[
              argmax_offset : block_size * offset.shape[0]
              + argmax_offset
          ]
          .reshape(-1, block_size)
          .argmax(axis=1)
          + offset
          + argmax_offset
      )
  
      # Sort the argmin & argmax (where we append the first and last index item)
      return np.unique(
          np.concatenate((argmin, argmax, [0, y.shape[0] - 1]))
      )
  
imports: from __future__ import annotations
  import math
  from typing import Tuple
  import numpy
  from tsdownsample import EveryNthDownsampler, LTTBDownsampler, MinMaxDownsampler, MinMaxLTTBDownsampler
  from ..aggregation.aggregation_interface import DataAggregator, DataPointSelector
label_desc: Use image node_id 1 for calling the MinMaxOverlapAggregator obj's underlying member method code with example usage: obj._arg_downsample(x, y, n_out) and returns: np