Problem

Migracja danych. Redesign. Duża zmiana w funkcjonalności.

Masz potrzebę porównania danych pomiędzy stanem obecnym a stanem po zmianie. Zmianę mogło wywołać jedno z powyższych zdarzeń ale cel pozostaje ten sam: porównać dane, udowodnić poprawność danych i zdobyć zaufanie biznesu.

W jaki sposób porównać dane, żeby mieć większą pewność, że stworzony produkt jest dobrej jakości? Chcesz też pokazać managerowi w jaki sposób może sam sprawdzić jakość danych, jeżeli oczywiście ma na to przestrzeń.

Rozwiązanie

Aplikacja napisana w streamlit w bajecznie łatwy sposób pozwala zwizualizować porównanie danych. Do tego wynik jest na tyle efektowny, że od razu zostaniesz pracownikiem miesiąca.

Jedna uwaga, tutaj skupiam się na porównaniu jednego unitu, jednostki, wiersza.

Co będzie potrzebne:

  • Python 😉
  • Streamlit
  • Pandas
  • Źródło danych

Pandas czytanie ze źródła danych

Dla uproszczenia czytam z pliku CSV.

W pandas zaczytywanie pliku, jest bardzo proste:

pd.read_csv

Wystarczy ścieżka do pliku i separator. W wyniku dostajesz dataframe z danymi.

W każdym pliku mam tylko jeden wiersz danych. Tyle wystarczy, żeby zrobić porównanie na jednostkowym poziomie.

Do tego demo plik wygenerowałem przy użyciu https://www.mockaroo.com/bf24ebf0

Wyobraź sobie dowolne rozbudowanie narzędzia i zaczytywanie danych z Impali, Excela, Storage Accouta, Databricsa, Power BI Semantic Model'u lub SQL Servera. Konektorów znajdziesz mnóstwo. Wykorzystując je połączysz się do źródła i pobierzesz dataframe z danymi. Będzie on podstawą do kolejnych operacji.

Pandas Unpivot - czyli wiersz do kolumny

W celu zrobienia porównania najpierw przeniesiemy wiersze w kolumnę.

Takie porównanie będzie łatwiej czytać, porównywać i filtrować.

Tabela przed pivotowaniem

order_id source_system created_date
900502 goblet 2024-01-12

Tabela po pivotowaniu:

column_name value
order_id 900502
source_system goblet
created_date 2024-01-12

Pomocne do tej operacji będzie:

df.unstack()

Taka mała notatka na boku, celem tego wpisu nie jest wyjaśnianie składni pandas ani operacji na dataframach. Jednak daj mi znać, jeżeli mam coś więcej wyjaśnić.

Pandas - porównanie danych

Pandas compare będzie tutaj bardzo pomocne do wykonania porównania datasetów.

df1.compare(df2, keep_shape=True, keep_equal=True, align_axis=1)

Porównujemy dwa dataframy df1 i df2. Utrzymujemy strukturę dataframu (keep_shape = True), chcemy też widzieć te wartości, które są sobie równe (keep_equal=True) oraz porównanie jest robione po kolumnach (align_axis = 1).

Dodatkowo tworzymy kolumnę is_diff, będzie ona przechowywała wartości True jeżeli wiersze będą różne oraz False, gdy będą równe:

compared_df['is_diff'] = compared_df.apply(lambda row: row['current'] != row['redesign'], axis=1)

Użyjemy tej kolumny potem do filtrowania w streamlit.

Streamlit

https://streamlit.io/
Streamlit reklamowany jest jako narzędzie, dzięki któremu szybciej będziemy tworzyli aplikacje oparte o dane.

Streamlit nadaje się idealnie do współpracy z Pandas.

Podstawowe operacje w streamlit, wykorzystane przy tworzeniu tej aplikacji:

Ustawienie nazwy aplikacji:

st.title('Data Quality comparison')

Pole tekstowe do ustawiania identyfikatora zamówienia.

unit_id = st.text_input('Order Id', INIT_MSG_ORDER)

Przełącznik do pokazywania różnic albo wszystkich elementów

only_diff = st.toggle('Only diff')

Wyświetlanie tabeli, której źródłem jest Pandas dataframe:

st.dataframe(compared_df, hide_index=True)

I to by było na tyle wystarczy wystartować streamlita:

streamlit run unit_comparator.py

Aplikacja - porównanie zmigrowanych danych

Połączmy wszystkie elemnty razem. Po uruchomieniu aplikacja wygląda w ten sposób:

streamlit

Po wstawieniu order id dostajesz piękną tabelę:

Po przefiltrowaniu zobaczysz tylko różnice:

I to tyle: szybko, łatwo, przyjemnie i efektownie.

Cały kod zanajdziesz jak zwykle na Github:
https://github.com/rgogloza/nextlevelbi/tree/master/streamlit/unit_comparator