docstr: Called before build_data, which does preprocessing, handling missing values, adding metadata to
  training_set_metadata.
  
  :param df: The dataset.
  :type df: pd.DataFrame
  :param mode: "prediction", "training", or None.
docstr_tok: ["Called","before","build_data",",","which","does","preprocessing",",","handling","missing","values",",","adding","metadata","to","training_set_metadata",".",":","param","df",":","The","dataset",".",":","type","df",":","pd.DataFrame",":","param","mode",":","``","prediction","''",",","``","training","''",",","or","None","."]
code: def on_build_data_start(self, df, mode):
      """Called before build_data, which does preprocessing, handling missing values, adding metadata to
      training_set_metadata.
  
      :param df: The dataset.
      :type df: pd.DataFrame
      :param mode: "prediction", "training", or None.
      """
      pass
  
imports: from abc import ABC
  from typing import Any, Callable, Dict, List, Union
  from ludwig.api_annotations import PublicAPI
  from ludwig.types import HyperoptConfigDict, ModelConfigDict, TrainingSetMetadataDict
label_desc: Use image node_id 34 for calling the Callback obj's underlying member method code with example usage: obj.on_build_data_start(df, mode) without return types