code: def change_quantiles(x, ql, qh, isabs, f_agg):
      
      if ql >= qh:
          ValueError("ql={} should be lower than qh={}".format(ql, qh))
  
      div = np.diff(x)
      if isabs:
          div = np.abs(div)
      # All values that originate from the corridor between the quantiles ql and qh will have the category 0,
      # other will be np.NaN
      try:
          bin_cat = pd.qcut(x, [ql, qh], labels=False)
          bin_cat_0 = bin_cat == 0
      except ValueError:  # Occurs when ql are qh effectively equal, e.g. x is not long enough or is too categorical
          return 0
      # We only count changes that start and end inside the corridor
      ind = (bin_cat_0 & _roll(bin_cat_0, 1))[1:]
      if sum(ind) == 0:
          return 0
      else:
          ind_inside_corridor = np.where(ind == 1)
          aggregator = getattr(np, f_agg)
          return aggregator(div[ind_inside_corridor])
docs: First fixes a corridor given by the quantiles ql and qh of the distribution of x.
      Then calculates the average, absolute value of consecutive changes of the series x inside this corridor.
  
      Think about selecting a corridor on the
      y-Axis and only calculating the mean of the absolute change of the time series inside this corridor.
  
      :param x: the time series to calculate the feature of
      :type x: numpy.ndarray
      :param ql: the lower quantile of the corridor
      :type ql: float
      :param qh: the higher quantile of the corridor
      :type qh: float
      :param isabs: should the absolute differences be taken?
      :type isabs: bool
      :param f_agg: the aggregator function that is applied to the differences in the bin
      :type f_agg: str, name of a numpy function (e.g. mean, var, std, median)
  
      :return: the value of this feature
      :return type: float