code: def min_max_scale(expr, columns=None, feature_range=(0, 1), preserve=False, suffix='_scaled', group=None):
      
      time_suffix = str(int(time.time()))
  
      def calc_agg(expr, col):
          return [
              getattr(expr, col).min().rename(col + '_min_' + time_suffix),
              getattr(expr, col).max().rename(col + '_max_' + time_suffix),
          ]
  
      def do_scale(expr, col):
          f_min, f_max = feature_range
          r = getattr(expr, col + '_max_' + time_suffix) - getattr(expr, col + '_min_' + time_suffix)
          scaled = (r == 0).ifelse(Scalar(0), (getattr(expr, col) - getattr(expr, col + '_min_' + time_suffix)) / r)
          return scaled * (f_max - f_min) + f_min
  
      return _scale_values(expr, columns, calc_agg, do_scale, preserve=preserve, suffix=suffix, group=group)
docs: Resize a data frame by max / min values, i.e., (X - min(X)) / (max(X) - min(X))
  
      :param DataFrame expr: input DataFrame
      :param feature_range: the target range to resize the value into, i.e., v * (b - a) + a
      :param bool preserve: determine whether input data should be kept. If True, scaled input data will be appended to the data frame with `suffix`
      :param columns: columns names to resize. If set to None, float or int-typed columns will be normalized if the column is not specified as a group column.
      :param group: determine scale groups. Scaling will be done in each group separately.
      :param str suffix: column suffix to be appended to the scaled columns.
  
      :return: resized data frame
      :rtype: DataFrame