code: def split(
      self,
      df: DataFrame,
      backend: Backend,
      random_seed: float = default_random_seed,
  ) -> Tuple[DataFrame, DataFrame, DataFrame]:
      if not backend.df_engine.partitioned:
          return stratify_split_dataframe(
              df, self.column, self.probabilities, backend, random_seed
          )
  
      # For a partitioned dataset, we can stratify split each partition individually
      # to obtain a global stratified split.
  
      def split_partition(partition: DataFrame) -> DataFrame:
          """Splits a single partition into train, val, test.
  
          Returns a single DataFrame with the split column populated. Assumes that the split column is already present
          in the partition and has a default value of 0 (train).
          """
          _, val, test = stratify_split_dataframe(
              partition,
              self.column,
              self.probabilities,
              backend,
              random_seed,
          )
          # Split column defaults to train, so only need to update val and test
          partition.loc[val.index, TMP_SPLIT_COL] = 1
          partition.loc[test.index, TMP_SPLIT_COL] = 2
          return partition
  
      df[TMP_SPLIT_COL] = 0
      df = backend.df_engine.map_partitions(
          df, split_partition, meta=df
      )
  
      df_train = df[df[TMP_SPLIT_COL] == 0].drop(columns=TMP_SPLIT_COL)
      df_val = df[df[TMP_SPLIT_COL] == 1].drop(columns=TMP_SPLIT_COL)
      df_test = df[df[TMP_SPLIT_COL] == 2].drop(columns=TMP_SPLIT_COL)
  
      return df_train, df_val, df_test
  
imports: import logging
  from abc import ABC, abstractmethod
  from typing import List, Optional, Tuple, TYPE_CHECKING
  from zlib import crc32
  import numpy
  from sklearn.model_selection import train_test_split
  from ludwig.api_annotations import DeveloperAPI
  from ludwig.backend.base import Backend
  from ludwig.constants import BINARY, CATEGORY, DATE, MIN_DATASET_SPLIT_ROWS, SPLIT
  from ludwig.error import ConfigValidationError
  from ludwig.schema.split import DateTimeSplitConfig, FixedSplitConfig, HashSplitConfig, RandomSplitConfig, StratifySplitConfig
  from ludwig.types import ModelConfigDict, PreprocessingConfigDict
  from ludwig.utils.data_utils import hash_dict, split_dataset_ttv
  from ludwig.utils.defaults import default_random_seed
  from ludwig.utils.registry import Registry
  from ludwig.utils.types import DataFrame
label_desc: Use image node_id 2 for calling the StratifySplitter obj's underlying member method code with example usage: obj.split(df, backend, random_seed) and returns: df_train,  df_val,  df_test, stratify_split_dataframe, partition