test_assert_index_equal.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. import pytest
  4. from pandas import Categorical, Index, MultiIndex, NaT
  5. from pandas.util.testing import assert_index_equal
  6. def test_index_equal_levels_mismatch():
  7. msg = """Index are different
  8. Index levels are different
  9. \\[left\\]: 1, Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\)
  10. \\[right\\]: 2, MultiIndex\\(levels=\\[\\[u?'A', u?'B'\\], \\[1, 2, 3, 4\\]\\],
  11. codes=\\[\\[0, 0, 1, 1\\], \\[0, 1, 2, 3\\]\\]\\)"""
  12. idx1 = Index([1, 2, 3])
  13. idx2 = MultiIndex.from_tuples([("A", 1), ("A", 2),
  14. ("B", 3), ("B", 4)])
  15. with pytest.raises(AssertionError, match=msg):
  16. assert_index_equal(idx1, idx2, exact=False)
  17. def test_index_equal_values_mismatch(check_exact):
  18. msg = """MultiIndex level \\[1\\] are different
  19. MultiIndex level \\[1\\] values are different \\(25\\.0 %\\)
  20. \\[left\\]: Int64Index\\(\\[2, 2, 3, 4\\], dtype='int64'\\)
  21. \\[right\\]: Int64Index\\(\\[1, 2, 3, 4\\], dtype='int64'\\)"""
  22. idx1 = MultiIndex.from_tuples([("A", 2), ("A", 2),
  23. ("B", 3), ("B", 4)])
  24. idx2 = MultiIndex.from_tuples([("A", 1), ("A", 2),
  25. ("B", 3), ("B", 4)])
  26. with pytest.raises(AssertionError, match=msg):
  27. assert_index_equal(idx1, idx2, check_exact=check_exact)
  28. def test_index_equal_length_mismatch(check_exact):
  29. msg = """Index are different
  30. Index length are different
  31. \\[left\\]: 3, Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\)
  32. \\[right\\]: 4, Int64Index\\(\\[1, 2, 3, 4\\], dtype='int64'\\)"""
  33. idx1 = Index([1, 2, 3])
  34. idx2 = Index([1, 2, 3, 4])
  35. with pytest.raises(AssertionError, match=msg):
  36. assert_index_equal(idx1, idx2, check_exact=check_exact)
  37. def test_index_equal_class_mismatch(check_exact):
  38. msg = """Index are different
  39. Index classes are different
  40. \\[left\\]: Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\)
  41. \\[right\\]: Float64Index\\(\\[1\\.0, 2\\.0, 3\\.0\\], dtype='float64'\\)"""
  42. idx1 = Index([1, 2, 3])
  43. idx2 = Index([1, 2, 3.0])
  44. with pytest.raises(AssertionError, match=msg):
  45. assert_index_equal(idx1, idx2, exact=True, check_exact=check_exact)
  46. def test_index_equal_values_close(check_exact):
  47. idx1 = Index([1, 2, 3.])
  48. idx2 = Index([1, 2, 3.0000000001])
  49. if check_exact:
  50. msg = """Index are different
  51. Index values are different \\(33\\.33333 %\\)
  52. \\[left\\]: Float64Index\\(\\[1.0, 2.0, 3.0], dtype='float64'\\)
  53. \\[right\\]: Float64Index\\(\\[1.0, 2.0, 3.0000000001\\], dtype='float64'\\)"""
  54. with pytest.raises(AssertionError, match=msg):
  55. assert_index_equal(idx1, idx2, check_exact=check_exact)
  56. else:
  57. assert_index_equal(idx1, idx2, check_exact=check_exact)
  58. def test_index_equal_values_less_close(check_exact, check_less_precise):
  59. idx1 = Index([1, 2, 3.])
  60. idx2 = Index([1, 2, 3.0001])
  61. kwargs = dict(check_exact=check_exact,
  62. check_less_precise=check_less_precise)
  63. if check_exact or not check_less_precise:
  64. msg = """Index are different
  65. Index values are different \\(33\\.33333 %\\)
  66. \\[left\\]: Float64Index\\(\\[1.0, 2.0, 3.0], dtype='float64'\\)
  67. \\[right\\]: Float64Index\\(\\[1.0, 2.0, 3.0001\\], dtype='float64'\\)"""
  68. with pytest.raises(AssertionError, match=msg):
  69. assert_index_equal(idx1, idx2, **kwargs)
  70. else:
  71. assert_index_equal(idx1, idx2, **kwargs)
  72. def test_index_equal_values_too_far(check_exact, check_less_precise):
  73. idx1 = Index([1, 2, 3])
  74. idx2 = Index([1, 2, 4])
  75. kwargs = dict(check_exact=check_exact,
  76. check_less_precise=check_less_precise)
  77. msg = """Index are different
  78. Index values are different \\(33\\.33333 %\\)
  79. \\[left\\]: Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\)
  80. \\[right\\]: Int64Index\\(\\[1, 2, 4\\], dtype='int64'\\)"""
  81. with pytest.raises(AssertionError, match=msg):
  82. assert_index_equal(idx1, idx2, **kwargs)
  83. def test_index_equal_level_values_mismatch(check_exact, check_less_precise):
  84. idx1 = MultiIndex.from_tuples([("A", 2), ("A", 2),
  85. ("B", 3), ("B", 4)])
  86. idx2 = MultiIndex.from_tuples([("A", 1), ("A", 2),
  87. ("B", 3), ("B", 4)])
  88. kwargs = dict(check_exact=check_exact,
  89. check_less_precise=check_less_precise)
  90. msg = """MultiIndex level \\[1\\] are different
  91. MultiIndex level \\[1\\] values are different \\(25\\.0 %\\)
  92. \\[left\\]: Int64Index\\(\\[2, 2, 3, 4\\], dtype='int64'\\)
  93. \\[right\\]: Int64Index\\(\\[1, 2, 3, 4\\], dtype='int64'\\)"""
  94. with pytest.raises(AssertionError, match=msg):
  95. assert_index_equal(idx1, idx2, **kwargs)
  96. @pytest.mark.parametrize("name1,name2", [
  97. (None, "x"), ("x", "x"), (np.nan, np.nan), (NaT, NaT), (np.nan, NaT)
  98. ])
  99. def test_index_equal_names(name1, name2):
  100. msg = """Index are different
  101. Attribute "names" are different
  102. \\[left\\]: \\[{name1}\\]
  103. \\[right\\]: \\[{name2}\\]"""
  104. idx1 = Index([1, 2, 3], name=name1)
  105. idx2 = Index([1, 2, 3], name=name2)
  106. if name1 == name2 or name1 is name2:
  107. assert_index_equal(idx1, idx2)
  108. else:
  109. name1 = "u?'x'" if name1 == "x" else name1
  110. name2 = "u?'x'" if name2 == "x" else name2
  111. msg = msg.format(name1=name1, name2=name2)
  112. with pytest.raises(AssertionError, match=msg):
  113. assert_index_equal(idx1, idx2)
  114. def test_index_equal_category_mismatch(check_categorical):
  115. msg = """Index are different
  116. Attribute "dtype" are different
  117. \\[left\\]: CategoricalDtype\\(categories=\\[u?'a', u?'b'\\], ordered=False\\)
  118. \\[right\\]: CategoricalDtype\\(categories=\\[u?'a', u?'b', u?'c'\\], \
  119. ordered=False\\)"""
  120. idx1 = Index(Categorical(["a", "b"]))
  121. idx2 = Index(Categorical(["a", "b"], categories=["a", "b", "c"]))
  122. if check_categorical:
  123. with pytest.raises(AssertionError, match=msg):
  124. assert_index_equal(idx1, idx2, check_categorical=check_categorical)
  125. else:
  126. assert_index_equal(idx1, idx2, check_categorical=check_categorical)