Skip to content

Commit 548d48f

Browse files
committed
Added index to assert message when values differ
1 parent 2b34275 commit 548d48f

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed

pandas/_libs/testing.pyx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ cpdef assert_dict_equal(a, b, bint compare_keys=True):
6565
cpdef assert_almost_equal(a, b,
6666
check_less_precise=False,
6767
bint check_dtype=True,
68-
obj=None, lobj=None, robj=None):
68+
obj=None, lobj=None, robj=None, index=None):
6969
"""
7070
Check that left and right objects are almost equal.
7171
@@ -89,6 +89,9 @@ cpdef assert_almost_equal(a, b,
8989
robj : str, default None
9090
Specify right object name being compared, internally used to show
9191
appropriate assertion message
92+
index : str, default None
93+
Specify shared index of objects being compared, internally used to
94+
show appropriate assertion message
9295
"""
9396
cdef:
9497
int decimal
@@ -171,7 +174,7 @@ cpdef assert_almost_equal(a, b,
171174
from pandas._testing import raise_assert_detail
172175
msg = (f"{obj} values are different "
173176
f"({np.round(diff * 100.0 / na, 5)} %)")
174-
raise_assert_detail(obj, msg, lobj, robj)
177+
raise_assert_detail(obj, msg, lobj, robj, index=index)
175178

176179
return True
177180

pandas/_testing.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -888,9 +888,16 @@ def assert_timedelta_array_equal(left, right, obj="TimedeltaArray"):
888888
assert_attr_equal("freq", left, right, obj=obj)
889889

890890

891-
def raise_assert_detail(obj, message, left, right, diff=None):
891+
def raise_assert_detail(obj, message, left, right, diff=None, index=None):
892892
__tracebackhide__ = True
893893

894+
msg = f"""{obj} are different
895+
896+
{message}"""
897+
898+
if isinstance(index, np.ndarray):
899+
msg += f"\n[index]: {pprint_thing(index)}"
900+
894901
if isinstance(left, np.ndarray):
895902
left = pprint_thing(left)
896903
elif is_categorical_dtype(left):
@@ -901,9 +908,10 @@ def raise_assert_detail(obj, message, left, right, diff=None):
901908
elif is_categorical_dtype(right):
902909
right = repr(right)
903910

904-
msg = f"""{obj} are different
911+
if isinstance(index, np.ndarray):
912+
index = pprint_thing(index)
905913

906-
{message}
914+
msg += f"""
907915
[left]: {left}
908916
[right]: {right}"""
909917

@@ -921,6 +929,7 @@ def assert_numpy_array_equal(
921929
err_msg=None,
922930
check_same=None,
923931
obj="numpy array",
932+
index=None,
924933
):
925934
"""
926935
Check that 'np.ndarray' is equivalent.
@@ -940,6 +949,8 @@ def assert_numpy_array_equal(
940949
obj : str, default 'numpy array'
941950
Specify object name being compared, internally used to show appropriate
942951
assertion message.
952+
index : numpy.ndarray
953+
optional index (shared by both left and right), used in output.
943954
"""
944955
__tracebackhide__ = True
945956

@@ -977,7 +988,7 @@ def _raise(left, right, err_msg):
977988

978989
diff = diff * 100.0 / left.size
979990
msg = f"{obj} values are different ({np.round(diff, 5)} %)"
980-
raise_assert_detail(obj, msg, left, right)
991+
raise_assert_detail(obj, msg, left, right, index=index)
981992

982993
raise AssertionError(err_msg)
983994

@@ -1142,7 +1153,8 @@ def assert_series_equal(
11421153
raise AssertionError("check_exact may only be used with numeric Series")
11431154

11441155
assert_numpy_array_equal(
1145-
left._values, right._values, check_dtype=check_dtype, obj=str(obj)
1156+
left._values, right._values, check_dtype=check_dtype, obj=str(obj),
1157+
index = left.index._internal_get_values()
11461158
)
11471159
elif check_datetimelike_compat and (
11481160
needs_i8_conversion(left.dtype) or needs_i8_conversion(right.dtype)
@@ -1181,6 +1193,7 @@ def assert_series_equal(
11811193
check_less_precise=check_less_precise,
11821194
check_dtype=check_dtype,
11831195
obj=str(obj),
1196+
index=left.index._internal_get_values(),
11841197
)
11851198

11861199
# metadata comparison

pandas/tests/util/test_assert_frame_equal.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ def test_frame_equal_block_mismatch(by_blocks_fixture, obj_fixture):
177177
msg = f"""{obj}\\.iloc\\[:, 1\\] \\(column name="B"\\) are different
178178
179179
{obj}\\.iloc\\[:, 1\\] \\(column name="B"\\) values are different \\(33\\.33333 %\\)
180+
\\[index\\]: \\[0, 1, 2\\]
180181
\\[left\\]: \\[4, 5, 6\\]
181182
\\[right\\]: \\[4, 5, 7\\]"""
182183

@@ -196,6 +197,7 @@ def test_frame_equal_block_mismatch(by_blocks_fixture, obj_fixture):
196197
"""{obj}\\.iloc\\[:, 1\\] \\(column name="E"\\) are different
197198
198199
{obj}\\.iloc\\[:, 1\\] \\(column name="E"\\) values are different \\(33\\.33333 %\\)
200+
\\[index\\]: \\[0, 1, 2\\]
199201
\\[left\\]: \\[é, è, ë\\]
200202
\\[right\\]: \\[é, è, e̊\\]""",
201203
),
@@ -205,6 +207,7 @@ def test_frame_equal_block_mismatch(by_blocks_fixture, obj_fixture):
205207
"""{obj}\\.iloc\\[:, 0\\] \\(column name="A"\\) are different
206208
207209
{obj}\\.iloc\\[:, 0\\] \\(column name="A"\\) values are different \\(100\\.0 %\\)
210+
\\[index\\]: \\[0, 1, 2\\]
208211
\\[left\\]: \\[á, à, ä\\]
209212
\\[right\\]: \\[a, a, a\\]""",
210213
),

pandas/tests/util/test_assert_series_equal.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,14 @@ def test_series_equal_length_mismatch(check_less_precise):
162162

163163
with pytest.raises(AssertionError, match=msg):
164164
tm.assert_series_equal(s1, s2, check_less_precise=check_less_precise)
165+
print("No Exception")
165166

166167

167168
def test_series_equal_values_mismatch(check_less_precise):
168169
msg = """Series are different
169170
170171
Series values are different \\(33\\.33333 %\\)
172+
\\[index\\]: \\[0, 1, 2\\]
171173
\\[left\\]: \\[1, 2, 3\\]
172174
\\[right\\]: \\[1, 2, 4\\]"""
173175

0 commit comments

Comments
 (0)