Python od kilku lat jest w czołówce najpopularniejszych języków programowania. Poza typowo klasycznymi programistycznymi zastosowaniami jest to język który świetnie sprawdza się w zastosowaniach z obszaru Data Science. Dzięki bibliotekom takim jak Pandas umożliwia transformacje i modelowanie dużych datasetów, a moduły takie jak Scikit-Learn umożliwiają zastosowanie w kilku prostych krokach modeli uczenia maszynowego. Zwłaszcza Machine Learning, jako część szeroko rozumianej Artificial Intelligence, pozwala na przejście z descriptive (analiza historii) do predictive (wpływanie na przyszłość) analytics. Nic więc dziwnego że Tableau stara się ułatwić użytkownikom korzystanie ze skryptów Pythona. Do tej pory było to możliwe poprzez pola obliczeniowe SCRIPT, obecnie od wersji 2022.3 mamy nową, bardzo użyteczną opcję – Table Extension.
Zastosowania skryptów Pythona w Tableau
Tableau jako narzędzie Business Intelligence skupia się przede wszystkim na wizualnym i eksploracyjnym aspekcie analizy danych. Python z kolei jako wiodący język programowania obszaru data science umożliwia użytkownikom szeroki zakres działań z obszaru transformacji i modelowania danych. Do tego dochodzi aspekt wykorzystania modeli uczenia maszynowego – czy to do lepszego zrozumienia przeszłości czy do estymacji przyszłych wydarzeń. Wykorzystując integrację Tableau + Python możemy zatem z jednej strony wykorzystać skrypty do modelowania danych (na wzór procesów ETL) oraz przede wszystkim do generowania dodatkowych wniosków i rekomendacji na podstawie danych historycznych – wpływając tym samym na przyszłość. Dodajemy tym samym nową perspektywę, wspomaganą algorytmami uczenia maszynowego – wzbogacającą standardową analizę danych w Tableau.
Pierwszy krok – konfiguracja środowiska
Pierwszym krokiem, zanim zaczniemy korzystać ze skryptów w Tableau, jest odpowiednie ustawienie środowiska programistycznego. Po pierwsze potrzebujemy Pythona zainstalowanego na naszym komputerze (na przykład pakiet Anaconda). Do tego również bardzo przydatne będą standardowe biblioteki do zastosowań data science: Pandas, NumPy i Scikit-Learn (do machine learningu). Oprócz tego potrzebujemy również pakietu TabPy – biblioteki umożlwiającej wykonywanie skryptów z poziomu Tableau. Mając te elementy, zaczynamy od uruchomienia serwera Tabpy z poziomu linii komend:
W ten sposób tworzymy serwer na naszym komputerze – localhost (port:9004). W kolejnym kroku tworzymy połączenie do tego serwera bezpośrednio w Tableau, wybierając Help -> Settings and Performance -> Manage Analytics Extension Connetion. Następnie wybieramy z dostępnych opcji TabPy i uzupełniamy dane serwera:
Pozostaje Test Connection – jak wszystko jest ok dostajemy komunikat:
Jak było do tej pory – funkcje SCRIPT
Wcześniej jedyną opcją wykorzystania skryptów Pythona bezpośrednio w Tableau było wykorzystanie funkcji SCRIPT. Wewnątrz pola obliczeniowego mogliśmy umieścić bezpośrednio lekko zmodyfikowany kod, podać listę argumentów z naszego datasetu, i tym sposobem uzyskać rezultat w postaci wartości:
Ta metoda ma kilka wad. Po pierwsze, całość kodu musi znaleźć się wewnątrz pola obliczeniowego jako blok tekstu. Dla prostych zastosowań może to mieć sens, ale napisanie bardziej rozbudowanego kodu byłoby mocno utrudnione. Tę niedogodność można obejść poprzez zdefiniowanie kodu w zewnętrznym IDE (edytor kodu – przykładowo Jupyter), stworzenie odpowiedniej funkcji i następnie deployement na serwer TabPy:
Wtedy w polu SCRIPT pozostaje do umieszczenia odwołanie do tej funkcji:
Natomiast ta opcja ma również wady. Najważniejsza to fakt, że funkcja nie jest realizowana na poziomie wiersza naszego datasetu, a na zagregowanych wartościach. Do tego pola SCRIPT są technicznie formułami tablicowymi, więc nie możemy zejść na niższy poziom szczegółów niż na wizualizacji przy wykorzystaniu kalkulacji Level of Details (LOD). Funkcje te są też przeliczane przy każdej zmianie na wizualizacji (np. filtrowanie), co przy bardziej rozbudowanych kodach czy przy modelach ML znacznie obciąża pamięć i utrudnia korzystanie z wizualizacji.
Table Extension – recepta na bolączki funkcji SCRIPT
Znając ograniczenia wykorzystania skryptów jako pola obliczeniowe SCRIPT, Tableau wprowadziła nowe rozwiązanie – Table Extensions. Funkcjonalność ta umożliwia realizowanie kodu na poziomie wiersza na etapie ładowania danych do workbooka. Nowa opcja jest dostępna w zakładce Data Source, poniżej listy plików. Po przeciągnięciu na pole z danymi dostajemy widok:
Dwukrotny klik przenosi nas do nowego widoku, który po przeciągnięciu naszego źródła danych wygląda następująco:
Interfejs jaki nam się okazuje jest nieco inny niż standardowy widok źródła danych. Poszczególne elementy oznaczają kolejno:
1 – lista tabel – źródeł danych
2 – edytor kodu
3 – list pól źródła danych
4 – przełączany widok tabeli danych na wejściu (Input Table – przed wykonaniem kodu) oraz na wyjściu (Output Table – po wykonaniu kodu)
Zatrzymajmy się na chwilę, bo nowości jest tutaj sporo. Po pierwsze – mamy edytor kodu. I nie jest to tylko goły tekst jak w polu SCRIPT – możemy wybrać język programowania, mamy słowniki, składnię, odpowiednie formatowanie. Możemy więc proste fragmenty kodu tworzyć już bezpośrednio w Tableau a nie na zewnątrz. Kolejnym elementem wartym uwagi jest widok wejścia i wyjścia. Od razu widzimy efekt działania naszego kodu. I co istotne – rezultat mamy na poziomie wiersza a nie pola obliczeniowego zależnego od poziomu szczegółowości wizualizacji. Przykładowo poniższy prosty fragment kodu dodaje nam nową kolumnę ze wskaźnikiem procentowym jednego z pól liczbowych:
Kod, który wykonujemy, jest dość standardowy natomiast musi zawierać dwa elementy. Pierwszym jest argument „_arg1”, który oznacza nasz dataset na wejściu – czyli Input Table. Na nim wykonujemy transformacje. Drugim – zwrócenie wyników poleceniem return …to_dict – pozwala to zwrócić rezultat w postaci tabeli Output Table. Ta tabele następnie staje się naszym źródłem danych, które możemy analizować i wizualizować w Tableau. Warto zaznaczyć, że dodatkowe kolumny uzyskane w ten sposób nie są już polami obliczeniowymi – są taki samymi elementami jak kolumny, które już wcześniej istniały w datasecie:
Oczywiście powyższe zastosowanie jest bardzo proste i możliwe do zrobienia bez Pythona. Natomiast jeżeli chcemy wykorzystać przykładowo modele uczenia maszynowego to będzie to bardzo dobre miejsce do tego. Trenując model na danych Input Table możemy w łatwy sposób wygenerować predykcje i następnie porównać je z wartościami realnymi. Nie musimy tego robić w środowisku zewnętrznym i potem importować do Tableau – robimy to od razu w jednym miejscu. Na poniższym przykładzie model uczenia maszynowego zwraca nam predykcję ceny, na podstawie danych historycznych:
Tableau Table Extension + Python to kolejny krok do przodu
Tableau z pewnością dostrzega rolę i szerokie zastosowanie Pythona w obszarze Data Science. Dzięki temu dostajemy coraz to bardziej użyteczne sposoby integracji, co umożliwia wyciągnięcie tego co najlepsze z obu technologii. Python – data science, modelowanie danych, machine learing. Tableau – analiza, wizualizacja, eksploracja. Z pewnością jest to krok do przodu w elastyczności możliwych zastosowań Tableau w szeroko rozumianym obszarze Data Science.
Mateusz Karmalski Tableau Author.