code: def propose_number_of_bins(
      values,
      binning_logic_system = None,
      ):
  
      
  
      # Set the default binning logic system.
      if binning_logic_system is None:
          binning_logic_system = "Scott"
      # Engage the requested logic system.
      if binning_logic_system == "Freedman-Diaconis":
          #log.debug("engage Freedman-Diaconis binning logic")
          bin_size =\
              2 * interquartile_range(values) * \
              len(values) ** (-1/3)
      elif binning_logic_system == "Scott":
          #log.debug("engage Scott binning logic")
          bin_size =\
              3.5 * standard_deviation(values) * \
              len(values) ** (-1/3)
      else:
          log.error("undefined binning logic system requested")
          raise(ValueError)
      number_of_bins = (max(values) - min(values)) / bin_size
      if numpy.isinf(number_of_bins) or numpy.isnan(number_of_bins):
          number_of_bins = len(set(values)) # number of unique values
          #log.debug(
          #    "binning algorithms ineffective -- " +
          #    "propose binning by unique values"
          #)
      return int(round(number_of_bins))
docs: This function returns a proposal for binning for a histogram of a specified
      list using an optional specified binning logic system.
  
      Freedman-Diaconis: bin width is proportional to the interquartile range of
                         the data divided by the cube root of the size of the data
  
      Scott:             bin width is proportional to the standard deviation of
                         the values divided by the cube root of the size of the
                         data