Je souhaite vérifier les types de données Pandas DataFrames, c'est-à-dire que je souhaite spécifier les étiquettes de colonne qu'un DataFrame doit avoir et le type de type de données (dtype
) qui y est stocké. Une mise en œuvre brute (inspirée par cette question) fonctionnerait comme ceci:Vérification des types Pandas DataFrames
from collections import namedtuple
Col = namedtuple('Col', 'label, type')
def dataframe_check(*specification):
def check_accepts(f):
assert len(specification) <= f.__code__.co_argcount
def new_f(*args, **kwds):
for (df, specs) in zip(args, specification):
spec_columns = [spec.label for spec in specs]
assert (df.columns == spec_columns).all(), \
'Columns dont match specs {}'.format(spec_columns)
spec_dtypes = [spec.type for spec in specs]
assert (df.dtypes == spec_dtypes).all(), \
'Dtypes dont match specs {}'.format(spec_dtypes)
return f(*args, **kwds)
new_f.__name__ = f.__name__
return new_f
return check_accepts
Cela ne me dérange pas la complexité de la fonction de contrôle, mais il ajoute beaucoup de code passe-partout.
@dataframe_check([Col('a', int), Col('b', int)], # df1
[Col('a', int), Col('b', float)],) # df2
def f(df1, df2):
return df1 + df2
f(df, df)
Existe-t-il un moyen plus pythonique de vérifier les types de données DataFrames? Quelque chose qui ressemble plus à the new Python 3.6 static type-checking? Est-il possible de l'implémenter en mypy?
Si vous implémentez avec [OrderedDict] (https : //docs.python.org/2/library/collections.html#collections.OrderedDict) vous pouvez également vérifier l'ordre des colonnes. – joachim