Ir para o conteúdo

Materialize — trazendo dados para a memória

cs.materialize(rel) é o comando explícito de fim de pipeline quando o destino é a RAM. Ele aceita qualquer DuckDBPyRelation — independente de quantas etapas lazy foram encadeadas — e devolve o formato solicitado.

Sintaxe

result = cs.materialize(rel, how="auto", quiet=False)
Parâmetro Tipo Padrão Descrição
rel DuckDBPyRelation Relação lazy a materializar
how str "auto" Formato de saída (ver tabela abaixo)
quiet bool False Suprime alertas de tamanho

Formatos de saída

how Tipo retornado Dependência extra Notas
"auto" GeoDataFrame ou DataFrame Auto-detecta geometry_wkt
"pandas" pandas.DataFrame Sempre disponível
"geopandas" geopandas.GeoDataFrame pip install climasus4py[spatial] Exige coluna geometry_wkt
"polars" polars.DataFrame pip install climasus4py[polars] Via Arrow
"pyarrow" pyarrow.Table Sempre disponível

Exemplos

import climasus4py as cs

rel = cs.sus_data_aggregate(rel, time="month", geo="municipality")
df = cs.materialize(rel)          # how="auto" → pandas quando não há geometry
df = cs.materialize(rel, how="pandas")

print(df.head())
rel = cs.sus_spatial_join(rel)         # adiciona geometry_wkt
gdf = cs.materialize(rel, how="geopandas")

gdf.plot(column="count", legend=True)

Requer pip install climasus4py[spatial].

import polars as pl

df = cs.materialize(rel, how="polars")
df.filter(pl.col("count") > 10)

Requer pip install climasus4py[polars].

import pyarrow as pa

table = cs.materialize(rel, how="pyarrow")
pa.parquet.write_table(table, "resultado.parquet")

Alertas de tamanho

Por padrão, materialize emite um UserWarning quando a relação tem muitas linhas, orientando o usuário a usar sus_export para evitar esgotamento de memória:

Linhas Nível de alerta
< 100.000 Silencioso
100.000 – 999.999 Nota informativa
1.000.000 – 9.999.999 Warning com sugestão de sus_export
≥ 10.000.000 Warning forte de risco de OOM

Para suprimir os alertas quando a materialização é intencional:

df = cs.materialize(rel, quiet=True)

Quando usar sus_export em vez de materialize

Use sus_export quando:

  • O dataset tem mais de 1 milhão de linhas.
  • O destino é um arquivo (ETL, pipeline de dados).
  • Você não precisa manipular os dados em memória.
cs.sus_export(rel, "saida/sim_sp_2023.parquet")   # Parquet
cs.sus_export(rel, "saida/sim_sp_2023.csv")       # CSV

sus_export nunca coleta dados em pandas — usa streaming DuckDB direto para disco.

auto — detecção de formato

how="auto" inspeciona as colunas da relação:

  • Se houver geometry_wkt → retorna geopandas.GeoDataFrame (CRS: EPSG:4674)
  • Caso contrário → retorna pandas.DataFrame
rel_sem_geo = cs.sus_data_aggregate(rel, time="month", geo="municipality")
df = cs.materialize(rel_sem_geo)    # → pandas.DataFrame

rel_com_geo = cs.sus_spatial_join(rel_sem_geo)
gdf = cs.materialize(rel_com_geo)   # → geopandas.GeoDataFrame