How do you Unit Test Python DataFrames
How do I unit test Python dataframes?
I have functions that have an input and output as dataframes. Almost every function I have does this. Now if I want to unit test this what is the best method of doing it? It seems a bit of an effort to create a new dataframe (with values populated) for every function?
Are there any materials you can refer me to? Should you write unit tests for these functions?
While Pandas' test functions are primarily used for internal testing, NumPy includes a very useful set of testing functions that are documented here: NumPy Test Support.
이 함수들은 NumPy 배열을 비교하지만, Pandas DataFrame의 기본이 되는 배열은values
소유물.간단한 DataFrame을 정의하고 기능이 원하는 것과 비교할 수 있습니다.
One technique you can use is to define one set of test data for a number of functions. That way, you can use Pytest Fixtures to define that DataFrame once, and use it in multiple tests.
In terms of resources, I found this article on Testing with NumPy and Pandas to be very useful. I also did a short presentation about data analysis testing at PyCon Canada 2016: Automate Your Data Analysis Testing.
you can use pandas testing functions:
It will give more flexbile to compare your result with computed result in different ways.
For example:
df1=pd.DataFrame({'a':[1,2,3,4,5]})
df2=pd.DataFrame({'a':[6,7,8,9,10]})
expected_res=pd.Series([7,9,11,13,15])
pd.testing.assert_series_equal((df1['a']+df2['a']),expected_res,check_names=False)
For more details refer this link
pytest를 사용하는 경우,pandasSnapshot
유용할 것입니다.
# use with pytest
import pandas as pd
from snapshottest_ext.dataframe import PandasSnapshot
def test_format(snapshot):
df = pd.DataFrame([['a', 'b'], ['c', 'd']],
columns=['col 1', 'col 2'])
snapshot.assert_match(PandasSnapshot(df))
One big cons is that the snapshot is not readable anymore. (store the content as csv is more readable, but it is problematic.
PS: I am the author of pytest snapshot extension.
당신은 사용할 수 있습니다.snapshottest
그리고 다음과 같은 일을 합니다.
def test_something_works(snapshot): # snapshot is a pytest fixture from snapshottest
data_frame = calc_something_and_return_pandas_dataframe()
snapshot.assert_match(data_frame.to_csv(index=False), 'some_module_level_unique_name_for_the_snapshot')
그러면 업데이트할 수 있는 csv 출력이 포함된 파일이 있는 스냅샷 폴더가 생성됩니다.--snapshot-update
당신의 코드가 바뀌면.
비교를 통해 작동합니다.data_frame
디스크에 저장할 내용에 대한 변수입니다.
Might be worth mentioning that your snapshots should be checked in to source control.
I don't think it's hard to create small DataFrames for unit testing?
import pandas as pd
from nose.tools import assert_dict_equal
input_df = pd.DataFrame.from_dict({
'field_1': [some, values],
'field_2': [other, values]
})
expected = {
'result': [...]
}
assert_dict_equal(expected, my_func(input_df).to_dict(), "oops, there's a bug...")
값을 문서 문자열에 CSV로 기록하고(혹은 크기가 큰 경우 별도의 파일로 기록하는 것을 제안합니다), 이를 사용하여 구문 분석하는 방법을 제안합니다.pd.read_csv()
. CSV의 예상 출력도 구문 분석하여 비교하거나 사용할 수 있습니다.df.to_csv()
CSV를 작성하고 분할합니다.
팬더에는 테스트 기능이 내장되어 있지만 출력물을 파싱하기가 쉽지 않아 사람이 읽기 쉬운 오류 메시지를 출력하는 기능을 가진 beavis라는 오픈 소스 프로젝트를 만들었습니다.
다음은 내장된 테스트 방법 중 하나의 예입니다.
df = pd.DataFrame({"col1": [1042, 2, 9, 6], "col2": [5, 2, 7, 6]})
pd.testing.assert_series_equal(df["col1"], df["col2"])
오류 메시지는 다음과 같습니다.
> ???
E AssertionError: Series are different
E
E Series values are different (50.0 %)
E [index]: [0, 1, 2, 3]
E [left]: [1042, 2, 9, 6]
E [right]: [5, 2, 7, 6]
출력이 정렬되어 있지 않기 때문에 어떤 행이 일치하는지 확인하기가 쉽지 않습니다.
beavis로 동일한 테스트를 작성하는 방법은 다음과 같습니다.
import beavis
beavis.assert_pd_column_equality(df, "col1", "col2")
이렇게 하면 다음과 같은 읽기 쉬운 오류 메시지가 나타납니다.
assert_frame_equal
가 읽을 수 있는 오류 메시지도 주지 않습니다.DataFrame의 동등성과 beavis를 비교할 수 있는 방법은 다음과 같습니다.
df1 = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df2 = pd.DataFrame({'col1': [5, 2], 'col2': [3, 4]})
beavis.assert_pd_equality(df1, df2)
(저자인) 프레임 고정 장치 Python 패키지는 유닛 또는 성능 테스트를 위해 "새로운 데이터 프레임(값이 채워진)을 쉽게 만들 수 있도록" 설계되었습니다.
예를 들어 숫자 인덱스가 있는 Float 및 문자열의 DataFrame에 대해 테스트하려는 경우 압축 문자열 선언을 사용하여 DataFrame을 생성할 수 있습니다.
>>> ff.Fixture.to_frame('i(I,int)|v(float,str)|s(4,2)').to_pandas()
0 1
34715 1930.40 zaji
-3648 -1760.34 zJnC
91301 1857.34 zDdR
30205 1699.34 zuVU
>>> ff.Fixture.to_frame('i(I,int)|v(float,str)|s(8,3)').to_pandas()
0 1 2
34715 1930.40 zaji 694.30
-3648 -1760.34 zJnC -72.96
91301 1857.34 zDdR 1826.02
30205 1699.34 zuVU 604.10
54020 268.96 zKka 1080.40
129017 3511.58 zJXD 2580.34
35021 1175.36 zPAQ 700.42
166924 2925.68 zyps 3338.48
언급URL : https://stackoverflow.com/questions/41852686/how-do-you-unit-test-python-dataframes
'IT' 카테고리의 다른 글
will IF SIGNAL SQLSTATE in mariadb exit stored procedure? (0) | 2023.10.30 |
---|---|
약한 연결의 실용적인 응용은 무엇입니까? (0) | 2023.10.30 |
부트스트랩 4, 버튼을 중앙 정렬하려면 어떻게 해야 합니까? (0) | 2023.10.30 |
C에서 특정 권한으로 유닉스 도메인 소켓을 만드는 방법? (0) | 2023.10.25 |
MySQL 인덱싱 및 파일 정렬 사용 (0) | 2023.10.25 |