code: def summarize_dataframe(
      self,
      source: pd.DataFrame,
      name: str,
      target_dict: dict,
      skip: List[str],
  ):
      target_dict["name"] = name
      target_dict["num_rows"] = len(source)
      target_dict["num_columns"] = len(source.columns)
      target_dict["num_skipped_columns"] = len(source.columns) - len(
          [x for x in source.columns if x not in skip]
      )
  
      target_dict["memory_total"] = source.memory_usage(
          index=True, deep=True
      ).sum()
      if target_dict["num_rows"] > 0:
          target_dict["memory_single_row"] = (
              float(target_dict["memory_total"])
              / target_dict["num_rows"]
          )
      else:
          target_dict["memory_single_row"] = 0
  
      target_dict["duplicates"] = NumWithPercent(
          sum(source.duplicated()), len(source)
      )
      target_dict["num_cmp_not_in_source"] = 0
  
imports: from typing import Union, List, Tuple
  import os
  import time
  import pandas
  from numpy import isnan
  from tqdm.auto import tqdm
  from sweetviz.sv_types import NumWithPercent, FeatureToProcess, FeatureType
  import sweetviz.from_dython
  import sweetviz.series_analyzer
  import sweetviz.utils
  from sweetviz.graph_associations import GraphAssoc
  from sweetviz.graph_associations import CORRELATION_ERROR
  from sweetviz.graph_associations import CORRELATION_IDENTICAL
  from sweetviz.graph_legend import GraphLegend
  from sweetviz.config import config
  import sweetviz.comet_ml_logger
  import sweetviz.sv_html
  from sweetviz.feature_config import FeatureConfig
  import webbrowser
  from sweetviz.config import config
label_desc: Use image node_id 10 for calling the DataframeReport obj's underlying member method code with example usage: obj.summarize_dataframe(source, name, target_dict, skip) without return types