code: def get_acf(x, axis=0, fast=False):
      
      x = np.atleast_1d(x)
      m = [slice(None), ] * len(x.shape)
  
      # For computational efficiency, crop the chain to the largest power of
      # two if requested.
      if fast:
          n = int(2 ** np.floor(np.log2(x.shape[axis])))
          m[axis] = slice(0, n)
          x = x
      else:
          n = x.shape[axis]
  
      # Compute the FFT and then (from that) the auto-correlation function.
      f = np.fft.fft(x - np.mean(x, axis=axis), n=2 * n, axis=axis)
      m[axis] = slice(0, n)
      acf = np.fft.ifft(f * np.conjugate(f), axis=axis)[tuple(m)].real
      m[axis] = 0
      return acf / acf[tuple(m)]
docs: Estimate the autocorrelation function of a time series using the FFT.
  
      :param x:
          The time series. If multidimensional, set the time axis using the
          ``axis`` keyword argument and the function will be computed for every
          other axis.
  
      :param axis: (optional)
          The time axis of ``x``. Assumed to be the first axis if not specified.
  
      :param fast: (optional)
          If ``True``, only use the largest ``2^n`` entries for efficiency.
          (default: False)