code: def run(df, configs, preprocessed=False):
      """
  
      :param df:
      :param ref_groups_method:
      :param configs:
      :param report:
      :return:
      """
      group_value_df = None
      if df is not None:
          if "model_id" in df.columns:
              model_df_list = []
              report_list = []
              for model_id in df.model_id.unique():
                  model_df, model_report = audit(
                      df.loc[df["model_id"] == model_id],
                      configs=configs,
                      preprocessed=preprocessed,
                  )
                  model_df_list.append(model_df)
                  report_list.append(model_report)
              group_value_df = pd.concat(model_df_list)
              report = "\n".join(report_list)
  
          else:
              group_value_df, report = audit(
                  df, configs=configs, preprocessed=preprocessed
              )
      else:
          logging.error(
              "run_csv: could not load a proper dataframe from the input filepath provided."
          )
          exit(1)
      # print(report)
      return group_value_df, report
  
imports: import argparse
  import logging
  from sys import exit
  import pandas
  from aequitas.bias import Bias
  from aequitas.fairness import Fairness
  from aequitas.group import Group
  from aequitas.plotting import Plot
  from aequitas.preprocessing import preprocess_input_df
  from .utils.configs_loader import Configs
  from .utils.io import get_csv_data
  from .utils.io import get_db_data
  from .utils.io import get_engine
  from .utils.io import push_tocsv
  from .utils.io import push_todb
  from .utils.io import push_topdf
  from .utils.report import audit_report_markdown
label_desc: Use image node_id 3 for calling a global function with example usage: run(df, configs, preprocessed) and returns: group_value_df,  report