code: def extraction_data_statistics(path):
      """Generates data statistics for the given data extraction setup stored
      in Xcessiv notebook.
  
      This is in rqtasks.py but not as a job yet. Temporarily call this directly
      while I'm figuring out Javascript lel.
  
      Args:
          path (str, unicode): Path to xcessiv notebook
      """
      with functions.DBContextManager(path) as session:
          extraction = session.query(models.Extraction).first()
          X, y = extraction.return_main_dataset()
          functions.verify_dataset(X, y)
  
          if extraction.test_dataset["method"] == "split_from_main":
              X, X_test, y, y_test = train_test_split(
                  X,
                  y,
                  test_size=extraction.test_dataset["split_ratio"],
                  random_state=extraction.test_dataset["split_seed"],
                  stratify=y,
              )
          elif extraction.test_dataset["method"] == "source":
              if (
                  "source" not in extraction.test_dataset
                  or not extraction.test_dataset["source"]
              ):
                  raise exceptions.UserError("Source is empty")
  
              extraction_code = extraction.test_dataset["source"]
              extraction_function = (
                  functions.import_object_from_string_code(
                      extraction_code, "extract_test_dataset"
                  )
              )
              X_test, y_test = extraction_function()
          else:
              X_test, y_test = None, None
  
          # test base learner cross-validation
          extraction_code = extraction.meta_feature_generation["source"]
          return_splits_iterable = (
              functions.import_object_from_string_code(
                  extraction_code, "return_splits_iterable"
              )
          )
          number_of_splits = 0
          test_indices = []
          try:
              for train_idx, test_idx in return_splits_iterable(X, y):
                  number_of_splits += 1
                  test_indices.append(test_idx)
          except Exception as e:
              raise exceptions.UserError(
                  "User code exception", exception_message=str(e)
              )
  
          # preparation before testing stacked ensemble cross-validation
          test_indices = np.concatenate(test_indices)
          X, y = X[test_indices], y[test_indices]
  
          # test stacked ensemble cross-validation
          extraction_code = extraction.stacked_ensemble_cv["source"]
          return_splits_iterable = (
              functions.import_object_from_string_code(
                  extraction_code, "return_splits_iterable"
              )
          )
          number_of_splits_stacked_cv = 0
          try:
              for train_idx, test_idx in return_splits_iterable(X, y):
                  number_of_splits_stacked_cv += 1
          except Exception as e:
              raise exceptions.UserError(
                  "User code exception", exception_message=str(e)
              )
  
          data_stats = dict()
          data_stats["train_data_stats"] = functions.verify_dataset(
              X, y
          )
          if X_test is not None:
              data_stats["test_data_stats"] = functions.verify_dataset(
                  X_test, y_test
              )
          else:
              data_stats["test_data_stats"] = None
          data_stats["holdout_data_stats"] = {
              "number_of_splits": number_of_splits
          }
          data_stats["stacked_ensemble_cv_stats"] = {
              "number_of_splits": number_of_splits_stacked_cv
          }
  
          extraction.data_statistics = data_stats
  
          session.add(extraction)
          session.commit()
  
file_path: xcessiv/xcessiv/rqtasks.py
imports: from __future__ import absolute_import, print_function, division, unicode_literals
  from rq.decorators import job
  from rq import get_current_job
  from xcessiv import functions
  from xcessiv import exceptions
  from xcessiv import models
  from xcessiv import automatedruns
  import numpy
  import os
  import sys
  import traceback
  from sklearn.model_selection import train_test_split
  from six import iteritems
label_desc: Use image node_id 1 for calling a global function with example usage: extraction_data_statistics(path) without return types