微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用unittest框架测试pandas数据框

如何解决使用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可能是完成这项工作的最佳工具。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?