使用unittest框架测试pandas数据框

问题描述

我正在尝试使用python unittest框架进行处理csv文件的单元测试。 我想测试列名匹配,列值匹配等情况。 我知道有更方便的库,例如datatestpytest,但是我只能在项目中使用unittest

猜猜我使用了错误unittest.TestCase方法,并以错误的格式发送数据。 请告知如何做得更好。

db.csv示例:

  TIMESTAMP   TYPE   VALUE YEAR  FILE   SHEET
0 02-09-2018  Index   45   2018  tq.xls A01
1 13-05-2018  Index   21   2018  tq.xls A01
2 22-01-2019  Index   9    2019  aq.xls B02

这是代码示例:

import pandas as pd
import unittest

class DFTests(unittest.TestCase):

    def setUp(self):
        test_file_name =  'db.csv'
        try:
            data = pd.read_csv(test_file_name,sep = ',',header = 0)
        except IOError:
            print('cannot open file')
        self.fixture = data

    #Check column names
    def test_columns(self):
        self.assertEqual(
            self.fixture.columns,{'TIMESTAMP','TYPE','VALUE','YEAR','FILE','SHEET'},)

    #Check timestamp format
    def test_timestamp(self):
        self.assertRaisesRegex(
            self.fixture['TIMESTAMP'],r'\d{2}-\d{2}-\d{4}'
        )

    #Check year values
    def test_year_values(self):
        self.assertIn(
            self.fixture['YEAR'],{2018,2019,2020},)


if __name__ == '__main__':
    unittest.main()

错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
TypeError: assertRaisesRegex() arg 1 must be an exception type or tuple of exception types
TypeError: 'Series' objects are mutable,thus they cannot be hashed

感谢您的帮助。

解决方法

您可以使用列表推导对每个数据框行进行断言。 尝试这样的事情:

C

此外,请记住,import pandas as pd import unittest colnames = ["TIMESTAMP"," TYPE"," VALUE"," YEAR"," FILE"," SHEET"] years = set([2018,2019,2020]) class DfTests(unittest.TestCase): def setUp(self): try: data = pd.read_csv("data.csv",sep=",") self.fixture = data except IOError as e: print(e) def test_colnames(self): self.assertListEqual(list(self.fixture.columns),colnames) def test_timestamp_format(self): ts = self.fixture["TIMESTAMP"] # You need to check for every row in the dataframe [self.assertRegex(i,r"\d{2}-\d{2}-\d{4}") for i in ts] def test_years(self): df_years = self.fixture[" YEAR"] self.assertTrue(all([i in years for i in df_years])) if __name__ == "__main__": unittest.main() 具有一些内置的testing函数。另一方面,在对数据帧进行单元测试(以及常规数据验证)时,great_expectations可能是完成这项工作的最佳工具。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...