code: def separate_observations(
      observations: List[Observation], copy: bool = False
  ) -> Tuple[List[ObservationFeatures], List[ObservationData]]:
      """Split out observations into features+data.
  
      Args:
          observations: input observations
  
      Returns:
          observation_features: ObservationFeatures
          observation_data: ObservationData
      """
      if copy:
          observation_features = [
              deepcopy(obs.features) for obs in observations
          ]
          observation_data = [
              deepcopy(obs.data) for obs in observations
          ]
      else:
          observation_features = [obs.features for obs in observations]
          observation_data = [obs.data for obs in observations]
      return observation_features, observation_data
  
imports: from __future__ import annotations
  import json
  import warnings
  from copy import deepcopy
  from typing import Dict, Iterable, List, Optional, Set, Tuple
  import ax.core.experiment
  import numpy
  import pandas
  from ax.core.arm import Arm
  from ax.core.batch_trial import BatchTrial
  from ax.core.data import Data
  from ax.core.map_data import MapData
  from ax.core.types import TCandidateMetadata, TParameterization
  from ax.utils.common.base import Base
  from ax.utils.common.constants import Keys
  from ax.utils.common.typeutils import not_none
label_desc: Use image node_id 6 for calling a global function with example usage: separate_observations(observations, copy) and returns: observation_features,  observation_data