docstr: Asserts that two dicts are equal.
  
  The dicts can be arbitrarily nested and contain pandas data frames.
  
  Args:
    expected: the expected dict.
    actual: the actual dict
code: def _assert_dict_equal(
      self, expected: Dict[Any, Any], actual: Dict[Any, Any]
  ):
      """Asserts that two dicts are equal.
  
      The dicts can be arbitrarily nested and contain pandas data frames.
  
      Args:
        expected: the expected dict.
        actual: the actual dict
      """
      for key, expected_val in expected.items():
          self.assertIn(key, actual, f"Expected key: {key}")
          actual_val = actual[key]
          if isinstance(expected_val, dict):
              self.assertIsInstance(actual_val, dict)
              self._assert_dict_equal(expected_val, actual_val)
          elif isinstance(expected_val, pd.DataFrame):
              self.assertIsInstance(actual_val, pd.DataFrame)
              pd.testing.assert_frame_equal(expected_val, actual_val)
          else:
              self.assertEqual(expected_val, actual_val)
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from typing import Any, Dict
  from absl.testing import absltest
  from absl.testing import parameterized
  from google.protobuf import text_format
  import pandas
  from tensorflow_data_validation import constants
  from tensorflow_data_validation import types
  from tensorflow_data_validation.skew.protos import feature_skew_results_pb2
  from tensorflow_data_validation.utils import display_util
  from tensorflow_data_validation.utils import test_util
  from tensorflow_metadata.proto.v0 import anomalies_pb2
  from tensorflow_metadata.proto.v0 import schema_pb2
  from tensorflow_metadata.proto.v0 import statistics_pb2
label_desc: Use image node_id 1 for calling the DisplayUtilTest obj's underlying member method code with example usage: obj._assert_dict_equal(expected, actual) without return types