Dados: e o pandas?
Arcane.Quadro, os seis verbos, e quando chamar o pandas de dentro — com a fronteira dita sem rodeio.
Há duas respostas, e escolher entre elas é uma decisão de tamanho, não de gosto.
A tabela de dados da linguagem#
adopt Arcane.Quadro as Q
vendas := Q.de_vaults([
{"loja": "centro", "mes": "jan", "valor": 1200},
{"loja": "centro", "mes": "fev", "valor": 1500},
{"loja": "praia", "mes": "jan", "valor": 900},
{"loja": "praia", "mes": "fev", "valor": 1100}])
// A forma e {coluna: agregacao}. Com mais de uma, a coluna de saida
// vira 'coluna_agregacao' — e a lista de agregacoes e FECHADA: um nome
// desconhecido e recusado com a lista do que existe, porque ele pode
// vir de um '?agregar=' de uma tela.
resumo := vendas
>> onde valor bigger 1000
>> agrupar "loja"
>> resumir {"valor": ["soma", "contagem"]}
assert len(resumo) is 2
cycle linha in resumo:
out $"{linha["loja"]}: {linha["valor_soma"]} em {linha["valor_contagem"]} mes(es)"onde, pegar, sem, ordenar, agrupar e resumir são operações do >> — e não são palavras reservadas: agrupar e ordenar são nomes bons demais para tirar de quem escreve. O parser as reconhece só logo depois de um >>.
Cinco decisões que explicam o resto#
| Decisão | Porque |
|---|---|
| a linha é um vault | é o que IO.read_csv(c, yes) e Database.query já devolvem |
| por dentro é colunar | descrever e correlacao viram uma passada por coluna |
| todo verbo devolve um quadro novo | o pipeline fica reexecutável, como record/with |
| a ausência tem um nome só | void, texto vazio e NaN são a mesma coisa — separá-los é metade do bug de limpeza |
| coluna que não existe é erro, com sugestão | devolver coluna vazia calada é o jeito mais rápido de um relatório sair errado |
Quando chamar o pandas#
adopt Python.pandas as pd traz a biblioteca inteira, e a ponte não converte: um DataFrame continua um DataFrame, e df["b"].sum() é o código do pandas rodando — não um laço daqui. Isso funciona porque o interpretador trata objeto estranho por protocolo: membro, método, índice, len, iteração, aritmética e verdade já passavam assim.
O exemplo abaixo usa um módulo da biblioteca do próprio Python, que existe em toda instalação — com o pandas seria idêntico, e este bloco roda na verificação da documentação:
adopt Python.statistics as st
notas := [7.0, 8.5, 6.0, 9.5]
assert st.mean(notas) is 7.75
out $"media {st.mean(notas)}, mediana {st.median(notas)}"Use o Quadro quando | Use o pandas quando |
|---|---|
| o dado cabe na memória com folga | são milhões de linhas e você precisa de vetorização |
| você quer zero dependência | o ambiente já tem a pilha científica |
| o resultado vai para a Vitrine ou para um relatório | você vai encadear com scikit-learn, statsmodels… |
| o programa roda em rede fechada | há espaço para instalar |