Модульные тесты Python для словарей данных - PullRequest
0 голосов
/ 04 октября 2018

У меня есть функция, которая возвращает словари фреймов данных панд, и я хочу разработать для нее модульный тест.

Я знаю, как тестировать равенство по фреймам данных панд:

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 functionpandas.util.testing также не работает.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Я не уверен, но вы можете сделать что-то вроде этого:

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)
0 голосов
/ 04 октября 2018

Попробуйте:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...