• 10 źródeł
  • Najlepszy* Newsletter
  • Kontakt
✕

[Shorty] Testy vs Pandas – kiedy to samo to nie to samo

Shorty | 2021-02-12

[Shorty] Testy vs Pandas – kiedy to samo to nie to samo

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]

WAT?

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

Najlepszy* Newsletter o Machine Learning w Polsce

Co tydzień (albo dwa) wyciągam smaczki z różnych miejsc w Internecie na temat Machine Learning, Data Science, AI i Python i przesyłam na Twoją skrzynkę mailową

Przesyłam też krótkie wyjaśnienia niektórych machine learningowych pojęć.

Autor: Konrad Łyda

AI Engineer działający głównie w Lingaro. Zajmuje się głównie maszynerią potrzebną do wytworzenia produktów opartych o uczenia maszynowe - od danych przez modele do wdrożenia. W wolnych chwilach zgłębia szeroki ocean zastosowań Machine/Deep Learningu w różnych dziedzinach życia oraz współorganizuje spotkania społeczności Data Science Lublin

Poprzedni Wpis

Hej Pandas, chcę...

Następny Wpis

[WDI2021] Szukamy Szopów, czyli Computer Vision w 30 minut

Ostatnie Wpisy

Od danych do produktu – automatyzacja w obszarze Machine Learning dzięki MLOps

Od danych do produktu – automatyzacja w obszarze Machine Learning dzięki MLOps

[#w3linijkach] Jak pobrać dane z MySQL i zapisać do CSV w Pythonie?

[#w3linijkach] Jak pobrać dane z MySQL i zapisać do CSV w Pythonie?

Kodowanie znaków przy połączeniu do bazy danych zdradliwe bywa

Kodowanie znaków przy połączeniu do bazy danych zdradliwe bywa

10 źródeł wiedzy o uczeniu maszynowym - pobierz!

Newsletter o ML za free?

Gdzie wejść?


Ostatnie wpisy

  • Od danych do produktu – automatyzacja w obszarze Machine Learning dzięki MLOps
  • [#w3linijkach] Jak pobrać dane z MySQL i zapisać do CSV w Pythonie?
  • Kodowanie znaków przy połączeniu do bazy danych zdradliwe bywa
  • Jak mergować Jupyter notebooki w GIT i nie osiwieć? Proste narzędzie!
  • [WDI2021] Szukamy Szopów, czyli Computer Vision w 30 minut
Arba WordPress Theme by XstreamThemes.
  • UczymyMaszyny.pl
  • Polityka prywatności
  • Kontakt