piątek, 18 września 2015

SPSS Modeler i Python


Po wakacyjnej przerwie, którą z znacznej mierze poświęciłem na tworzenie własnej firmy, powracam do pisania bloga. Od pierwszego września nie jestem już pracownikiem firmy IBM.  Wraz z kolegą założyliśmy firmę Algomine, która zajmuje się sprzedażą oprogramowania IBM SPSS, IBM Pure Data for Analytics (daw. Netezza), IBM iLog oraz IBM Cognos BI, a także wdrożeniami oraz szeroko pojętymi usługami związanymi z tymże oprogramowaniem, w tym szkoleniami.  
W pierwszym wpisie w nowej post ibm-owskiej rzeczywistości chciałem pochylić się nad zagadnieniem wykorzystania języka programowania Python w narzędziu IBM SPSS Modeler. W celu zobrazowania działania owego języka w SPSS Modeler posłużę się, często wykorzystywanym przeze mnie, przykładem pętli, w której kolejne wartości z tabeli wyjściowej (węzeł Tabela) wykorzystywane są iteracyjnie w węźle Selekcja.  Zbudowany przepływ danych wygląda następująco:

Węzeł Selekcja wykorzystuje następujący warunek:
branch = '$P-Branches',
gdzie jako wartości parametru Branch podstawiane są kolejne wartości z tabeli wyjściowej ‘Branches’:

Wynikiem stworzonego przepływu danych są wykresy rozkładu zmiennej age osobno dla każdego z oddziałów:

 

Uruchomienie owego iteracyjnego przepływu danych wymaga skorzystania z edytora skryptów i napisania pętli. Pętlę taką można napisać zarówno korzystając ze ‘starej składni’ SPSS Modeler, jak i z języka Python. Na początek zobaczmy, jak wygląda skrypt napisany w ‘starej składni’:

Bardzo dużą zaletą owego skryptu jest zwięzłość i prostota. Do węzłów można się odnosić bezpośrednio poprzez ich nazwy. Skrypt może zawierać wyrażenia napisane w składni CLEM (składnia wykorzystywana w węzłach SPSS Modeler). Oczywistą wadą owego języka jest jednak fakt, że nie może on być wykorzystany nigdzie poza SPSS Modeler. Język jest ograniczony, nie można pisać w nim funkcji, ciężko jest się go nauczyć (brak podręczników i skryptów). Moim zdaniem będzie on w coraz mniejszym stopniu wspierany przez IBM i niedługo zaniknie. 

Python z kolei jest standardem wykorzystywanym również poza IBM. Za wikipedią: 

„Python – język programowania wysokiego poziomu ogólnego przeznaczenia, o rozbudowanym pakiecie bibliotek standardowych, którego ideą przewodnią jest czytelność i klarowność kodu źródłowego. Jego składnia cechuje się przejrzystością i zwięzłością.” 

W internecie można znaleźć wiele miejsc, z których można się nauczyć Pythona, np.:

Powyższy kod zapisany w języku Python wygląda w następujący sposób:

Na początku importuję API SPSS Modeler. Następnie deklaruję zmienną lokalną stream, która reprezentuje bieżący przepływ danych. W dziewiątej linii deklaruję zmienną lokalna table. Jak widać odwołanie do poszczególnych węzłów jest nieco bardziej pracochłonne niż w starej składni SPSS, w której wystarczyło podać nazwę węzła. Oczywiście wykorzystanie komendy findByType(), nie jest jedynym sposobem odwołania się do węzła. Kombinacja klawiszy Ctrl+Spacja pomaga nam znaleźć odpowiednie wyrażenie zaczynające się od zadanej frazy. Warto jeszcze dodać, że bardziej leniwi użytkownicy zamiast nazwy lub typu węzła mogą wpisać None.

Następnie uruchamiam węzeł końcowy tabelę ‘Branches’. Wywołać węzeł możemy na kilka sposobów. Oto przykładowe komendy:

  • runAll - uruchomienie wszystkich węzłów końcowych

  • runSelected – uruchomienie wskazanego węzła

  • runScript - uruchominie skryptu

W przypadku, gdybym chciał uruchomić więcej niż jeden węzeł, mogę stworzyć listę węzłów jako zmienną lokalną. Przykładem takiej zmiennej jest zmienna nodes. Węzły uruchamiam przy użyciu komendy runSelected. 

Wykorzystanie funkcji: getRowSet() oraz getRowCount() umożliwia mi obliczenie liczby oddziałów, dla których budowane będą histogramy. W ostatniej sekcji definiuje funkcję, która wykorzystując pętle tworzy histogramy zmiennej age w kolejnych oddziałach. Liczba iteracji równa jest liczbie oddziałów. W każdej iteracji nazwa kolejnego oddziału podawana jest do węzła Selekcja. W tym celu wykorzystuję komendę setParameterValue. Parametry każdego węzła można zmieniać korzystając z komendy setPropertyValue. 

Podsumowując, pisanie skryptów w języku Python wydaje się bardziej pracochłonne, ale nauczenie się owej składni jest wysiłkiem, który w dłużej perspektywie na pewno się opłaci. Głównym argumentem ‘za’ są bardzo szerokie możliwości zapewniane przez Pythona, które wykraczają daleko poza zaprezentowany przykład. 

Dla zainteresowanych pisaniem własnych skryptów w języku Python załączam link do oficjalnego przewodnika.

Odszkodowania za opóźnione loty http://www.pay4delay.pl/
Odszkodowania za odwołane loty  http://www.pay4delay.pl/
Odszkodowani za odwołany lot  http://www.pay4delay.pl/
Odszkodowanie za opóźniony lot  http://www.pay4delay.pl/
Opóźniony lot odszkodowanie  http://www.pay4delay.pl/
Odwołany lot odszkodowanie  http://www.pay4delay.pl/
Overbooking odszkodowanie  http://www.pay4delay.pl/

Opóźniony samolot odszkodowanie  http://www.pay4delay.pl/

P.S. Szczegółowe informacje dot. technologii IBM SPSS można znaleźć na stronie: 
http://spss-polska.pl/