code: def _optimize_binning(x, range, method='Freedman'):
      
      N = x.shape[0]
      if method.lower() == 'freedman':
          s = sort(x)
          IQR = s[int(N * .75)] - s[int(
              N * .25)]  # Interquantile range (75% -25%)
          width = 2 * IQR * N ** (-1. / 3)
  
      elif method.lower() == 'scott':
          width = 3.49 * x.std() * N ** (-1. / 3)
      else:
          raise ValueError('Method must be Scott or Freedman', method)
      return int(diff(range) / width)
docs: Find the optimal number of bins.
      Available methods : Freedman, Scott