code: def smooth(x, y, degree=1, logx=False, logy=False):
      
      if degree == 0:
          return x, y
      else:
          if logx:
              x = np.log10(x)
          if logy:
              y = np.log10(y)
  
          if degree == 1:
              # generate new linearly spaced x-points
              smoothed_x = np.linspace(min(x), max(x), len(x))
              # generate new y-points using linear interpolation
              smoothed_y = np.interp(smoothed_x, x, y)
          else:
              # smooth data by linear interpolation
              x, y = smooth(x, y, degree - 1)
              smoothed_x = (x[:-1] + x[1:]) / 2
              smoothed_y = np.interp(smoothed_x, x, y)
  
          if logx:
              smoothed_x = 10 ** smoothed_x
          if logy:
              smoothed_y = 10 ** smoothed_y
  
          return smoothed_x, smoothed_y
docs: Smooth y-values and return new x, y pair.
  
      :param x,y: data values
      :param degree: degree of smoothing
  
      Smooth data by using a recursive linear interpolation technique.  For
      degree = 0, return the original values.  For degree = 1, generate a
      evenly spaced sequence of x-values, with the length equal to the
      original length.  The y-values are linearly interpolated for these
      x-values.  For degree >= 2, calls itself with degree - 1, then
      calculates new x-values by taking the averages of the returned
      x-values, and calculates new y-values by linear interpolation.  The
      return values are thus reduced in length by one sample.