IT

How do you Unit Test Python DataFrames

itgroup 2023. 10. 30. 20:53
반응형

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")

이렇게 하면 다음과 같은 읽기 쉬운 오류 메시지가 나타납니다.

Columns not equal error

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)

Beavis DataFrame equality

(저자인) 프레임 고정 장치 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

반응형