SAS till Python: vad det faktiskt kostar

De flesta träffarna för den här sökningen är verktyg som gör Python av SAS-källkod, och flera av dem gör det bra. Den här sidan börjar ett steg tidigare: om flytten över huvud taget är rätt för er kodbas, vad det kostar att verifiera resultatet och vad ni gör när svaret är nej.

Det korta svaret

Det finns fyra vägar ut ur en SAS-kodbas, inte två: lämna den till ett automatiskt verktyg, skriva om den för hand, köra SAS-programmen som de är på något som inte är SAS, eller låta den vara. Vilken som är rätt avgörs nästan helt av två frågor: hur mycket kod det finns, och om någon måste reproducera det som programmen gav förut. Allt nedan är vad varje väg kostar.

När Python är rätt svar

Python är oftare den bättre destinationen än en sida som den här brukar erkänna. Fyra villkor gör saken tydlig: kodbasen är liten nog att en person läser den på en vecka, teamet skriver redan Python dagligen, analysen ska ändå byggas om, och inget längre ner kräver att de nya siffrorna stämmer exakt med de gamla. Håller alla fyra är det billigare att skriva om än att lägga till ett kompatibilitetslager, och kvar blir kod som teamet kan underhålla utan att bära på ett andra språk.

Fyra vägar och vad var och en kostar

Varje alternativ här är rätt svar för någon. Inget av dem är utan kostnad, och den dyra delen är aldrig syntaxen.

En automatisk konverterare

Webbverktyg, leverantörstjänster och stora språkmodeller tar .sas-källkod och lämnar tillbaka Python, oftast genom att avbilda DATA-steg på pandas och de vanliga procedurerna på statsmodels eller scikit-learn. För några hundra rader rättfram databearbetning är det en verklig genväg, och ni får en läsbar utgångspunkt på minuter. Räkningen kommer senare: varje rad av resultatet måste läsas av någon som kan båda språken.

Omskrivning för hand

Någon läser SAS-programmet, listar ut vad det var tänkt att göra och skriver det i Python. Det startar långsammare och är den enda vägen som slutar med kod som är formad som Python i stället för SAS i Python-kostym. Team som två år senare är nöjda med Python kom nästan alltid dit så här, oftast genom att låta det gamla programmet gå bredvid tills siffrorna stämde.

Kör programmen som de är — 100 procedurer

Vägen som jämförelsesidorna hoppar över. Jenner är en clean room-implementation av SAS 9.4-språket skriven i Rust: den läser SAS7BDAT-filer direkt och kör .sas-källkod som den står, så det finns ingen genererad kod att läsa igenom och inget andra språk för teamet att bära. Vad den inte gör är att täcka hela SAS-språket, och täckningen publiceras procedur för procedur så att ni kan kontrollera er egen innan ni förlitar er på den.

Stanna där ni är

Att inte göra något är ett verkligt beslut och ofta det rätta. Om koden är stabil, miljön den kör i inte försvinner i år och ingen ber om en förändring, har den migrering ni inte gör bäst avkastning av allt på den här sidan. Ta upp frågan igen när ett plattformsbyte, en granskning eller ett rekryteringsproblem tvingar fram den.

Vad det kostar att lita på konverterad kod

Felläget hos en automatisk konvertering är inte syntaxfelet; det dyker upp första gången koden körs. Det är den tysta numeriska skillnaden. SAS fyller ut teckenvärden med blanksteg till höger och Python gör det inte, SAS räknar datum från den 1 januari 1960 medan pandas räknar från den 1 januari 1970, och ett MERGE i ett DATA-steg beter sig inte som en merge i pandas när nyckeln upprepas på båda sidor. Inget av det larmar. Det kommer ut ett tal som nästan stämmer, vilket är den värsta sortens fel. Därför är det verkliga priset en rad-för-rad-läsning av någon som behärskar båda språken, plus en period där gammalt och nytt körs sida vid sida på samma indata tills utdata stämmer överens — och det priset växer med mängden kod, inte med hur påhittig den är.

Vanliga frågor

Ja, och verktygen är bättre än de var. Webbkonverterare och leverantörstjänster tar en .sas-fil och lämnar tillbaka Python, och en stor språkmodell (LLM) gör samma sak från ett chattfönster. Alla är bra på syntax, och ingen av dem kan tala om för er om siffrorna fortfarande stämmer. Behandla resultatet som ett första utkast skrivet av någon som aldrig har sett era data.

Nej. Den ges ut av Jenner, en oberoende clean room-implementation av SAS 9.4-språket skriven i Rust. Den kör .sas-program precis som de är skrivna, mot de SAS7BDAT-filer ni redan har. Ingenting lämnas ifrån sig på ett annat språk, så det finns ingen genererad källkod för någon att gå igenom.

Oftast en Python-fil per SAS-program: DATA-steg återgivna som pandas-operationer, PROC SQL antingen som pandas-joins eller som SQL via en databasdrivrutin, och de statistiska procedurerna avbildade på statsmodels, scipy eller scikit-learn där det finns en motsvarighet. Där det inte finns någon — stora delar av makrospråket, ODS-utdata, många format och informat — lämnar verktyget en kommentar eller sin bästa gissning. Det är i den luckan granskningstiden försvinner.

Det finns bra sådana, och alla delar en gräns som är värd att känna till innan man lutar sig mot dem. En fusklapp kopplar PROC MEANS till ett describe i pandas, PROC FREQ till value_counts eller en korstabell, PROC SORT till sort_values och ett DATA-steg till en kedja av tilldelningar. Det är syntaxlagret, och syntaxen är inte den svåra delen. Det ingen tabell kan översätta är semantiken under — hantering av saknade värden, BY-gruppsbearbetning, avslutande blanksteg vid teckenjämförelser, datumens nollpunkt — och det är där konverterad kod blir tyst fel.

Ja, och för ett kort program är det ofta den kortaste vägen till ett första utkast. Haken är varje konverterares hake, förvärrad av flytet: en LLM skriver kod som läses övertygande oavsett om den stämmer, och hittar på en rimlig motsvarighet till en procedurinställning den inte känner till. Botemedlet är inte en bättre prompt. Det är att ge modellen ett sätt att köra båda versionerna och jämföra utdata, så att kontrollen blir mekanisk i stället för en fråga om hur säkert svaret lät.

Ingen kan säga det utifrån, och en sida som ger er en siffra gissar. De två variabler som spelar roll är hur många rader det finns och hur hårt kravet är att ny utdata ska stämma med gammal. Några tusen rader utan reproduktionskrav är ett projekt som ett litet team blir klart med; en validerad kodbas vars tidigare resultat måste gå att återskapa är ett program med testbudget, och att skriva koden är den lilla delen.

När utdata måste återskapa det som de gamla programmen gav och någon utanför teamet ska kontrollera det. När kodbasen är så stor att ingen har läst hela. När de som förstår analysen inte är de som skriver Python. Vart och ett av de fallen gör ett kodningsjobb till ett valideringsjobb, och det är valideringen som får sådana här projekt att spricka.

Att köra SAS-programmen utan SAS. En oberoende implementation av SAS-språket kör den .sas-källkod ni redan har, vilket betyder ingen genererad kod att gå igenom och inget andra språk i rummet. Jenner är en av dem. Altair SLC, tidigare WPS, är en annan och har gjort det mycket längre. Den här vägen är värd att prissätta när skälet att lämna är plattformen eller licensen snarare än språket i sig.

Ja. SAS7BDAT-filer läses direkt, så ingenting behöver exporteras till CSV först. Det betyder mer än det låter. En migrering som börjar med att dumpa varje datamängd till text ärver en andra uppsättning skillnader — teckenkodningar, numerisk precision, datumtolkning — ovanpå dem som redan finns i koden, och sedan kan ingen säga vilket lager en avvikelse kom från.

Inte hela SAS-språket, och det är den ärliga gränsen att väga mot allt ovanstående. Varje implementerad procedur har en publicerad referenssida, så om en viss PROC stöds går att kontrollera innan ni förlitar er på den i stället för att upptäcka det efteråt. Program som lutar sig mot ovanliga procedurinställningar, ODS-layouter eller externa databasmotorer är det första stället att titta. Det praktiska provet är att köra era egna program och jämföra loggarna; det tar en eftermiddag och avgör frågan bättre än något påstående på en sida som den här.

Altair SLC, som var WPS, kör program i SAS-språket utan SAS och har gjort det mycket längre än vi. På ett stort bestånd, där någon annan redan har träffat ert gränsfall och fått det åtgärdat, är den historiken värd riktiga pengar. Ställ båda framför er egen kod och jämför loggarna. Svaret är oftast uppenbart inom en dag, och det är inte alltid vi.

Det är den vanliga utgången och en rimlig sådan. Nya analyser skrivs i Python eftersom teamet och biblioteken redan finns där, medan de äldre validerade programmen fortsätter att gå som de är tills det finns skäl att röra dem. Det undviker den värsta versionen av det här beslutet: en storskalig omskrivning av kod som ingen har budget att validera om. De två sidorna behöver bara vara överens vid gränsen — om data de lämnar över till varandra — och inte rad för rad.

Avgör det med era egna program

Er kod, era data och loggarna sida vid sida. Det är den jämförelsen som avgör, och ingen kan köra den åt er.

Starta gratis provperiod