docstr: Return a dataframe containing edge properties for only the specified
  edge_ids, columns, and/or edge type, or all edge IDs if not specified.
  
  Parameters
  ----------
  edge_ids : int or collection of int, optional
      The list of edges to include in the edge data
  types : list, optional
      List of edge types to include in returned dataframe.
      None is the default and will return all edge types.
  columns : which edge columns will be returned, optional
      None is the default and will result in all columns being returned
  backend : ('numpy', 'pandas', 'cupy', 'cudf', 'torch', 'torch:<device>')
      Defaults to cudf if available, otherwise falls back to numpy.
  
  Returns
  -------
  Dataframe
      Containing edge ids, type edge source, destination
      and all the columns specified in the columns parameter
code: def get_edge_data(
      self,
      edge_ids=None,
      types=None,
      columns=None,
      backend=("cudf" if cudf_installed else "numpy"),
  ):
      """
      Return a dataframe containing edge properties for only the specified
      edge_ids, columns, and/or edge type, or all edge IDs if not specified.
  
      Parameters
      ----------
      edge_ids : int or collection of int, optional
          The list of edges to include in the edge data
      types : list, optional
          List of edge types to include in returned dataframe.
          None is the default and will return all edge types.
      columns : which edge columns will be returned, optional
          None is the default and will result in all columns being returned
      backend : ('numpy', 'pandas', 'cupy', 'cudf', 'torch', 'torch:<device>')
          Defaults to cudf if available, otherwise falls back to numpy.
  
      Returns
      -------
      Dataframe
          Containing edge ids, type edge source, destination
          and all the columns specified in the columns parameter
      """
  
      # FIXME expose na handling
  
      base_columns = [
          self.edge_id_col_name,
          self.src_col_name,
          self.dst_col_name,
          self.type_col_name,
      ]
  
      if columns is None:
          columns = self.edge_property_names
  
      if edge_ids is None:
          ids = -1
      else:
          ids = edge_ids
  
      edge_data = self.__client.get_graph_edge_data(
          id_or_ids=ids,
          property_keys=columns,
          types=types,
          graph_id=self.__graph_id,
      )
  
      # Convert edge type to numeric if necessary
      if backend not in ["cudf", "pandas"]:
          edge_cat_types = self._edge_categorical_dtype
          edge_data[:, 3] = np.array(
              [edge_cat_types[t] for t in edge_data[:, 3]]
          )
          cat_dtype = "int32"
      else:
          cat_dtype_class = (
              cudf.CategoricalDtype
              if backend == "cudf"
              else pandas.CategoricalDtype
          )
          cat_dtype = cat_dtype_class(
              self._edge_categorical_dtype.keys(), ordered=True
          )
  
      columns = set(columns)
      for c in base_columns:
          if c in columns:
              columns.remove(c)
      column_names = base_columns + list(columns)
  
      return _transform_to_backend_dtype(
          edge_data,
          column_names,
          backend,
          dtypes={self.type_col_name: cat_dtype},
      )
  
imports: import numpy
  import importlib
  from cugraph_service_client.exceptions import CugraphServiceError
  from cugraph_service_client.remote_graph_utils import _transform_to_backend_dtype, _transform_to_backend_dtype_1d, _offsets_to_backend_dtype, MissingModule
label_desc: Use image node_id 33 for calling the RemoteGraph obj's underlying member method code with example usage: obj.get_edge_data(edge_ids, types, columns, backend) and returns: _transform_to_backend_dtype