code: def map(self, vi, sources, targets, dt_unit, ft_feature):
      # input value dict
      ivdic = {}
  
      # input features
      for feature in self.input_features:
          if feature == "ft_feature_s":
              ivdic[feature] = vi[ft_feature[0]].values[sources]
          elif feature == "ft_feature_t":
              ivdic[feature] = vi[ft_feature[0]].values[targets]
          else:
              if feature.endswith("_s"):
                  ivdic[feature] = vi[feature[:-2]].values[sources]
              elif feature.endswith("_t"):
                  ivdic[feature] = vi[feature[:-2]].values[targets]
  
      # input relations
      for r in self.input_rs:
          try:
              ivdic[r] = CreatorFunction.stored_relations[r]
          except KeyError:
              msg = (
                  "{} requests {}, which has not yet "
                  "been computed. Check the order of "
                  "your connectors and selectors.".format(self.name, r)
              )
              raise KeyError(msg)
  
      # evaluate
      output = self.fct(**ivdic)
  
      # store relations
      if not isinstance(output, tuple):
          output = (output,)
      for i, r in enumerate(self.output_rs):
          if r == "ft_r" and dt_unit is not None:
              CreatorFunction.stored_relations[r] = output[
                  i
              ] / np.timedelta64(1, dt_unit)
          else:
              CreatorFunction.stored_relations[r] = output[i]
  
file_path: deepgraph/deepgraph/connectors_and_selectors.py
imports: import inspect
  import warnings
  from collections import Counter
  import numpy
  from deepgraph._find_selected_indices import _find_selected_indices
  from deepgraph.utils import _flatten
label_desc: Use image node_id 2 for calling the Connector obj's underlying member method code with example usage: obj.map(vi, sources, targets, dt_unit, ft_feature) without return types