Remapeamento e DE-PARAs

Padrões de tradução de nomes de colunas, tipagem e enriquecimento na camada Silver.

Os dados brutos obtidos diretamente dos portais externos frequentemente contêm nomes de colunas técnicos, crípticos ou abreviados (ex: nm_perimetro_divisao_pde, cd_tipo_setor_macro, nr_quadra_viaria).

Na camada Silver, o objetivo principal é limpar e padronizar esses dados para que fiquem intuitivos, legíveis e semanticamente compatíveis com as regras de negócio do Urbis.


🛠️ Como Implementar o Remapeamento com GeoPandas

No asset da camada Silver, após carregar o GeoDataFrame vindo da camada Bronze, utilize as funções .rename() e transformações do Pandas/GeoPandas:

import json
import geopandas as gpd
from dagster import asset, Output, AssetExecutionContext

@asset(
    deps=[geojson_setores_e_subsetores_bronze],
    group_name="silver"
)
def geojson_setores_silver(context: AssetExecutionContext, geojson_setores_e_subsetores_bronze):
    # 1. Carrega os dados da camada Bronze
    features = json.loads(geojson_setores_e_subsetores_bronze)["features"]
    gdf = gpd.GeoDataFrame.from_features(features)
    
    # 2. Clona o DataFrame para manter a pureza da função
    setores_df = gdf.copy()

    # 3. Decodifica valores categóricos numéricos para descrições textuais claras
    setores_df["cd_tipo_setor_macro"] = setores_df["cd_tipo_setor_macro"].replace({
        1: "1 - Centro",
        2: "2 - Setor Eixos de Desenvolvimento",
        3: "3 - Setor Orla Ferroviária e Fluvial"
    })

    # 4. Remapeia as colunas técnicas para identificadores intuitivos
    setores_df.rename(
        columns={
            "cd_tipo_setor_macro": "setor", 
            "nm_perimetro_divisao_pde": "subsetor",
            "vl_area_m2": "area_m2"
        }, 
        inplace=True
    )

    # 5. Remove colunas que não pertencem ao modelo de consumo
    setores_df.drop(columns=["subsetor"], inplace=True, errors="ignore")

    yield Output(value=setores_df)

📌 Boas Práticas e Diretrizes de Engenharia

1. Preservar as Chaves de Integração (unique_id)

Se uma coluna funciona como identificador único ou chave primária de negócio (ex: sql, id_zoneamento, cd_identificador), garanta que o novo nome corresponda exatamente ao configurado no asset da camada Gold (PostGisLayerUpdate.unique_column).

2. Conversão Explícita de Tipos

Certifique-se de converter strings que representam valores numéricos ou datas para seus tipos nativos:

# Converter áreas e coeficientes para float
gdf["coeficiente_aproveitamento"] = gdf["coeficiente_aproveitamento"].astype(float)

# Converter datas para datetime ISO
gdf["data_publicacao"] = pd.to_datetime(gdf["data_publicacao"], errors="coerce")

3. Validação e Homogeneização de Geometrias

Antes de enviar para a camada Gold, certifique-se de que não existem geometrias nulas ou inválidas:

# Remover feições com geometria vazia
gdf = gdf[gdf.geometry.notnull()]

# Corrigir geometrias auto-intersecionadas
gdf["geometry"] = gdf["geometry"].apply(lambda g: make_valid(g) if not g.is_valid else g)