code: def _collect_op_properties(cls, op):
      from .sort_values import DataFrameSortValues
  
      if isinstance(op, DataFrameSortValues):
          properties = dict(
              sort_type="sort_values",
              axis=op.axis,
              by=op.by,
              ascending=op.ascending,
              inplace=op.inplace,
              na_position=op.na_position,
              gpu=op.is_gpu(),
          )
      else:
          properties = dict(
              sort_type="sort_index",
              axis=op.axis,
              level=op.level,
              ascending=op.ascending,
              inplace=op.inplace,
              na_position=op.na_position,
              sort_remaining=op.sort_remaining,
              gpu=op.is_gpu(),
          )
      return properties
  
imports: import os
  import numpy
  import pandas
  from ...None import opcodes
  from ...core.operand import OperandStage, MapReduceOperand
  from ...utils import lazy_import, calc_nsplits
  from ...serialization.serializables import AnyField, Int32Field, ListField, StringField, BoolField
  from ...tensor.base.psrs import PSRSOperandMixin
  from ..core import IndexValue, OutputType
  from ..utils import standardize_range_index, parse_index, is_cudf
  from ..operands import DataFrameOperandMixin, DataFrameOperand, DataFrameShuffleProxy
label_desc: Use image node_id 1 for calling the DataFramePSRSOperandMixin obj's underlying member method code with example usage: obj._collect_op_properties(cls, op) and returns: properties