code: def process_data(
      outcome_name: str,
      X_train: np.ndarray,
      outcome_train: np.ndarray,
      X_validation: np.ndarray,
      outcome_validation: np.ndarray,
      transformation_list: List,
  ):
      """
      We process the data by first training the estimators in the transformation_list on ``X_train`` and ``outcome_train``.
      We then apply the estimators on ``X_validation`` to get the value of the dummy outcome, which we store in ``outcome_validation``.
  
      :param X_train: The data of the covariates which is used to train an estimator. It corresponds to the data of a single category of the treatment
      :type X_train: np.ndarray
      :param outcome_train: This is used to hold the intermediate values of the outcome variable in the transformation list
      :type outcome_train: np.ndarray
  
      For Example:
  
      ``[ ('permute', {'permute_fraction': val} ), (func,func_params)]``
  
      The value obtained from permutation is used as an input for the custom estimator.
  
      :param X_validation: The data of the covariates that is fed to a trained estimator to generate a dummy outcome
      :type X_validation: np.ndarray
      :param outcome_validation: This variable stores the dummy_outcome generated by the transformations
      :type outcome_validation: np.ndarray
      :param transformation_list: The list of transformations on the outcome data required to produce a dummy outcome
      :type transformation_list: np.ndarray
      """
      for action, func_args in transformation_list:
          if callable(action):
              estimator = action(X_train, outcome_train, **func_args)
              outcome_train = estimator(X_train)
              outcome_validation = estimator(X_validation)
          elif action in SUPPORTED_ESTIMATORS:
              estimator = _estimate_dummy_outcome(
                  action, X_train, outcome_train, **func_args
              )
              outcome_train = estimator(X_train)
              outcome_validation = estimator(X_validation)
          elif action == "noise":
              if X_train is not None:
                  outcome_train = noise(outcome_train, **func_args)
              outcome_validation = noise(
                  outcome_validation, **func_args
              )
          elif action == "permute":
              if X_train is not None:
                  outcome_train = permute(
                      outcome_name, outcome_train, **func_args
                  )
              outcome_validation = permute(
                  outcome_name, outcome_validation, **func_args
              )
          elif action == "zero":
              if X_train is not None:
                  outcome_train = np.zeros(outcome_train.shape)
              outcome_validation = np.zeros(outcome_validation.shape)
  
      return outcome_validation
  
imports: import copy
  import logging
  from collections import OrderedDict, namedtuple
  from typing import Callable, List, Optional, Union
  import numpy
  import pandas
  from sklearn.ensemble import RandomForestRegressor
  from sklearn.linear_model import LinearRegression
  from sklearn.neighbors import KNeighborsRegressor
  from sklearn.neural_network import MLPRegressor
  from sklearn.svm import SVR
  from tqdm.auto import tqdm
  from dowhy.causal_estimator import CausalEstimate
  from dowhy.causal_estimators.econml import Econml
  from dowhy.causal_identifier.identified_estimand import IdentifiedEstimand
  from dowhy.causal_refuter import CausalRefutation, CausalRefuter, choose_variables, test_significance
label_desc: Use image node_id 2 for calling a global function with example usage: process_data(outcome_name, X_train, outcome_train, X_validation, outcome_validation, transformation_list) and returns: outcome_validation