code: def read_data(self, path):
      args = self.args
      logging.info(f"Reading data: {args.data_path}")
      if args.input_data_format in ["csv", "tsv"]:
          ddf = self.df_lib.read_csv(
              path, sep=args.csv_sep, na_values=args.csv_na_values
          )
      elif args.input_data_format == "parquet":
          ddf = self.df_lib.read_parquet(path)
      else:
          raise ValueError(
              f"Invalid input data format: {args.input_data_format}"
          )
  
      logging.info("First lines...")
      logging.info(ddf.head())
  
      logging.info(f"Number of rows: {len(ddf)}")
      if args.filter_query:
          logging.info(
              f"Filtering rows using filter {args.filter_query}"
          )
          ddf = ddf.query(args.filter_query)
          logging.info(f"Number of rows after filtering: {len(ddf)}")
  
      ddf = self.adding_temp_index(ddf)
  
      return 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 3 for calling the PreprocessingRunner obj's underlying member method code with example usage: obj.read_data(path) and returns: ddf