2017-01-25 13 views
9

W jaki sposób mogę przetestować ramki danych python?Jak działa test jednostkowy Python DataFrames

Mam funkcje, które mają dane wejściowe i wyjściowe jako ramki danych. Prawie każda funkcja, którą mam, to robi. Teraz jeśli chcę przetestować jednostkę, jaka jest najlepsza metoda? Wydaje się, że trochę wysiłku, aby utworzyć nową ramkę danych (z wartościami wypełnionymi) dla każdej funkcji?

Czy są jakieś materiały, które możesz mi polecić? Czy powinieneś pisać testy jednostkowe dla tych funkcji?

Odpowiedz

2

Nie sądzę, że trudno jest tworzyć małe ramki DataFrame do testowania jednostkowego?

import pandas as pd 
from nose.tools import assert_dict_equal 

input = pd.DataFrame.from_dict({ 
    'field_1': [some, values], 
    'field_2': [other, values] 
}) 
expected = { 
    'result': [...] 
} 
assert_dict_equal(expected, my_func(input).to_dict(), "oops, there's a bug...") 
+0

Mój wynik to także ramka danych. Czy powinienem stworzyć kolejną ramkę danych? w tym przypadku nie mogę użyć assert_dict_equal? – CodeGeek123

+0

Tak, dlatego zadzwoniłem 'to_dict()' na wynik twojej funkcji - otrzymuję więc 'dict', który można porównać do' expected' z sugerowaną metodą 'nose'. – rtkaleta

+1

@ CodeGeek123 Czy to pomaga? – rtkaleta

2

Proponuję zapisać wartości jako CSV w docstrings (lub oddzielne pliki, jeśli są duże) i parsowanie ich przy użyciu pd.read_csv(). Możesz także sparsować oczekiwane dane wyjściowe z CSV i porównać, lub użyć df.to_csv(), aby napisać plik CSV i zmienić go.

+0

Jest to niezły pomysł, ale radzenie sobie z plikami 'csv' może być denerwujące, jeśli twoja DataFrame ma dane w dziwnych kodowaniach lub tablicach, które musisz" literal_eval "itp. Jeśli jej kod jest poprawnie zbudowany, dane wejściowe/oczekiwane DataFrames powinien być dość mały, a zatem łatwy do skonstruowania w locie? – rtkaleta

6

Chociaż funkcje testowe pandy są wykorzystywane przede wszystkim do wewnętrznych testów, NumPy zawiera bardzo użyteczny zestaw funkcji testowych, które są udokumentowane tutaj: NumPy Test Support.

Funkcje te porównują tablice NumPy, ale można uzyskać tablicę, która jest podstawą ramki danych Pandy przy użyciu właściwości values. Możesz zdefiniować prostą ramkę danych i porównać, co twoja funkcja powraca do tego, czego oczekujesz.

Jedną z technik, której można użyć, jest zdefiniowanie jednego zestawu danych testowych dla wielu funkcji. W ten sposób można użyć Pytest Fixtures, aby raz zdefiniować tę ramkę danych i użyć jej w wielu testach.

Pod względem zasobów znalazłem ten artykuł na temat Testing with NumPy and Pandas, aby był bardzo przydatny. Zrobiłem także krótką prezentację na temat analizy danych w PyCon Canada w tym roku: Automate Your Data Analysis Testing.

Powiązane problemy