Skip to content

Commit ca738e0

Browse files
committed
Added index to assert message when values differ
1 parent 92745fc commit ca738e0

File tree

4 files changed

+27
-6
lines changed

4 files changed

+27
-6
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: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -904,9 +904,16 @@ def assert_timedelta_array_equal(left, right, obj="TimedeltaArray"):
904904
assert_attr_equal("freq", left, right, obj=obj)
905905

906906

907-
def raise_assert_detail(obj, message, left, right, diff=None):
907+
def raise_assert_detail(obj, message, left, right, diff=None, index=None):
908908
__tracebackhide__ = True
909909

910+
msg = f"""{obj} are different
911+
912+
{message}"""
913+
914+
if isinstance(index, np.ndarray):
915+
msg += f"\n[index]: {pprint_thing(index)}"
916+
910917
if isinstance(left, np.ndarray):
911918
left = pprint_thing(left)
912919
elif is_categorical_dtype(left):
@@ -917,9 +924,10 @@ def raise_assert_detail(obj, message, left, right, diff=None):
917924
elif is_categorical_dtype(right):
918925
right = repr(right)
919926

920-
msg = f"""{obj} are different
927+
if isinstance(index, np.ndarray):
928+
index = pprint_thing(index)
921929

922-
{message}
930+
msg += f"""
923931
[left]: {left}
924932
[right]: {right}"""
925933

@@ -937,6 +945,7 @@ def assert_numpy_array_equal(
937945
err_msg=None,
938946
check_same=None,
939947
obj="numpy array",
948+
index=None,
940949
):
941950
"""
942951
Check that 'np.ndarray' is equivalent.
@@ -956,6 +965,8 @@ def assert_numpy_array_equal(
956965
obj : str, default 'numpy array'
957966
Specify object name being compared, internally used to show appropriate
958967
assertion message.
968+
index : numpy.ndarray
969+
optional index (shared by both left and right), used in output.
959970
"""
960971
__tracebackhide__ = True
961972

@@ -993,7 +1004,7 @@ def _raise(left, right, err_msg):
9931004

9941005
diff = diff * 100.0 / left.size
9951006
msg = f"{obj} values are different ({np.round(diff, 5)} %)"
996-
raise_assert_detail(obj, msg, left, right)
1007+
raise_assert_detail(obj, msg, left, right, index=index)
9971008

9981009
raise AssertionError(err_msg)
9991010

@@ -1156,6 +1167,7 @@ def assert_series_equal(
11561167
right._internal_get_values(),
11571168
check_dtype=check_dtype,
11581169
obj=str(obj),
1170+
index=left.index._internal_get_values(),
11591171
)
11601172
elif check_datetimelike_compat:
11611173
# we want to check only if we have compat dtypes
@@ -1198,6 +1210,7 @@ def assert_series_equal(
11981210
check_less_precise=check_less_precise,
11991211
check_dtype=check_dtype,
12001212
obj=str(obj),
1213+
index=left.index._internal_get_values(),
12011214
)
12021215

12031216
# 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)