web-dev-qa-db-fra.com

Comment faites-vous un test unitaire Python DataFrames

Comment tester les unités python dataframes?

J'ai des fonctions qui ont une entrée et une sortie en tant que trames de données. Presque toutes les fonctions que j'ai ont cette fonction. Maintenant, si je veux faire un test unitaire, quelle est la meilleure méthode pour le faire? Cela semble un peu difficile de créer une nouvelle trame de données (avec des valeurs renseignées) pour chaque fonction?

Y a-t-il des documents auxquels vous pouvez me référer? Devriez-vous écrire des tests unitaires pour ces fonctions?

31
CodeGeek123

Alors que les fonctions de test de Pandas sont principalement utilisées pour les tests internes, NumPy comprend un ensemble très utile de fonctions de test qui sont documentées ici: NumPy Test Support .

Ces fonctions comparent les tableaux NumPy, mais vous pouvez obtenir un tableau sous-jacent à un cadre de données Pandas à l'aide de la propriété values. Vous pouvez définir un cadre de données simple et comparer ce à quoi votre fonction renvoie ce que vous attendez.

Une technique que vous pouvez utiliser consiste à définir un ensemble de données de test pour un certain nombre de fonctions. De cette façon, vous pouvez utiliser Pytest Fixtures pour définir cette trame de données une fois, et l'utiliser dans plusieurs tests.

En termes de ressources, j'ai trouvé cet article sur Test avec NumPy et Pandas très utile. J'ai également fait une brève présentation sur les tests d'analyse de données à PyCon Canada cette année: Automatisez vos tests d'analyse de données .

24
sechilds

vous pouvez utiliser pandas fonctions de test:

Cela donnera plus de flexibilité pour comparer votre résultat avec le résultat calculé de différentes manières.

Par exemple:

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)

Pour plus de détails, reportez-vous à cette lien

7
Mohamed Thasin ah

Je ne pense pas qu'il soit difficile de créer de petits DataFrames pour les tests unitaires?

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...")
4
rtkaleta

Je suggère d'écrire les valeurs au format CSV dans des docstrings (ou des fichiers séparés s'ils sont volumineux) et de les analyser à l'aide de pd.read_csv(). Vous pouvez également analyser la sortie attendue de CSV et comparer, ou bien utiliser df.to_csv() pour écrire un CSV et le diff.

3
John Zwinck