code: def get_derivatives(xs, ys, fd=False):
      
      try:
          if fd:
              raise SplineInputError('no spline wanted')
          if len(xs) < 4:
              er = SplineInputError('too few data points')
              raise er
          from scipy.interpolate import UnivariateSpline
          spline = UnivariateSpline(xs, ys)
          d = spline.derivative(1)(xs)
      except (ImportError, SplineInputError):
          d = []
          m, left, right = 0, 0, 0
          for n in range(0, len(xs), 1):
              try:
                  left = (ys[n] - ys[n-1]) / (xs[n] - xs[n-1])
                  m += 1
              except IndexError:
                  pass
              try:
                  right = (ys[n+1] - ys[n]) / (xs[n+1] - xs[n])
                  m += 1
              except IndexError:
                  pass
              d.append(left + right / m)
      return d
docs: return the derivatives of y(x) at the points x
      if scipy is available a spline is generated to calculate the derivatives
      if scipy is not available the left and right slopes are calculated, if both exist the average is returned
      putting fd to zero always returns the finite difference slopes