Skip to content

Commit 44de8dc

Browse files
authored
ENH: Added index to testing assert message when series values differ (#31435)
1 parent 418b26a commit 44de8dc

File tree

4 files changed

+31
-8
lines changed

4 files changed

+31
-8
lines changed

pandas/_libs/testing.pyx

+8-2
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_values=None):
6969
"""
7070
Check that left and right objects are almost equal.
7171
@@ -89,6 +89,12 @@ 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_values : ndarray, default None
93+
Specify shared index values of objects being compared, internally used
94+
to show appropriate assertion message
95+
96+
.. versionadded:: 1.1.0
97+
9298
"""
9399
cdef:
94100
int decimal
@@ -171,7 +177,7 @@ cpdef assert_almost_equal(a, b,
171177
from pandas._testing import raise_assert_detail
172178
msg = (f"{obj} values are different "
173179
f"({np.round(diff * 100.0 / na, 5)} %)")
174-
raise_assert_detail(obj, msg, lobj, robj)
180+
raise_assert_detail(obj, msg, lobj, robj, index_values=index_values)
175181

176182
return True
177183

pandas/_testing.py

+19-6
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_values=None):
892892
__tracebackhide__ = True
893893

894+
msg = f"""{obj} are different
895+
896+
{message}"""
897+
898+
if isinstance(index_values, np.ndarray):
899+
msg += f"\n[index]: {pprint_thing(index_values)}"
900+
894901
if isinstance(left, np.ndarray):
895902
left = pprint_thing(left)
896903
elif is_categorical_dtype(left):
@@ -901,9 +908,7 @@ 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
905-
906-
{message}
911+
msg += f"""
907912
[left]: {left}
908913
[right]: {right}"""
909914

@@ -921,6 +926,7 @@ def assert_numpy_array_equal(
921926
err_msg=None,
922927
check_same=None,
923928
obj="numpy array",
929+
index_values=None,
924930
):
925931
"""
926932
Check that 'np.ndarray' is equivalent.
@@ -940,6 +946,8 @@ def assert_numpy_array_equal(
940946
obj : str, default 'numpy array'
941947
Specify object name being compared, internally used to show appropriate
942948
assertion message.
949+
index_values : numpy.ndarray, default None
950+
optional index (shared by both left and right), used in output.
943951
"""
944952
__tracebackhide__ = True
945953

@@ -977,7 +985,7 @@ def _raise(left, right, err_msg):
977985

978986
diff = diff * 100.0 / left.size
979987
msg = f"{obj} values are different ({np.round(diff, 5)} %)"
980-
raise_assert_detail(obj, msg, left, right)
988+
raise_assert_detail(obj, msg, left, right, index_values=index_values)
981989

982990
raise AssertionError(err_msg)
983991

@@ -1143,7 +1151,11 @@ def assert_series_equal(
11431151
raise AssertionError("check_exact may only be used with numeric Series")
11441152

11451153
assert_numpy_array_equal(
1146-
left._values, right._values, check_dtype=check_dtype, obj=str(obj)
1154+
left._values,
1155+
right._values,
1156+
check_dtype=check_dtype,
1157+
obj=str(obj),
1158+
index_values=np.asarray(left.index),
11471159
)
11481160
elif check_datetimelike_compat and (
11491161
needs_i8_conversion(left.dtype) or needs_i8_conversion(right.dtype)
@@ -1182,6 +1194,7 @@ def assert_series_equal(
11821194
check_less_precise=check_less_precise,
11831195
check_dtype=check_dtype,
11841196
obj=str(obj),
1197+
index_values=np.asarray(left.index),
11851198
)
11861199

11871200
# metadata comparison

pandas/tests/util/test_assert_frame_equal.py

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

@@ -197,6 +198,7 @@ def test_frame_equal_block_mismatch(by_blocks_fixture, obj_fixture):
197198
"""{obj}\\.iloc\\[:, 1\\] \\(column name="E"\\) are different
198199
199200
{obj}\\.iloc\\[:, 1\\] \\(column name="E"\\) values are different \\(33\\.33333 %\\)
201+
\\[index\\]: \\[0, 1, 2\\]
200202
\\[left\\]: \\[é, è, ë\\]
201203
\\[right\\]: \\[é, è, e̊\\]""",
202204
),
@@ -206,6 +208,7 @@ def test_frame_equal_block_mismatch(by_blocks_fixture, obj_fixture):
206208
"""{obj}\\.iloc\\[:, 0\\] \\(column name="A"\\) are different
207209
208210
{obj}\\.iloc\\[:, 0\\] \\(column name="A"\\) values are different \\(100\\.0 %\\)
211+
\\[index\\]: \\[0, 1, 2\\]
209212
\\[left\\]: \\[á, à, ä\\]
210213
\\[right\\]: \\[a, a, a\\]""",
211214
),

pandas/tests/util/test_assert_series_equal.py

+1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ def test_series_equal_values_mismatch(check_less_precise):
169169
msg = """Series are different
170170
171171
Series values are different \\(33\\.33333 %\\)
172+
\\[index\\]: \\[0, 1, 2\\]
172173
\\[left\\]: \\[1, 2, 3\\]
173174
\\[right\\]: \\[1, 2, 4\\]"""
174175

0 commit comments

Comments
 (0)