SAS til Python: hvad det reelt koster

De fleste resultater for denne søgning er værktøjer, der laver Python ud af SAS-kildekode, og flere af dem gør det godt. Denne side begynder et skridt tidligere: om flytningen overhovedet er rigtig for jeres kodebase, hvad det koster at efterprøve resultatet, og hvad I gør, når svaret er nej.

Det korte svar

Der er fire veje ud af en SAS-kodebase, ikke to: aflevere den til et automatisk værktøj, omskrive den i hånden, køre SAS-programmerne som de er på noget, der ikke er SAS, eller lade den være. Hvilken der er rigtig afhænger næsten udelukkende af to spørgsmål: hvor meget kode der er, og om nogen skal kunne genskabe det, programmerne gav før. Alt herunder er, hvad hver vej koster.

Hvornår Python er det rigtige svar

Python er oftere den bedre destination, end en side som denne plejer at indrømme. Fire betingelser gør det tydeligt: kodebasen er lille nok til, at én person læser den på en uge, holdet skriver i forvejen Python dagligt, analysen skal alligevel bygges om, og intet længere nede kræver, at de nye tal passer nøjagtigt med de gamle. Holder alle fire, er det billigere at skrive om end at lægge et kompatibilitetslag ind, og tilbage står kode, som holdet kan vedligeholde uden at slæbe rundt på et andet sprog.

Fire veje og hvad hver især koster

Hver mulighed her er det rigtige svar for nogen. Ingen af dem er uden omkostning, og den dyre del er aldrig syntaksen.

En automatisk konverter

Webværktøjer, leverandørtjenester og store sprogmodeller tager .sas-kildekode og giver Python tilbage, typisk ved at afbilde DATA-trin på pandas og de gængse procedurer på statsmodels eller scikit-learn. For et par hundrede linjers ligefrem databehandling er det en reel genvej, og I har et læsbart udgangspunkt på minutter. Regningen kommer senere: hver linje af resultatet skal læses af nogen, der kan begge sprog.

En omskrivning i hånden

Nogen læser SAS-programmet, regner ud hvad det skulle gøre, og skriver det i Python. Det starter langsommere og er den eneste vej, der ender med kode formet som Python frem for SAS i Python-frakke. Hold, der to år senere er tilfredse med Python, kom næsten altid dertil sådan og lod som regel det gamle program køre ved siden af, indtil tallene passede.

Kør programmerne som de er — 100 procedurer

Vejen som sammenligningssiderne springer over. Jenner er en clean room-implementering af SAS 9.4-sproget skrevet i Rust: den læser SAS7BDAT-filer direkte og kører .sas-kildekode, som den står, så der er ingen genereret kode at læse igennem og intet andet sprog for holdet at bære. Det den ikke gør, er at dække hele SAS-sproget, og dækningen offentliggøres procedure for procedure, så I kan tjekke jeres egen, før I læner jer op ad den.

Blive hvor I er

At gøre ingenting er en rigtig beslutning og ofte den rette. Hvis koden er stabil, miljøet den kører i ikke forsvinder i år, og ingen beder om en ændring, giver den migrering I ikke laver det bedste afkast på hele denne side. Tag spørgsmålet op igen, når et platformsskifte, et tilsyn eller et rekrutteringsproblem tvinger det frem.

Hvad det koster at stole på konverteret kode

Måden en automatisk konvertering fejler på er ikke syntaksfejlen; den dukker op første gang koden kører. Det er den tavse numeriske forskel. SAS fylder tegnværdier ud med mellemrum til højre, og det gør Python ikke; SAS tæller datoer fra den 1. januar 1960, mens pandas tæller fra den 1. januar 1970; og et MERGE i et DATA-trin opfører sig ikke som et merge i pandas, når nøglen gentages i begge sider. Intet af det giver et signal. Der kommer et tal ud, som næsten passer, og det er den værste slags forkert. Derfor er den reelle pris en linje-for-linje-læsning af nogen, der behersker begge sprog, plus en periode hvor gammelt og nyt kører side om side på de samme data, indtil outputtet stemmer — og den pris vokser med mængden af kode, ikke med hvor snedig den er.

Ofte stillede spørgsmål

Ja, og værktøjerne er bedre, end de var. Webkonvertere og leverandørtjenester tager en .sas-fil og giver Python tilbage, og en stor sprogmodel (LLM) gør det samme fra et chatvindue. De er alle gode til syntaks, og ingen af dem kan fortælle jer, om tallene stadig passer. Behandl resultatet som et første udkast skrevet af nogen, der aldrig har set jeres data.

Nej. Den udgives af Jenner, en uafhængig clean room-implementering af SAS 9.4-sproget skrevet i Rust. Den kører .sas-programmer præcis som de er skrevet, på de SAS7BDAT-filer I allerede har. Der bliver ikke udsendt noget på et andet sprog, så der er ingen genereret kildekode, nogen skal læse igennem.

Som regel én Python-fil per SAS-program: DATA-trin gengivet som pandas-operationer, PROC SQL enten som pandas-joins eller som SQL gennem en databasedriver, og de statistiske procedurer afbildet på statsmodels, scipy eller scikit-learn, hvor der findes en modsvarighed. Hvor der ikke gør — store dele af makrosproget, ODS-output, mange formater og informater — efterlader værktøjet en kommentar eller sit bedste gæt. Det er i det hul, gennemlæsningstiden forsvinder.

Der findes gode, og de deler alle en grænse, der er værd at kende, før man læner sig op ad en. Et snydeark kobler PROC MEANS til et describe i pandas, PROC FREQ til value_counts eller en krydstabel, PROC SORT til sort_values og et DATA-trin til en kæde af tildelinger. Det er syntakslaget, og syntaksen er ikke den svære del. Det ingen tabel kan oversætte, er semantikken nedenunder — håndtering af manglende værdier, BY-gruppebehandling, afsluttende mellemrum i tegnsammenligninger, datoernes nulpunkt — og det er dér, konverteret kode bliver stille forkert.

Ja, og for et kort program er det ofte den korteste vej til et første udkast. Hagen er enhver konverters hage, gjort værre af flydende sprog: en LLM skriver kode, der læses overbevisende, uanset om den er rigtig, og den opfinder en plausibel modsvarighed til en procedureindstilling, den ikke kender. Løsningen er ikke en bedre prompt. Den er at give modellen en måde at køre begge versioner og sammenligne output, så kontrollen bliver mekanisk i stedet for et spørgsmål om, hvor sikkert svaret lød.

Udefra kan ingen sige det, og en side der giver jer et tal, gætter. De to variabler der betyder noget, er hvor mange linjer der er, og hvor hårdt kravet er om, at nyt output skal passe med gammelt. Nogle tusinde linjer uden krav om reproduktion er et projekt, et lille hold bliver færdigt med; en valideret kodebase, hvis tidligere resultater skal kunne genskabes, er et program med testbudget, og at skrive koden er den lille del.

Når outputtet skal genskabe det, de gamle programmer gav, og nogen uden for holdet skal kontrollere det. Når kodebasen er så stor, at ingen har læst det hele. Når dem der forstår analysen ikke er dem der skriver Python. Hvert af de tilfælde gør et kodningsarbejde til et valideringsarbejde, og det er valideringen, der får den slags projekter til at skride.

At køre SAS-programmerne uden SAS. En uafhængig implementering af SAS-sproget kører den .sas-kildekode I allerede har, hvilket betyder ingen genereret kode at læse igennem og intet andet sprog i lokalet. Jenner er en af dem. Altair SLC, tidligere WPS, er en anden og har gjort det langt længere. Denne vej er værd at prissætte, hver gang grunden til at rejse er platformen eller licensen frem for sproget selv.

Ja. SAS7BDAT-filer læses direkte, så intet skal eksporteres til CSV først. Det betyder mere, end det lyder. En migrering der begynder med at hælde hvert datasæt ud som tekst, arver et andet sæt forskelle — tegnkodninger, numerisk præcision, datofortolkning — oven på dem der allerede er i koden, og bagefter kan ingen sige, hvilket lag en afvigelse kom fra.

Ikke hele SAS-sproget, og det er den ærlige grænse at veje op mod alt ovenstående. Hver implementeret procedure har en offentliggjort referenceside, så om en bestemt PROC er understøttet, kan tjekkes før I læner jer op ad den frem for at opdage det bagefter. Programmer der bygger på sjældne procedureindstillinger, ODS-layouts eller eksterne databasemotorer er det første sted at se. Den praktiske prøve er at køre jeres egne programmer og sammenligne loggene; det tager en eftermiddag og afgør spørgsmålet bedre end nogen påstand på en side som denne.

Altair SLC, der var WPS, kører programmer i SAS-sproget uden SAS og har gjort det langt længere end vi har. På en stor bestand, hvor en anden allerede har ramt jeres kantsituation og fået den rettet, er den historik rigtige penge værd. Stil dem begge foran jeres egen kode og sammenlign loggene. Svaret er som regel tydeligt inden for en dag, og det er ikke altid os.

Det er den almindelige slutning og en rimelig en. Nye analyser skrives i Python, fordi holdet og bibliotekerne allerede er der, mens de ældre validerede programmer bliver ved med at køre, som de er, indtil der er grund til at røre dem. Det undgår den værste udgave af beslutningen: en omskrivning på én gang af kode, ingen har budget til at validere igen. De to sider skal kun være enige ved grænsen — om de data de rækker hinanden — og ikke linje for linje.

Afgør det på jeres egne programmer

Jeres kode, jeres data og loggene side om side. Det er den sammenligning der afgør det, og ingen kan køre den for jer.

Start gratis prøveperiode