docs: def approximate_entropy(x, m, r):
      """
      Implements a vectorized Approximate entropy algorithm.
  
          https://en.wikipedia.org/wiki/Approximate_entropy
  
      For short time-series this method is highly dependent on the parameters,
      but should be stable for N > 2000, see:
  
          Yentes et al. (2012) -
          *The Appropriate Use of Approximate Entropy and Sample Entropy with Short Data Sets*
  
  
      Other shortcomings and alternatives discussed in:
  
          Richman & Moorman (2000) -
          *Physiological time-series analysis using approximate entropy and sample entropy*
  
      :param x: the time series to calculate the feature of
      :type x: numpy.ndarray
      :param m: Length of compared run of data
      :type m: int
      :param r: Filtering level, must be positive
      :type r: float
  
      :return: Approximate entropy
      :return type: float
      """
      if not isinstance(x, (np.ndarray, pd.Series)):
          x = np.asarray(x)
  
      N = x.size
      r *= np.std(x)
      if r < 0:
          raise ValueError("Parameter r must be positive.")
      if N <= m+1:
          return 0
  
      def _phi(m):
          x_re = np.array([x[i:i+m] for i in range(N - m + 1)])
          C = np.sum(np.max(np.abs(x_re[:, np.newaxis] - x_re[np.newaxis, :]),
                            axis=2) <= r, axis=0) / (N-m+1)
          return np.sum(np.log(C)) / (N - m + 1.0)
  
      return np.abs(_phi(m) - _phi(m + 1))