代码之家  ›  专栏  ›  技术社区  ›  Matina G

数据帧字典的Python单元测试

  •  2
  • Matina G  · 技术社区  · 7 年前

    我知道如何单元测试数据帧上的相等性:

    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)
    

    assert_dict_equal函数的pandas.util.testing也失败。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Matt Messersmith    7 年前

    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 .

    以下是它工作的原因:

    __eq__ (或 == )在要比较的项目上。问题是当你打电话的时候 (或 == )在 数据帧 ,它不返回 bool . 相反,它返回另一个 数据帧 :

    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 输出a 而不是 数据帧 :

    DfWrap(df1) == DfWrap(df2)
    

    是的 .

    嗯。

        2
  •  1
  •   Farbod Shahinfar    7 年前

    我不确定,但你可以这样做:

    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)