class_docstr: Search for various types of null values, including string representations of null.
  
  Parameters
  ----------
  null_string_list : Iterable[str] , default: None
      List of strings to be considered alternative null representations
  check_nan : bool , default: True
      Whether to add to null list to check also NaN values
  columns : Union[Hashable, List[Hashable]] , default: None
      Columns to check, if none are given checks all columns except ignored ones.
  ignore_columns : Union[Hashable, List[Hashable]] , default: None
      Columns to ignore, if none given checks based on columns variable
  n_top_columns : int , optional
      amount of columns to show ordered by feature importance (date, index, label are first)
  aggregation_method: t.Optional[str], default: 'max'
      {feature_aggregation_method_argument:2*indent}
  n_samples : int , default: 10_000_000
      number of samples to use for this check.
  random_state : int, default: 42
      random seed for all check internals.
class_docstr_tok: ["Search","for","various","types","of","null","values",",","including","string","representations","of","null",".","Parameters","--","--","--","--","--","null_string_list",":","Iterable","[","str","]",",","default",":","None","List","of","strings","to","be","considered","alternative","null","representations","check_nan",":","bool",",","default",":","True","Whether","to","add","to","null","list","to","check","also","NaN","values","columns",":","Union","[","Hashable",",","List","[","Hashable","]","]",",","default",":","None","Columns","to","check",",","if","none","are","given","checks","all","columns","except","ignored","ones",".","ignore_columns",":","Union","[","Hashable",",","List","[","Hashable","]","]",",","default",":","None","Columns","to","ignore",",","if","none","given","checks","based","on","columns","variable","n_top_columns",":","int",",","optional","amount","of","columns","to","show","ordered","by","feature","importance","(","date",",","index",",","label","are","first",")","aggregation_method",":","t.Optional","[","str","]",",","default",":","'max'","{","feature_aggregation_method_argument:2","*","indent","}","n_samples",":","int",",","default",":","10_000_000","number","of","samples","to","use","for","this","check",".","random_state",":","int",",","default",":","42","random","seed","for","all","check","internals","."]
docstr: Run check.
  
  Returns
  -------
  CheckResult
      Value is dict with columns as key, and dict of null values as value:
      {column: {null_value: {count: x, percent: y}, ...}, ...}
      display is DataFrame with columns ('Column Name', 'Value', 'Count', 'Percentage') for any column that
      has more than 1 null values.
docstr_tok: ["Run","check",".","Returns","--","--","--","-","CheckResult","Value","is","dict","with","columns","as","key",",","and","dict","of","null","values","as","value",":","{","column",":","{","null_value",":","{","count",":","x",",","percent",":","y","}",",","...","}",",","...","}","display","is","DataFrame","with","columns","(","'Column","Name","'",",","'Value","'",",","'Count","'",",","'Percentage","'",")","for","any","column","that","has","more","than","1","null","values","."]
code: def run_logic(self, context: Context, dataset_kind) -> CheckResult:
      """Run check.
  
      Returns
      -------
      CheckResult
          Value is dict with columns as key, and dict of null values as value:
          {column: {null_value: {count: x, percent: y}, ...}, ...}
          display is DataFrame with columns ('Column Name', 'Value', 'Count', 'Percentage') for any column that
          has more than 1 null values.
      """
      dataset = context.get_data_by_kind(dataset_kind).sample(
          self.n_samples, random_state=self.random_state
      )
      df = dataset.data
  
      df = select_from_dataframe(df, self.columns, self.ignore_columns)
      null_string_list = self._validate_null_string_list(
          self.null_string_list
      )
  
      feature_importance = (
          context.feature_importance
          if context.feature_importance is not None
          else pd.Series(index=list(df.columns), dtype=object)
      )
  
      # Result value
      display_array = []
      result_dict = {
          "n_samples": len(df),
          "columns": {},
          "feature_importance": feature_importance,
      }
  
      for column_name in list(df.columns):
          column_data = df[column_name]
          if is_categorical_dtype(column_data) is True:
              # NOTE:
              # 'pandas.Series.value_counts' and 'pandas.Series.apply'
              # work in an unusual way with categorical data types
              # - 'value_counts' returns all categorical values even if they are not in series
              # - 'apply' applies function to each category, not to values
              # therefore we processing categorical dtypes differently
              # NOTE:
              # 'Series.value_counts' method transforms null values like 'None', 'pd.Na', 'pd.NaT'
              # into 'np.nan' therefore it cannot be used for usual dtypes, because we will lose info
              # about all different null types in the column
              null_counts = {}
              for value, count in (
                  column_data.value_counts(dropna=False)
                  .to_dict()
                  .items()
              ):
                  if count > 0:
                      if pd.isna(value):
                          null_counts[nan_type(value)] = count
                      elif string_baseform(value) in null_string_list:
                          null_counts[
                              repr(value).replace("'", '"')
                          ] = count
          else:
              string_null_counts = {
                  repr(value).replace("'", '"'): count
                  for value, count in column_data.value_counts(
                      dropna=True
                  ).items()
                  if string_baseform(value) in null_string_list
              }
              nan_data_counts = (
                  column_data[column_data.isna()]
                  .apply(nan_type)
                  .value_counts()
                  .to_dict()
              )
              null_counts = {**string_null_counts, **nan_data_counts}
  
          result_dict["columns"][column_name] = {}
          # Save the column nulls info
          for null_value, count in null_counts.items():
              percent = count / len(column_data)
              display_array.append(
                  [
                      column_name,
                      null_value,
                      count,
                      format_percent(percent),
                  ]
              )
              result_dict["columns"][column_name][null_value] = {
                  "count": count,
                  "percent": percent,
              }
  
      # Create dataframe to display table
      if context.with_display and display_array:
          df_graph = pd.DataFrame(
              display_array,
              columns=[
                  "Column Name",
                  "Value",
                  "Count",
                  "Percent of data",
              ],
          )
          order = (
              df_graph["Column Name"]
              .value_counts(ascending=False)
              .index[: self.n_top_columns]
          )
          df_graph = df_graph.set_index(["Column Name", "Value"])
          df_graph = df_graph.loc[order, :]
          display = [N_TOP_MESSAGE % self.n_top_columns, df_graph]
      else:
          display = None
  
      return CheckResult(result_dict, display=display)
  
imports: import math
  from typing import Dict, Iterable, List, Optional, Union
  import numpy
  import pandas
  from pandas.api.types import is_categorical_dtype
  from deepchecks.core import CheckResult, ConditionCategory, ConditionResult
  from deepchecks.core.errors import DeepchecksValueError
  from deepchecks.core.reduce_classes import ReduceFeatureMixin
  from deepchecks.tabular import Context, SingleDatasetCheck
  from deepchecks.tabular._shared_docs import docstrings
  from deepchecks.tabular.utils.feature_importance import N_TOP_MESSAGE
  from deepchecks.tabular.utils.messages import get_condition_passed_message
  from deepchecks.utils.dataframes import select_from_dataframe
  from deepchecks.utils.strings import format_percent, string_baseform
  from deepchecks.utils.typing import Hashable
label_desc: Use image node_id 2 for calling the MixedNulls obj's underlying member method code with example usage: obj.run_logic(context, dataset_kind) and returns: CheckResult