我有一个返回熊猫数据框字典的函数,我希望为此设计一个单元测试。
我知道如何对熊猫数据框进行相等性测试:
import pandas as pd
from pandas.util.testing import assert_frame_equal
import unittest
df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
df2 =pd.DataFrame(df1)
class DictEq(unittest.TestCase):
def test_dict_eq(self):
assert_frame_equal(df1, df2)
unittest.main()
但是,我似乎并不了解如何设计一个比较以下内容的测试:
dict1 = {'a': df1}
dict2 = {'a': df2}
我尝试了以下操作,但都失败了:
from nose.tools import assert_equal, assert_dict_equal
class DictEq(unittest.TestCase):
def test_dict_eq1(self):
assert_equal(dict1, dict2)
def test_dict_eq2(self):
assert_dict_equal(dict1 , dict2)
def test_dict_eq3(self):
self.assertTrue(dict1 == dict2)
pandas.util.testing的assert_dict_equal函数也会失败。
答案 0 :(得分:1)
尝试一下:
import pandas as pd
df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
df2 =pd.DataFrame(df1)
class DfWrap():
def __init__(self, df):
self.df = df
def __eq__(self, df2):
return all(self.df == df2)
dic1 = {'a': DfWrap(df1)}
dic2 = {'a': DfWrap(df2)}
print(dic1 == dic2)
这将输出True
。只要将assert_dict_equal
对象包装在dataframe
中,它就也可以与DfWrap
一起使用。
这是它起作用的原因:
您必须想象为了比较字典,python将(递归地)遍历每个键并在要比较的项目上调用__eq__
(或==
)。问题在于,当您在__eq__
上调用==
(或dataframe
)时,它不会返回bool
。相反,它返回另一个dataframe
:
import pandas as pd
df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
df2 =pd.DataFrame(df1)
df_compare = df1 == df2
print(type(df_compare))
此输出:
<class 'pandas.core.frame.DataFrame'>
因此,包装程序这样做是为了使执行df1 == df2
会输出bool
而不是dataframe
:
DfWrap(df1) == DfWrap(df2)
评估为True
。
HTH。
答案 1 :(得分:1)
我不确定,但是您可能会执行以下操作:
import unittest
class DictEq(unittest.TestCase):
def test_dict_eq1(self):
dict1 = {'a': df1}
dict2 = {'a': df2}
key1 = dict1.keys()
key2 = dict2.keys()
self.assertEqual(key1,key2)
for key, val in dict1.items():
df1 = dict1[key]
df2 = dict2[key]
assert_frame_equal(df1, df2)