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:
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