code: def pfd(X, D=None):
      
      if D is None:
          D = numpy.diff(X)
          D = D.tolist()
      N_delta = 0  # number of sign changes in derivative of the signal
      for i in range(1, len(D)):
          if D[i] * D[i - 1] < 0:
              N_delta += 1
      n = len(X)
      return numpy.log10(n) / (
          numpy.log10(n) + numpy.log10(n / n + 0.4 * N_delta)
      )
docs: Compute Petrosian Fractal Dimension of a time series from either two
      cases below:
          1. X, the time series of type list (default)
          2. D, the first order differential sequence of X (if D is provided,
             recommended to speed up)
  
      In case 1, D is computed using Numpy's difference function.
  
      To speed up, it is recommended to compute D before calling this function
      because D may also be used by other functions whereas computing it here
      again will slow down.