code: def filter_by_user_item_freq(self, ddf):
      logging.info("Filtering rows with min/max user/item frequency")
      args = self.args
  
      filtered_ddf = ddf
      if (
          args.min_user_freq
          or args.max_user_freq
          or args.min_item_freq
          or args.max_item_freq
      ):
          print("Before filtering: ", len(filtered_ddf))
          for r in range(args.num_max_rounds_filtering):
              print(f"Round #{r+1}")
              if args.min_user_freq or args.max_user_freq:
                  filtered_ddf = filter_by_freq(
                      df_to_filter=filtered_ddf,
                      df_for_stats=filtered_ddf,
                      column=args.user_id_feature,
                      min_freq=args.min_user_freq,
                      max_freq=args.max_user_freq,
                  )
                  users_count = len(filtered_ddf)
                  print("After filtering users: ", users_count)
              if args.min_item_freq or args.max_item_freq:
                  filtered_ddf = filter_by_freq(
                      df_to_filter=filtered_ddf,
                      df_for_stats=filtered_ddf,
                      column=args.item_id_feature,
                      min_freq=args.min_item_freq,
                      max_freq=args.max_item_freq,
                  )
                  items_count = len(filtered_ddf)
                  print("After filtering items: ", items_count)
  
      return filtered_ddf
  
imports: import gc
  import logging
  import os
  import shutil
  from functools import reduce
  from typing import Optional
  import nvtabular
  from merlin.core.dispatch import HAS_GPU
  from merlin.schema import Tags
  from nvtabular import ops
  from .args_parsing import parse_arguments
label_desc: Use image node_id 5 for calling the PreprocessingRunner obj's underlying member method code with example usage: obj.filter_by_user_item_freq(ddf) and returns: filtered_ddf