code: def setUp(self) -> None:
      self.obsd1 = ObservationData(
          metric_names=["m1", "m2", "m2"],
          means=np.array([0.0, 0.0, 1.0]),
          covariance=np.array(
              [[1.0, 0.2, 0.4], [0.2, 2.0, 0.8], [0.4, 0.8, 3.0]]
          ),
      )
      self.obsd2 = ObservationData(
          metric_names=["m1", "m1", "m2", "m2"],
          means=np.array([1.0, 2.0, 2.0, 1.0]),
          covariance=np.array(
              [
                  [1.0, 0.0, 0.0, 0.0],
                  [0.0, 1.0, 0.2, 0.4],
                  [0.0, 0.2, 2.0, 0.8],
                  [0.0, 0.4, 0.8, 3.0],
              ]
          ),
      )
      self.observations = [
          Observation(features=ObservationFeatures({}), data=obsd)
          for obsd in [self.obsd1, self.obsd2]
      ]
      self.t = Winsorize(
          search_space=None,
          observations=deepcopy(self.observations),
          config={"winsorization_upper": 0.2},
      )
      self.t1 = Winsorize(
          search_space=None,
          observations=deepcopy(self.observations),
          config={"winsorization_upper": 0.8},
      )
      self.t2 = Winsorize(
          search_space=None,
          observations=deepcopy(self.observations),
          config={"winsorization_lower": 0.2},
      )
      self.t3 = Winsorize(
          search_space=None,
          observations=deepcopy(self.observations),
          config={
              "winsorization_upper": 0.6,
              "percentile_bounds": {
                  "m1": (None, None),
                  "m2": (None, 1.9),
              },
          },
      )
      self.t4 = Winsorize(
          search_space=None,
          observations=deepcopy(self.observations),
          config={
              "winsorization_lower": 0.8,
              "percentile_bounds": {
                  "m1": (None, None),
                  "m2": (0.3, None),
              },
          },
      )
  
      self.obs3 = Observation(
          features=ObservationFeatures({}),
          data=ObservationData(
              metric_names=["m3", "m3", "m3", "m3"],
              means=np.array([0.0, 1.0, 5.0, 3.0]),
              covariance=np.eye(4),
          ),
      )
      self.t5 = Winsorize(
          search_space=None,
          observations=deepcopy(self.observations)
          + [deepcopy(self.obs3)],
          config={
              "winsorization_lower": {"m2": 0.4},
              "winsorization_upper": {"m1": 0.6},
          },
      )
      self.t6 = Winsorize(
          search_space=None,
          observations=deepcopy(self.observations),
          config={
              "winsorization_lower": {"m2": 0.4},
              "winsorization_upper": {"m1": 0.6},
              "percentile_bounds": {
                  "m1": (None, None),
                  "m2": (0.0, None),  # This should leave m2 untouched
              },
          },
      )
  
file_path: Ax/ax/modelbridge/transforms/tests/test_winsorize_legacy_transform.py
imports: import warnings
  from copy import deepcopy
  import numpy
  from ax.core.observation import Observation, ObservationData, ObservationFeatures
  from ax.exceptions.core import DataRequiredError
  from ax.modelbridge.transforms.winsorize import Winsorize
  from ax.utils.common.testutils import TestCase
label_desc: Use image node_id 1 for calling the WinsorizeTransformTestLegacy obj's underlying member method code with example usage: obj.setUp() without return types