W tworzeniu oprogramowania mamy coś takiego jak Testy Jednostkowe. Kod, który ma testować nasz kod.
Czasem jest tak, że testy nam nie przechodzą. Są czerwone. I taka też sytuacja spotkała mnie, biednego programistę, który to chciał tylko zamknąć taska i obejrzeć skoki na jedynce. Nie było mi jednak dane…
A było to tak…
Jest mroźny, piątkowy wieczór. Za chwilę na jedynce mają być kwalifikacje do Garmisz Partenkirszen, a tutaj jeden z testów ciągle na czerwono.
Test banalny – miał sprawdzać, czy dwa DataFrame’y są takie same. Korzystam z dostępnej w Pandas metody do porównywania DataFrame’ów:
pd.testing.assert_frame_equal(decoded_df, true_df)
I dostaję błąd asercji – DataFrame’y są od siebie różne. Pomyliłem się w kodzie? #niemożebyć
Sprawdzam, gdzież ta różnica. Patrzę na log a tam:
E AssertionError: DataFrame.iloc[:, 8] are different
E
E DataFrame.iloc[:, 8] values are different (40.0 %)
E [left]: [label_A, label_B, None, None, label_C]
E [right]: [label_A, label_B, None, None, label_C]
Jak różne jak widzę, że takie same? Co jest kurde Panie Pandas?
W trybie debuggingu w PyCharmie wyprintowałem sobie zawartość kolumn w obu DFkach. Na niewiele to się zdało:
In[2]: true_df.ground_truth_label
Out[2]:
0 label_A
1 label_B
2 None
3 None
4 label_C
Name: ground_truth_label, dtype: object
In[3]: decoded_df.ground_truth_label
Out[3]:
0 label_A
1 label_B
2 None
3 None
4 label_C
Name: ground_truth_label, dtype: object
Z pomocą przyszedł debugger w Pycharm i to, jak rozkłada na części pierwsze DF’ki. Dopiero tutaj wyszło szydło z worka!
decoded_df.ground_truth_label = {Series: (5,)} (0, 'label_A') (1, 'label_B') (2, 'None') (3, 'None') (4, 'label_C')
true_df.ground_truth_label = {Series: (5,)} (0, 'label_A') (1, 'label_B') (2, None) (3, None) (4, 'label_C')
Różnica jest subtelna, ale jakże istotna. Jedna DF, true_df
, ma None
, a druga DF, decoded_df
, ma "None"
. Teraz już wiesz o co chodzi?
Czujesz róznicę?
Dam Ci chwilę.
Sprawdziłeś?
Tak. Dokładnie to. Masz rację.
>>> type(None)
<class 'NoneType'>
>>> type("None")
<class 'str'>
Koniec imprezy, dziękuję, dobranoc.
Morał?
Na typy w DFkach pandasowych uważaj.
Mistrz Joda