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}]

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)