code: def _run(self, output_directory):
      run_start_time = time.time()
  
      # read ingested dataset
      ingested_data_path = get_step_output_path(
          recipe_root_path=self.recipe_root,
          step_name="ingest",
          relative_path=_INPUT_FILE_NAME,
      )
      input_df = pd.read_parquet(ingested_data_path)
      validate_classification_config(
          self.task, self.positive_class, input_df, self.target_col
      )
  
      # drop rows which target value is missing
      raw_input_num_rows = len(input_df)
      # Make sure the target column is actually present in the input DF.
      if self.target_col not in input_df.columns:
          raise MlflowException(
              f"Target column '{self.target_col}' not found in ingested dataset.",
              error_code=INVALID_PARAMETER_VALUE,
          )
      input_df = input_df.dropna(how="any", subset=[self.target_col])
      self.num_dropped_rows = raw_input_num_rows - len(input_df)
  
      # split dataset
      if self.step_config["using"] == "custom":
          train_df, validation_df, test_df = self._run_custom_split(
              input_df
          )
      else:
          train_df, validation_df, test_df = _run_split(
              self.task, input_df, self.split_ratios, self.target_col
          )
      # Import from user function module to process dataframes
      post_split_config = self.step_config.get(
          "post_split_method", None
      )
      post_split_filter_config = self.step_config.get(
          "post_split_filter_method", None
      )
      if post_split_config is not None:
          sys.path.append(self.recipe_root)
          post_split = getattr(
              importlib.import_module(_USER_DEFINED_SPLIT_STEP_MODULE),
              post_split_config,
          )
          _logger.debug(
              f"Running {post_split_config} on train, validation and test datasets."
          )
          (
              train_df,
              validation_df,
              test_df,
          ) = _validate_user_code_output(
              post_split, train_df, validation_df, test_df
          )
  
      elif post_split_filter_config is not None:
          sys.path.append(self.recipe_root)
          post_split_filter = getattr(
              importlib.import_module(_USER_DEFINED_SPLIT_STEP_MODULE),
              post_split_filter_config,
          )
          _logger.debug(
              f"Running {post_split_filter_config} on train, validation and test datasets."
          )
          train_df = train_df[post_split_filter(train_df)]
  
      if min(len(train_df), len(validation_df), len(test_df)) < 4:
          raise MlflowException(
              f"Train, validation, and testing datasets cannot be less than 4 rows. Train has "
              f"{len(train_df)} rows, validation has {len(validation_df)} rows, and test has "
              f"{len(test_df)} rows.",
              error_code=BAD_REQUEST,
          )
      # Output train / validation / test splits
      train_df.to_parquet(
          os.path.join(output_directory, _OUTPUT_TRAIN_FILE_NAME)
      )
      validation_df.to_parquet(
          os.path.join(output_directory, _OUTPUT_VALIDATION_FILE_NAME)
      )
      test_df.to_parquet(
          os.path.join(output_directory, _OUTPUT_TEST_FILE_NAME)
      )
  
      self.run_end_time = time.time()
      self.execution_duration = self.run_end_time - run_start_time
      return self._build_profiles_and_card(
          train_df, validation_df, test_df
      )
  
imports: import importlib
  import logging
  import os
  import sys
  import time
  from enum import Enum
  from functools import partial
  from multiprocessing.pool import Pool, ThreadPool
  import numpy
  import pandas
  from mlflow.exceptions import BAD_REQUEST, INVALID_PARAMETER_VALUE, MlflowException
  from mlflow.recipes.artifacts import DataframeArtifact
  from mlflow.recipes.cards import BaseCard
  from mlflow.recipes.step import BaseStep, StepClass
  from mlflow.recipes.utils.execution import get_step_output_path
  from mlflow.recipes.utils.step import get_pandas_data_profiles, validate_classification_config
  from mlflow.store.artifact.artifact_repo import _NUM_DEFAULT_CPUS
  from mlflow.utils.time import Timer
label_desc: Use image node_id 5 for calling the SplitStep obj's underlying member method code with example usage: obj._run(output_directory) and returns: self