docstr: Return the prediction path from this node to the parent node.
  
  Parameters
  ----------
  node_id    : id of the node to get the prediction path.
  missing_id : Additional info that contains nodes with missing features.
  
  Returns
  -------
  list: The list of decisions (top to bottom) from the root to this node.
  
  Examples
  --------
  .. sourcecode:: python
  
      >>> tree.get_prediction_score(5)  # Any node
       [{'child_id': 2,
         'feature': 'Quantity_features_90',
         'index': 'sum_timegaplast_gap',
         'node_id': 0,
         'sign': '>',
         'value': 53.5},
        {'child_id': 5,
         'feature': 'Quantity_features_90',
         'index': 'sum_sum',
         'node_id': 2,
         'sign': '<=',
         'value': 146.5}]
docstr_tok: ["Return","the","prediction","path","from","this","node","to","the","parent","node",".","Parameters","--","--","--","--","--","node_id",":","id","of","the","node","to","get","the","prediction","path",".","missing_id",":","Additional","info","that","contains","nodes","with","missing","features",".","Returns","--","--","--","-","list",":","The","list","of","decisions","(","top","to","bottom",")","from","the","root","to","this","node",".","Examples","--","--","--","--","..","sourcecode",":",":","python",">",">",">","tree.get_prediction_score","(","5",")","#","Any","node","[","{","'child_id","'",":","2",",","'feature","'",":","'Quantity_features_90","'",",","'index","'",":","'sum_timegaplast_gap","'",",","'node_id","'",":","0",",","'sign","'",":","'",">","'",",","'value","'",":","53.5","}",",","{","'child_id","'",":","5",",","'feature","'",":","'Quantity_features_90","'",",","'index","'",":","'sum_sum","'",",","'node_id","'",":","2",",","'sign","'",":","'","<","=","'",",","'value","'",":","146.5","}","]"]
code: def get_prediction_path(self, node_id, missing_id=[]):
      """
      Return the prediction path from this node to the parent node.
  
      Parameters
      ----------
      node_id    : id of the node to get the prediction path.
      missing_id : Additional info that contains nodes with missing features.
  
      Returns
      -------
      list: The list of decisions (top to bottom) from the root to this node.
  
      Examples
      --------
      .. sourcecode:: python
  
          >>> tree.get_prediction_score(5)  # Any node
           [{'child_id': 2,
             'feature': 'Quantity_features_90',
             'index': 'sum_timegaplast_gap',
             'node_id': 0,
             'sign': '>',
             'value': 53.5},
            {'child_id': 5,
             'feature': 'Quantity_features_90',
             'index': 'sum_sum',
             'node_id': 2,
             'sign': '<=',
             'value': 146.5}]
      """
      _raise_error_if_not_of_type(node_id, [int, long], "node_id")
      _numeric_param_check_range(
          "node_id", node_id, 0, self.num_nodes - 1
      )
  
      def _deduplicate_path(path):
          s_nodes = {}  # super_nodes
          s_path = []  # paths of super nodes.
  
          for node in path:
              feature = node["feature"]
              index = node["index"]
              if (feature, index) not in s_nodes:
                  s_nodes[feature, index] = node
                  s_path.append(node)
              else:
                  s_node = s_nodes[feature, index]
                  s_sign = s_node["sign"]
                  sign = node["sign"]
                  value = node["value"]
  
                  # Supernode has no range.
                  if s_sign == "<":
                      if sign == ">=":
                          s_node["value"] = [value, s_node["value"]]
                          s_node["sign"] = "in"
                      elif sign == "<":
                          s_node["value"] = value
                  elif s_sign == ">=":
                      if sign == ">=":
                          s_node["value"] = value
                      elif sign == "<":
                          s_node["value"] = [s_node["value"], value]
                          s_node["sign"] = "in"
  
                  # Supernode has a range.
                  elif s_sign == "in":
                      if sign == ">=":
                          s_node["value"][0] = value
                      elif sign == "<":
                          s_node["value"][1] = value
  
          # Return super node path.
          return s_path
  
      path = []
      node = self.nodes[node_id]
      while node.parent is not None:
          parent = node.parent
          is_missing = node.node_id in missing_id
          path.insert(0, parent.get_decision(node, is_missing))
          node = node.parent
      return _deduplicate_path(path)
  
imports: from __future__ import print_function
  from __future__ import division
  from __future__ import absolute_import
  from turicreate.util import _raise_error_if_not_of_type
  from turicreate.toolkits._internal_utils import _numeric_param_check_range
  import sys
label_desc: Use image node_id 8 for calling the DecisionTree obj's underlying member method code with example usage: obj.get_prediction_path(node_id, missing_id) and returns: _deduplicate_path, s_path