class_docstr: Standardize Y, separately for each metric.
  
  Transform is done in-place.
class_docstr_tok: ["Standardize","Y",",","separately","for","each","metric",".","Transform","is","done","in-place","."]
code: def _transform_observation_data(
      self,
      observation_data: List[ObservationData],
  ) -> List[ObservationData]:
      # Transform observation data
      for obsd in observation_data:
          means = np.array([self.Ymean[m] for m in obsd.metric_names])
          stds = np.array([self.Ystd[m] for m in obsd.metric_names])
          obsd.means = (obsd.means - means) / stds
          obsd.covariance /= np.dot(
              stds[:, None], stds[:, None].transpose()
          )
      return observation_data
  
imports: from logging import Logger
  from typing import DefaultDict, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
  import numpy
  from ax.core.observation import Observation, ObservationData, ObservationFeatures
  from ax.core.optimization_config import OptimizationConfig
  from ax.core.outcome_constraint import OutcomeConstraint, ScalarizedOutcomeConstraint
  from ax.core.search_space import SearchSpace
  from ax.core.types import TParamValue
  from ax.exceptions.core import DataRequiredError
  from ax.modelbridge.transforms.base import Transform
  from ax.modelbridge.transforms.utils import get_data
  from ax.models.types import TConfig
  from ax.utils.common.logger import get_logger
label_desc: Use image node_id 2 for calling the StandardizeY obj's underlying member method code with example usage: obj._transform_observation_data(observation_data) and returns: observation_data