Ir para o conteúdo

Ordem canônica do pipeline

O climasus4py define uma ordem canônica única. Cada função valida que a entrada seja um DuckDBPyRelation e que as etapas anteriores obrigatórias tenham sido executadas. Se a ordem for violada, uma mensagem de erro indica exatamente onde você está e o que deveria ter sido chamado antes.

Diagrama

flowchart LR
    A(["sus_data_import\nsus_read\nsus_sql"]) --> B[sus_data_clean_encoding]
    B --> C[sus_data_standardize]
    C --> D[sus_filter]
    D --> E[sus_data_create_variables]
    E --> F[sus_data_aggregate]
    F --> G(["sus_spatial_join\nsus_census\nsus_climate\nsus_fill_gaps"])
    G --> H(["materialize\nsus_export"])
    style A fill:#1a6b4a,color:#fff
    style H fill:#1a6b4a,color:#fff
    style G fill:#0d4f8b,color:#fff

Etapas e o que fazem

Portas de entrada

Função Propósito
sus_data_import(system, uf, year) Baixa do FTP DATASUS, cacheia, retorna lazy
sus_data_read(path) Abre Parquet/GeoParquet local como lazy
sus_sql(query) SQL DuckDB arbitrário como ponto de entrada

Pipeline core

Etapa Função O que faz
1 sus_data_clean_encoding(rel) Remove colunas desnecessárias, normaliza encoding
2 sus_data_standardize(rel, system) Renomeia colunas para nomes canônicos do sistema (SIM-DO, SINASC…)
3 sus_filter(rel, ...) Filtra por CID-10, idade, sexo, raça, UF, município, data
4 sus_data_create_variables(rel, ...) Deriva variáveis: faixa etária, semana epidemiológica, estação do ano
5 sus_data_aggregate(rel, ...) Agrega por tempo (dia/semana/mês/ano) e geografia (município/estado)

Enriquecimentos (opcionais, após aggregate)

Função Adiciona
sus_spatial_join(rel) geometry_wkt + nome geográfico
sus_census(rel, year) Indicadores IBGE (população, renda, Gini…)
sus_climate(rel, years) Variáveis INMET (temperatura, precipitação…)
sus_fill_gaps(rel, method) Interpolação de lacunas em séries temporais

Saídas

Função Destino Quando usar
materialize(rel, how=...) RAM Análise interativa, integração com pandas/polars
sus_export(rel, path) Disco Bases grandes, ETL, sem coletar em memória

Enforcement de ordem

Cada função core registra o estágio em que a relação se encontra. Se você tentasse chamar sus_data_aggregate antes de sus_data_standardize, receberia:

ValueError: sus_data_aggregate esperava uma relação no estágio 'standardize' ou posterior,
mas recebeu 'raw'. Certifique-se de chamar sus_data_clean_encoding → sus_data_standardize antes.

Etapas opcionais

Nenhuma etapa do core é obrigatória quando você já tem um Parquet processado. Com sus_data_read() ou sus_sql(), você pode entrar diretamente nos enriquecimentos — desde que os dados já tenham as colunas esperadas:

# Parquet já limpo e padronizado
rel = cs.sus_data_read("dados/sim_sp_2023_agregado.parquet")
rel = cs.sus_climate(rel, variables=["temp_mean"], years=[2023])
df  = cs.materialize(rel)

Múltiplas entradas

Para combinar dados de múltiplos sistemas, use sus_sql como cola:

sim = cs.sus_data_import("SIM-DO", "SP", 2023)
sinasc = cs.sus_data_import("SINASC", "SP", 2023)

# Combinar via SQL após aggregate
sim_agg = cs.sus_data_aggregate(cs.sus_data_standardize(cs.sus_data_clean_encoding(sim), "SIM-DO"), time="month", geo="municipality")
sinasc_agg = cs.sus_data_aggregate(cs.sus_data_standardize(cs.sus_data_clean_encoding(sinasc), "SINASC"), time="month", geo="municipality")

combined = cs.sus_sql("""
    SELECT s.*, n.nascimentos
    FROM sim_agg s
    LEFT JOIN sinasc_agg n USING (municipality_code, month)
""")