【问题标题】:Compare two Pandas Series/DataFrames that are virtually equal比较两个几乎相等的 Pandas Series/DataFrame
【发布时间】:2016-12-01 14:26:00
【问题描述】:

对于单元测试,我必须比较两个 pandas DataFrame(只有一列,因此它们也可以转换为 Series 而不会丢失信息)。问题是一个的索引是日期时间类型,另一个是日期。出于我们的目的,两者中的信息是相等的,因为没有使用日期时间的时间部分。

要检查两个对象在单元测试中是否相等,我可以:

  • 提取其中之一的索引并转换为日期/日期时间
  • 仅提取一列的值,比较这些值以及开始日期和结束日期

我错过了比较两者的优雅方式吗?

代码示例:

from datetime import date, datetime, timedelta
import pandas as pd

days_in_training = 40
start_date = date(2016, 12, 1)
dates = [start_date + timedelta(days=i) for i in range(days_in_training)]
actual = pd.DataFrame({'col1': range(days_in_training)}, index=dates)

start_datetime = datetime(2016, 12, 1)
datetimes = [start_datetime + timedelta(days=i) for i in range(days_in_training)]
expected = pd.DataFrame({'col1': range(days_in_training)}, index=datetimes)

assert(all(actual == expected))

给予:

ValueError: Can only compare identically-labeled DataFrame objects

【问题讨论】:

  • 试试 assert(all(actual.values == expected.values)) 这里 .values 返回一个 np 数组,因此不涉及索引
  • 嗯,是的。这是我的建议之一,但它不会测试日期是否也匹配。我可以单独测试它,但我只是想知道是否有一个优雅的解决方案可以一次完成所有事情。
  • 为什么不直接将索引转换为日期? expected.index = expected.index.date,然后对齐
  • 实际上 actual == expected 已经对我有用了
  • 你使用的是什么版本的 pandas/numpy?我的是 0.19.1 和 1.11.0

标签: python unit-testing pandas


【解决方案1】:

为了将来参考,通过这篇博文(https://penandpants.com/2014/10/07/testing-with-numpy-and-pandas/)我找到了函数pandas.util.testing.assert_frame_equal()https://github.com/pandas-dev/pandas/blob/29de89c1d961bea7aa030422b56b061c09255b96/pandas/util/testing.py#L621

此函数在测试内容方面具有一定的灵活性。此外,它还打印了为什么 DataFrame 可能不相等的摘要,assert(all(actual == expected)) 行仅返回 True 或 False,这使得调试更加困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多