SAS에서 Python으로: 실제로 드는 것

이 검색의 결과 대부분은 SAS 소스에서 Python을 만들어 주는 도구이고, 그중 몇몇은 그 일을 잘합니다. 이 페이지는 한 걸음 앞에서 시작합니다. 그 이동이 당신의 코드베이스에 정말 맞는지, 결과를 검증하는 데 무엇이 드는지, 그리고 답이 아니오일 때 무엇을 해야 하는지.

짧은 답

SAS 코드베이스에서 나가는 길은 둘이 아니라 넷입니다. 자동 도구에 맡기기, 사람이 다시 작성하기, SAS가 아닌 것 위에서 SAS 프로그램을 그대로 실행하기, 그리고 아무것도 하지 않기. 어느 쪽이 맞는지는 거의 두 질문으로 정해집니다. 코드가 얼마나 많은가, 그리고 예전 출력을 누군가 재현해야 하는가. 아래는 각 길의 비용입니다.

Python이 올바른 답일 때

Python이 더 나은 목적지인 경우는 이런 페이지가 보통 인정하는 것보다 많습니다. 네 가지 조건이 맞으면 답은 분명합니다. 코드베이스가 한 사람이 일주일에 읽을 만큼 작고, 팀이 이미 매일 Python을 쓰고, 분석을 어차피 다시 만들며, 새 숫자가 옛 숫자와 정확히 맞아야 한다고 요구하는 곳이 아래쪽에 없을 때입니다. 네 가지가 모두 성립하면 어떤 호환 계층보다 새로 쓰는 편이 싸고, 남는 것은 두 번째 언어를 떠안지 않고도 팀이 유지할 수 있는 코드입니다.

네 가지 길과 각각의 비용

여기 있는 모든 선택지는 누군가에게는 올바른 답입니다. 대가 없이 되는 것은 하나도 없고, 비싼 부분은 결코 문법이 아닙니다.

자동 변환 도구

웹 도구, 벤더 서비스, 대규모 언어 모델은 .sas 소스를 받아 Python을 돌려주며, 보통 DATA 스텝을 pandas에, 흔한 프로시저를 statsmodels나 scikit-learn에 대응시킵니다. 단순한 데이터 가공 수백 줄이라면 이것은 진짜 지름길이고, 읽을 만한 출발점을 몇 분 만에 얻습니다. 청구서는 나중에 옵니다. 출력의 모든 줄을 두 언어를 아는 사람이 읽어야 하기 때문입니다.

사람이 손으로 새로 쓰기

누군가 SAS 프로그램을 읽고, 무엇을 하려던 것인지 알아내어, 그것을 Python으로 씁니다. 시작은 더 느리고, 그리고 SAS가 Python 옷을 입은 모양이 아니라 Python다운 모양의 코드로 끝나는 유일한 길입니다. 이 년 뒤에도 Python에 만족하는 팀은 대개 이 길로 왔고, 숫자가 맞을 때까지 옛 프로그램을 옆에서 계속 돌렸습니다.

프로그램을 그대로 실행 — 100개 프로시저

비교 페이지들이 건너뛰는 길입니다. Jenner는 SAS 9.4 언어의 클린룸 구현이며 Rust로 작성되었습니다. SAS7BDAT 파일을 직접 읽고 .sas 소스를 있는 그대로 실행하므로, 되짚어 볼 생성 코드도 없고 팀이 떠안을 두 번째 언어도 없습니다. 못 하는 것은 SAS 언어 전체를 덮는 일이고, 지원 범위는 프로시저 단위로 공개되어 있어 의존하기 전에 자기 것을 확인할 수 있습니다.

있던 자리에 머무르기

아무것도 하지 않는 것은 실제 결정이고 흔히 옳은 결정입니다. 코드가 안정적이고, 그것이 도는 환경이 올해 사라지지 않으며, 아무도 변경을 요구하지 않는다면, 하지 않는 마이그레이션이 이 페이지에서 수익률이 가장 높습니다. 플랫폼 이전, 감사, 채용 문제가 이 질문을 밀어붙일 때 다시 꺼내면 됩니다.

변환된 코드를 믿는 데 드는 값

자동 변환의 실패 방식은 문법 오류가 아닙니다. 문법 오류는 처음 돌릴 때 드러납니다. 문제는 조용한 수치 차이입니다. SAS는 문자 값의 오른쪽을 공백으로 채우지만 Python은 그러지 않고, SAS는 날짜를 1960년 1월 1일부터 세는 반면 pandas는 1970년 1월 1일부터 세며, DATA 스텝의 MERGE는 키가 양쪽에서 반복될 때 pandas의 merge와 같게 동작하지 않습니다. 어느 것도 아무 경고를 내지 않습니다. 거의 맞는 숫자가 나올 뿐이고, 그것이 가장 나쁜 종류의 오답입니다. 그래서 진짜 값은 두 언어에 능숙한 사람의 한 줄씩 읽기, 그리고 출력이 일치할 때까지 같은 입력으로 옛것과 새것을 나란히 돌리는 기간입니다. 그 값은 코드의 양에 따라 커지지, 코드의 영리함에 따라 커지지 않습니다.

자주 묻는 질문

할 수 있고, 도구는 예전보다 좋아졌습니다. 웹 변환기와 벤더 서비스는 .sas 파일을 받아 Python을 돌려주고, 대규모 언어 모델(LLM)도 채팅 창에서 같은 일을 합니다. 모두 문법에는 능하고, 숫자가 여전히 맞는지는 아무도 말해 주지 못합니다. 출력은 당신의 데이터를 한 번도 본 적 없는 사람이 쓴 초고로 다루세요.

아닙니다. 이 페이지는 Jenner가 냅니다. Jenner는 SAS 9.4 언어의 독립적인 클린룸 구현이며 Rust로 작성되었습니다. 쓰인 그대로 .sas 프로그램을 실행하고, 이미 가지고 있는 SAS7BDAT 파일을 읽습니다. 다른 언어로 무엇이 출력되는 일은 없으므로, 누군가 되짚어 볼 생성 소스도 없습니다.

대개 SAS 프로그램 하나당 Python 파일 하나입니다. DATA 스텝은 pandas 연산으로, PROC SQL은 pandas 조인이나 데이터베이스 드라이버를 통한 SQL로, 통계 프로시저는 대응물이 있으면 statsmodels, scipy, scikit-learn으로 옮겨집니다. 대응물이 없는 곳 — 매크로 기능의 상당 부분, ODS 출력, 많은 포맷과 인포맷 — 에서는 도구가 주석이나 나름의 추측을 남깁니다. 검토 시간은 그 틈에서 사라집니다.

좋은 것들이 있고, 모두 의지하기 전에 알아 둘 같은 한계를 공유합니다. 치트시트는 PROC MEANS를 pandas의 describe에, PROC FREQ를 value_counts나 교차표에, PROC SORT를 sort_values에, DATA 스텝을 대입의 연쇄에 대응시킵니다. 그것은 문법 층이고, 문법은 어려운 부분이 아닙니다. 어떤 표도 번역하지 못하는 것은 그 아래의 의미론입니다. 결측값 처리, BY 그룹 처리, 문자 비교에서의 끝 공백, 날짜의 원점 — 조용히 틀리는 자리가 바로 거기입니다.

할 수 있고, 짧은 프로그램이라면 초고까지 가는 가장 짧은 길인 경우가 많습니다. 함정은 어느 변환기나 가진 함정이 유창함 때문에 더 커진 것입니다. LLM은 맞든 틀리든 설득력 있게 읽히는 코드를 쓰고, 모르는 프로시저 옵션에는 그럴듯한 대응물을 지어냅니다. 해법은 더 나은 프롬프트가 아닙니다. 모델에게 두 버전을 실행하고 출력을 비교할 방법을 주어, 확인이 답의 자신감이 아니라 기계적인 작업이 되게 하는 것입니다.

밖에서는 아무도 말해 줄 수 없고, 숫자를 제시하는 페이지는 짐작하는 것입니다. 중요한 변수는 두 가지입니다. 줄이 몇 줄인지, 그리고 새 출력이 옛 출력과 일치해야 한다는 요구가 얼마나 강한지. 재현 요구가 없는 수천 줄은 작은 팀이 끝낼 수 있는 프로젝트이지만, 과거 결과가 재현 가능해야 하는 검증된 코드베이스는 시험 예산이 붙은 사업이고, 코드를 쓰는 일은 그중 작은 부분입니다.

출력이 옛 프로그램이 내던 것을 재현해야 하고 팀 밖의 누군가가 그것을 확인할 때. 코드베이스가 너무 커서 전부 읽은 사람이 없을 때. 분석을 이해하는 사람이 Python을 쓰는 사람이 아닐 때. 그중 하나만 해당해도 코딩 일이 검증 일로 바뀌고, 이런 일이 예산을 넘기게 만드는 것은 검증 쪽입니다.

SAS 없이 SAS 프로그램을 실행하는 것입니다. SAS 언어의 독립 구현은 이미 가지고 있는 .sas 소스를 실행하므로, 되짚어 볼 생성 코드도 없고 방 안에 두 번째 언어도 없습니다. Jenner가 그중 하나입니다. Altair SLC, 예전의 WPS가 또 하나이며 훨씬 오래 해 왔습니다. 떠나려는 이유가 언어 자체가 아니라 플랫폼이나 라이선스일 때, 이 길은 견적을 받아 볼 가치가 있습니다.

읽습니다. SAS7BDAT 파일을 직접 읽으므로 먼저 CSV로 내보낼 필요가 없습니다. 이것은 들리는 것보다 중요합니다. 모든 데이터셋을 텍스트로 쏟아내며 시작하는 마이그레이션은 코드에 이미 있는 차이 위에 두 번째 차이 묶음 — 인코딩, 수치 정밀도, 날짜 해석 — 을 얹고, 그다음에는 어긋남이 어느 층에서 왔는지 아무도 가려내지 못합니다.

SAS 언어 전체는 아니며, 그것이 위의 모든 것과 저울에 올려야 할 정직한 한계입니다. 구현된 프로시저마다 공개된 레퍼런스 페이지가 있으므로 특정 PROC이 지원되는지는 나중에 알게 되는 대신 의존하기 전에 확인할 수 있습니다. 드문 프로시저 옵션, ODS 레이아웃, 외부 데이터베이스 엔진에 기대는 프로그램이 가장 먼저 볼 곳입니다. 실질적인 시험은 자기 프로그램을 돌려 로그를 비교하는 것이고, 반나절이면 되며 이런 페이지의 어떤 주장보다 확실하게 결론을 냅니다.

Altair SLC, 예전의 WPS는 SAS 없이 SAS 언어 프로그램을 실행하며 우리보다 훨씬 오래 그렇게 해 왔습니다. 규모가 큰 자산에서 다른 누군가가 이미 당신의 예외 상황에 부딪혀 고쳐지게 했다면, 그 역사는 진짜 돈값을 합니다. 둘 다 자기 코드 앞에 놓고 로그를 비교해 보세요. 답은 대개 하루 안에 분명해지고, 그 답이 언제나 우리인 것은 아닙니다.

그것이 흔한 결말이고 합리적인 결말입니다. 새 분석은 Python으로 쓰입니다. 팀과 라이브러리가 이미 거기에 있기 때문입니다. 한편 검증된 옛 프로그램은 손댈 이유가 생길 때까지 그대로 돕니다. 이것은 이 결정의 최악의 형태, 즉 아무도 재검증 예산이 없는 코드를 한꺼번에 새로 쓰는 일을 피하게 해 줍니다. 두 쪽은 경계에서만, 즉 서로 건네는 데이터에서만 맞으면 되고 한 줄씩 맞출 필요는 없습니다.

자기 프로그램으로 결론을 내세요

당신의 코드, 당신의 데이터, 나란히 놓인 로그. 이것을 정하는 비교는 그것이고, 아무도 대신 돌려 줄 수 없습니다.

무료로 시작하기