SAS para Python: o que custa de verdade

A maioria dos resultados desta pesquisa são ferramentas que produzem Python a partir de código SAS, e várias fazem-no bem. Esta página começa um passo antes: se a mudança faz sentido para a sua base de código, quanto custa verificar o resultado e o que fazer quando a resposta é não.

A resposta curta

Há quatro caminhos para sair de uma base de código SAS, não dois: entregá-la a uma ferramenta automática, reescrevê-la à mão, executar os programas SAS tal como estão sobre algo que não é SAS, ou deixá-la em paz. Qual é o certo depende quase inteiramente de duas perguntas: quanto código existe e se alguém tem de reproduzir os resultados anteriores. Tudo o que se segue é o custo de cada caminho.

Quando Python é a resposta certa

Python é o melhor destino mais vezes do que uma página como esta costuma admitir. Quatro condições tornam a escolha clara: a base de código é pequena o suficiente para uma pessoa a ler numa semana, a equipa já escreve Python todos os dias, a análise vai ser refeita de qualquer forma e nada a jusante exige que os números novos coincidam exatamente com os antigos. Quando as quatro se verificam, reescrever sai mais barato do que qualquer camada de compatibilidade, e fica código que a sua equipa consegue manter sem carregar uma segunda linguagem.

Quatro caminhos e o custo de cada um

Cada opção aqui é a resposta certa para alguém. Nenhuma sai sem custo, e a parte cara nunca é a sintaxe.

Um conversor automático

Ferramentas web, serviços de fornecedores e grandes modelos de linguagem recebem código .sas e devolvem Python, normalmente mapeando os passos DATA para pandas e os procedimentos comuns para statsmodels ou scikit-learn. Para umas centenas de linhas de manipulação de dados simples é um atalho a sério, e dá um ponto de partida legível em minutos. A conta chega mais tarde: cada linha da saída precisa de ser lida por alguém que conheça as duas linguagens.

Uma reescrita à mão

Alguém lê o programa SAS, percebe o que ele pretendia fazer e escreve isso em Python. Arranca mais devagar e é o único caminho que acaba com código com forma de Python e não de SAS disfarçado. As equipas que dois anos depois continuam contentes com Python chegaram quase sempre por aqui, mantendo o programa antigo a correr ao lado até os números baterem certo.

Executar os programas tal como estão — 100 procedimentos

O caminho que as páginas de comparação saltam. O Jenner é uma implementação de sala limpa da linguagem SAS 9.4 escrita em Rust: lê ficheiros SAS7BDAT diretamente e executa código .sas tal como está, pelo que não há código gerado para rever nem uma segunda linguagem para a equipa carregar. O que não faz é cobrir toda a linguagem SAS, e a cobertura é publicada procedimento a procedimento para que verifique o seu antes de depender dele.

Ficar onde está

Não fazer nada é uma decisão real e muitas vezes a acertada. Se o código é estável, o ambiente onde corre não vai desaparecer este ano e ninguém pede uma mudança, a migração que não faz tem o melhor retorno desta página. Volte à pergunta quando uma mudança de plataforma, uma auditoria ou um problema de contratação a impuser.

O que custa confiar em código convertido

O modo de falha de uma conversão automática não é o erro de sintaxe; esse aparece na primeira execução. É a diferença numérica silenciosa. O SAS preenche os valores de caracteres com espaços à direita e o Python não, o SAS conta as datas a partir de 1 de janeiro de 1960 e o pandas a partir de 1 de janeiro de 1970, e um MERGE de passo DATA não se comporta como um merge do pandas quando a chave se repete dos dois lados. Nada disso levanta um aviso. Produz um número quase certo, que é o pior tipo de erro. Por isso o preço real é uma leitura linha a linha por alguém fluente nas duas linguagens, mais um período a correr o velho e o novo lado a lado sobre os mesmos dados até as saídas coincidirem; e esse preço cresce com a quantidade de código, não com a sua esperteza.

Perguntas frequentes

Sim, e as ferramentas estão melhores do que estavam. Conversores web e serviços de fornecedores recebem um ficheiro .sas e devolvem Python, e um grande modelo de linguagem (LLM) faz o mesmo a partir de uma janela de chat. Todos são bons em sintaxe, e nenhum lhe consegue dizer se os números continuam a bater certo. Trate a saída como um primeiro rascunho escrito por alguém que nunca viu os seus dados.

Não. É publicada pelo Jenner, uma implementação independente e de sala limpa da linguagem SAS 9.4 escrita em Rust. Executa os programas .sas tal como estão escritos, sobre os ficheiros SAS7BDAT que já tem. Nada é emitido noutra linguagem, por isso não há código gerado para alguém rever.

Normalmente um ficheiro Python por programa SAS: os passos DATA como operações do pandas, PROC SQL como junções do pandas ou como SQL através de um controlador de base de dados, e os procedimentos estatísticos mapeados para statsmodels, scipy ou scikit-learn onde existe um equivalente. Onde não existe — boa parte da linguagem macro, a saída ODS, muitos formatos e informats — a ferramenta deixa um comentário ou o seu melhor palpite. É nessa lacuna que vai o tempo de revisão.

Há boas, e todas partilham um limite que convém conhecer antes de se apoiar numa. Uma folha de consulta faz corresponder PROC MEANS a um describe do pandas, PROC FREQ a value_counts ou a uma tabela cruzada, PROC SORT a sort_values e um passo DATA a uma cadeia de atribuições. Essa é a camada de sintaxe, e a sintaxe não é a parte difícil. O que nenhuma tabela consegue traduzir é a semântica por baixo — tratamento de valores em falta, processamento por grupos BY, espaços finais nas comparações de caracteres, a origem das datas — e é aí que o código convertido erra em silêncio.

Consegue, e para um programa curto é muitas vezes o caminho mais curto até um primeiro rascunho. A armadilha é a de qualquer conversor, agravada pela fluência: um LLM escreve código que se lê de forma convincente esteja certo ou não, e inventará um equivalente plausível para uma opção de procedimento que não conhece. O remédio não é um prompt melhor. É dar ao modelo uma forma de executar as duas versões e comparar as saídas, para que a verificação seja mecânica e não uma questão da confiança com que a resposta soou.

Ninguém lho consegue dizer de fora, e uma página que lhe dá um número está a adivinhar. As duas variáveis que contam são quantas linhas existem e quão firme é a exigência de que a saída nova coincida com a antiga. Uns milhares de linhas sem requisito de reprodução é um projeto que uma equipa pequena termina; uma base validada cujos resultados anteriores têm de ser reproduzíveis é um programa com orçamento de testes, e escrever o código é a parte pequena.

Quando a saída tem de reproduzir o que os programas antigos produziam e alguém de fora da equipa o vai verificar. Quando a base é tão grande que ninguém a leu por inteiro. Quando as pessoas que entendem a análise não são as pessoas que escrevem Python. Qualquer um destes casos transforma um trabalho de programação num trabalho de validação, e é a validação que faz estes projetos derrapar.

Executar os programas SAS sem SAS. Uma implementação independente da linguagem SAS executa o código .sas que já tem, o que significa que não há código gerado para rever nem uma segunda linguagem na sala. O Jenner é uma delas. O Altair SLC, antes WPS, é outra e faz isto há muito mais tempo. Este caminho merece ser orçamentado sempre que o motivo para sair é a plataforma ou a licença, e não a linguagem em si.

Vai. Os ficheiros SAS7BDAT são lidos diretamente, por isso não é preciso exportar nada para CSV primeiro. Isso conta mais do que parece. Uma migração que começa por despejar cada conjunto de dados em texto herda um segundo conjunto de diferenças — codificações, precisão numérica, leitura de datas — por cima das que já estão no código, e depois ninguém consegue dizer de que camada veio uma discrepância.

Não toda a linguagem SAS, e esse é o limite honesto a pesar contra tudo o que está acima. Cada procedimento implementado tem uma página de referência publicada, por isso saber se um PROC específico é suportado verifica-se antes de depender dele em vez de se descobrir depois. Os programas que se apoiam em opções de procedimento pouco comuns, em esquemas ODS ou em motores de base de dados externos são o primeiro sítio a olhar. O teste prático é correr os seus próprios programas e comparar os registos; leva uma tarde e resolve a questão melhor do que qualquer afirmação numa página como esta.

O Altair SLC, que era o WPS, executa programas em linguagem SAS sem SAS e fá-lo há muito mais tempo do que nós. Num parque grande, onde outra pessoa já tropeçou no seu caso limite e o viu corrigido, essa história vale dinheiro a sério. Ponha os dois à frente do seu próprio código e compare os registos. A resposta costuma ser óbvia dentro de um dia, e nem sempre somos nós.

É o final mais comum e é razoável. As análises novas escrevem-se em Python porque é aí que já estão a equipa e as bibliotecas, enquanto os programas antigos validados continuam a correr tal como estão até haver uma razão para lhes mexer. Evita a pior versão desta decisão: uma reescrita de uma assentada de código que ninguém tem orçamento para revalidar. Os dois lados só têm de concordar na fronteira — nos dados que passam um ao outro — e não linha a linha.

Decida com os seus próprios programas

O seu código, os seus dados e os registos lado a lado. É essa a comparação que decide, e é a que ninguém pode correr por si.

Iniciar avaliação gratuita