SAS do Pythona: ile to naprawdę kosztuje

Większość wyników tego wyszukiwania to narzędzia, które produkują Pythona ze źródeł SAS, i kilka z nich robi to dobrze. Ta strona zaczyna o krok wcześniej: czy przenosiny w ogóle mają sens dla waszej bazy kodu, ile kosztuje sprawdzenie wyniku i co zrobić, gdy odpowiedź brzmi nie.

Krótka odpowiedź

Z bazy kodu w SAS wychodzą cztery drogi, nie dwie: oddać ją automatycznemu narzędziu, przepisać ręcznie, uruchomić programy SAS bez zmian na czymś, co nie jest SAS, albo zostawić ją w spokoju. Która jest właściwa, zależy niemal wyłącznie od dwóch pytań: ile jest kodu i czy ktoś musi odtworzyć to, co programy dawały wcześniej. Wszystko poniżej to koszt każdej drogi.

Kiedy Python jest właściwą odpowiedzią

Python bywa lepszym celem częściej, niż strona taka jak ta zwykle przyznaje. Cztery warunki czynią wybór oczywistym: baza kodu jest na tyle mała, że jedna osoba przeczyta ją w tydzień, zespół i tak pisze Pythona na co dzień, analiza i tak zostanie zbudowana od nowa, a nic dalej w łańcuchu nie wymaga, by nowe liczby zgadzały się ze starymi co do cyfry. Gdy zachodzą wszystkie cztery, napisanie od nowa wychodzi taniej niż jakakolwiek warstwa zgodności, a zostaje kod, który zespół utrzyma bez drugiego języka.

Cztery drogi i koszt każdej

Każda opcja tutaj jest dla kogoś właściwą odpowiedzią. Żadna nie jest bez kosztu, a droga część to nigdy nie składnia.

Automatyczny konwerter

Narzędzia webowe, usługi dostawców i duże modele językowe biorą źródło .sas i zwracają Pythona, zwykle odwzorowując kroki DATA na pandas, a popularne procedury na statsmodels lub scikit-learn. Przy kilkuset wierszach prostego przetwarzania danych to prawdziwy skrót, a czytelny punkt wyjścia macie w kilka minut. Rachunek przychodzi później: każdy wiersz wyniku musi przeczytać ktoś, kto zna oba języki.

Przepisanie ręczne

Ktoś czyta program SAS, ustala, co miał robić, i pisze to w Pythonie. Rusza wolniej i jest jedyną drogą, która kończy się kodem o kształcie Pythona, a nie SAS w pythonowym płaszczu. Zespoły zadowolone z Pythona po dwóch latach prawie zawsze doszły tam w ten sposób, zwykle pozwalając staremu programowi działać obok, aż liczby się zgodziły.

Uruchom programy bez zmian — 100 procedur

Droga, którą strony porównawcze pomijają. Jenner to implementacja języka SAS 9.4 wykonana w czystym pokoju i napisana w Rust: czyta pliki SAS7BDAT bezpośrednio i wykonuje źródło .sas takie, jakie jest, więc nie ma wygenerowanego kodu do przejrzenia ani drugiego języka do dźwigania przez zespół. Czego nie robi, to pokrycie całego języka SAS, a zakres jest publikowany procedura po procedurze, żebyście sprawdzili swoją, zanim na niej polegniecie.

Zostać tam, gdzie jesteście

Nicnierobienie to prawdziwa decyzja i często słuszna. Jeśli kod jest stabilny, środowisko, w którym działa, nie znika w tym roku i nikt nie prosi o zmianę, migracja, której nie robicie, ma najlepszy zwrot z całej tej strony. Wróćcie do pytania, gdy wymusi je zmiana platformy, audyt albo problem z rekrutacją.

Ile kosztuje zaufanie do kodu po konwersji

Automatyczna konwersja nie zawodzi na błędzie składni; ten wychodzi przy pierwszym uruchomieniu. Zawodzi cichą różnicą liczbową. SAS dopełnia wartości znakowe spacjami z prawej, a Python nie, SAS liczy daty od 1 stycznia 1960, podczas gdy pandas od 1 stycznia 1970, a MERGE w kroku DATA nie zachowuje się jak merge w pandas, gdy klucz powtarza się po obu stronach. Nic z tego niczego nie zgłasza. Wychodzi liczba prawie poprawna, a to najgorszy rodzaj błędu. Dlatego prawdziwą ceną jest czytanie wiersz po wierszu przez kogoś, kto włada oboma językami, plus okres, w którym stare i nowe działają obok siebie na tych samych danych, aż wyniki się zgodzą — a ta cena rośnie z ilością kodu, nie z jego pomysłowością.

Najczęściej zadawane pytania

Można, a narzędzia są lepsze niż kiedyś. Konwertery webowe i usługi dostawców biorą plik .sas i zwracają Pythona, a duży model językowy (LLM) zrobi to samo z okna czatu. Wszystkie dobrze radzą sobie ze składnią i żadne nie powie wam, czy liczby nadal się zgadzają. Traktujcie wynik jak pierwszy szkic napisany przez kogoś, kto nigdy nie widział waszych danych.

Nie. Wydaje ją Jenner, niezależna implementacja języka SAS 9.4 wykonana w czystym pokoju i napisana w Rust. Uruchamia programy .sas dokładnie tak, jak zostały napisane, na plikach SAS7BDAT, które już macie. Nic nie jest wydawane w innym języku, więc nie ma wygenerowanego źródła, które ktoś musiałby przeglądać.

Zwykle jeden plik Pythona na jeden program SAS: kroki DATA jako operacje pandas, PROC SQL jako złączenia pandas albo jako SQL przez sterownik bazy danych, a procedury statystyczne odwzorowane na statsmodels, scipy lub scikit-learn tam, gdzie odpowiednik istnieje. Tam, gdzie nie istnieje — spora część języka makr, wyjście ODS, wiele formatów i informatów — narzędzie zostawia komentarz albo swoje najlepsze zgadnięcie. W tej szczelinie znika czas na przegląd.

Istnieją dobre i wszystkie dzielą jedną granicę, którą warto znać, zanim się na nich oprzecie. Ściąga przypisuje PROC MEANS do describe w pandas, PROC FREQ do value_counts albo tabeli krzyżowej, PROC SORT do sort_values, a krok DATA do łańcucha przypisań. To warstwa składni, a składnia nie jest trudną częścią. Czego żadna tabela nie przetłumaczy, to semantyka pod spodem — obsługa braków danych, przetwarzanie po grupach BY, końcowe spacje w porównaniach znakowych, punkt zerowy dat — i właśnie tam kod po konwersji cicho się myli.

Przetłumaczy, a przy krótkim programie to często najkrótsza droga do pierwszego szkicu. Haczyk ma każdy konwerter, tylko tu pogarsza go płynność: LLM pisze kod, który czyta się przekonująco niezależnie od tego, czy jest poprawny, i wymyśli wiarygodny odpowiednik dla opcji procedury, której nie zna. Lekarstwem nie jest lepszy prompt. Jest nim danie modelowi sposobu na uruchomienie obu wersji i porównanie wyników, żeby sprawdzenie było mechaniczne, a nie kwestią tego, jak pewnie brzmiała odpowiedź.

Z zewnątrz nikt wam tego nie powie, a strona, która podaje liczbę, zgaduje. Liczą się dwie zmienne: ile jest wierszy i jak twarde jest wymaganie, by nowy wynik zgadzał się ze starym. Kilka tysięcy wierszy bez wymogu odtwarzalności to projekt, który mały zespół kończy; zwalidowana baza kodu, której wcześniejsze wyniki muszą być odtwarzalne, to program z budżetem na testy, a pisanie kodu jest jego małą częścią.

Gdy wynik musi odtworzyć to, co dawały stare programy, i sprawdzi to ktoś spoza zespołu. Gdy baza jest tak duża, że nikt nie przeczytał jej w całości. Gdy ludzie rozumiejący analizę to nie są ludzie piszący w Pythonie. Każdy z tych przypadków zamienia pracę programistyczną w pracę walidacyjną, a to walidacja rozsadza takie projekty.

Uruchamianie programów SAS bez SAS. Niezależna implementacja języka SAS wykonuje źródło .sas, które już macie, co oznacza brak wygenerowanego kodu do przeglądania i brak drugiego języka w pokoju. Jenner jest jedną z nich. Altair SLC, dawniej WPS, jest drugą i robi to znacznie dłużej. Tę drogę warto wycenić zawsze, gdy powodem odejścia jest platforma albo licencja, a nie sam język.

Przeczyta. Pliki SAS7BDAT są czytane bezpośrednio, więc niczego nie trzeba najpierw eksportować do CSV. To znaczy więcej, niż brzmi. Migracja, która zaczyna się od wysypania każdego zbioru do tekstu, dziedziczy drugi zestaw różnic — kodowania, precyzja liczbowa, odczyt dat — na wierzchu tych, które już są w kodzie, a potem nikt nie powie, z której warstwy wzięła się rozbieżność.

Nie całego języka SAS, i to jest uczciwa granica, którą trzeba położyć naprzeciw wszystkiego powyżej. Każda zaimplementowana procedura ma opublikowaną stronę referencyjną, więc to, czy konkretna PROC jest wspierana, sprawdza się przed oparciem się na niej, a nie odkrywa potem. Programy opierające się na rzadkich opcjach procedur, układach ODS albo zewnętrznych silnikach baz danych to pierwsze miejsce do sprawdzenia. Praktyczną próbą jest uruchomienie własnych programów i porównanie logów; zajmuje popołudnie i rozstrzyga sprawę lepiej niż jakiekolwiek twierdzenie na stronie takiej jak ta.

Altair SLC, dawniej WPS, uruchamia programy w języku SAS bez SAS i robi to znacznie dłużej niż my. Na dużym parku, gdzie ktoś inny już trafił na wasz przypadek brzegowy i doprowadził do poprawki, ta historia jest warta prawdziwych pieniędzy. Postawcie oba przed własnym kodem i porównajcie logi. Odpowiedź zwykle jest oczywista w ciągu dnia i nie zawsze jesteśmy nią my.

To zwykłe zakończenie i rozsądne. Nowe analizy pisze się w Pythonie, bo zespół i biblioteki już tam są, a starsze zwalidowane programy działają bez zmian, dopóki nie ma powodu ich dotykać. Unika to najgorszej wersji tej decyzji: przepisania naraz kodu, na którego ponowną walidację nikt nie ma budżetu. Obie strony muszą zgadzać się tylko na granicy — co do danych, które sobie przekazują — a nie wiersz po wierszu.

Rozstrzygnijcie to na własnych programach

Wasz kod, wasze dane i logi obok siebie. To jest porównanie, które rozstrzyga, i nikt nie uruchomi go za was.

Rozpocznij bezpłatny okres próbny