def __init__(self, gdf: gpd.GeoDataFrame, overrides: Dict[str, str] | None = None):
self._gdf = gdf
# Define building-specific aliases (all lowercase for case-insensitive matching)
aliases = {
"id": ["id", "building_id", "bldg_id", "fd_id"],
"occupancy_type": ["occupancy_type", "occtype", "occupancy", "occ_type", "building_type"],
"first_floor_height": ["first_floor_height", "found_ht", "first_floor_ht", "ffh", "floor_height"],
"foundation_type": ["foundation_type", "fndtype", "found_type", "fnd_type"],
"number_stories": ["number_stories", "num_story", "numstories", "stories", "num_floors", "floors"],
"area": ["area", "sqft", "building_area", "floor_area"],
"building_cost": ["buildingcostusd", "building_cost", "val_struct", "cost", "replacement_cost", "building_value"],
"content_cost": ["contentcostusd", "content_cost", "val_cont", "contents_cost"],
"inventory_cost": ["inventorycostusd", "inventory_cost", "val_inv", "inv_cost"],
"general_building_type": ["general_building_type", "bldgtype", "generalbuildingtype"],
"eq_building_type": ["eqbldgtypeid", "eq_building_type", "earthquake_building_type"],
"eq_design_level": ["eqdesignlevelid", "eq_design_level", "design_level"],
#"flood_type": ["floodtype", "flood_type", "flooding_type"],
}
# Define output fields
output_fields = {
"flux": "flux",
"flood_depth": "flood_depth",
"depth_in_structure": "depth_in_structure",
"bddf_id": "bddf_id",
"flood_peril_type": "flood_peril_type",
"building_damage_percent": "building_damage_percent",
"building_loss": "building_loss",
"cddf_id": "cddf_id",
"content_damage_percent": "content_damage_percent",
"content_loss": "content_loss",
"iddf_id": "iddf_id",
"inventory_damage_percent": "inventory_damage_percent",
"inventory_loss": "inventory_loss",
"relocation_loss": "relocation_loss",
"income_loss": "income_loss",
"rental_loss": "rental_loss",
"wage_loss": "wage_loss",
"debris_finish": "debris_finish",
"debris_foundation": "debris_foundation",
"debris_structure": "debris_structure",
"debris_total": "debris_total",
"restoration_minimum": "restoration_minimum",
"restoration_maximum": "restoration_maximum",
# Tsunami probability fields
"probability_str_exceed_moderate": "probability_str_exceed_moderate",
"probability_str_exceed_extensive": "probability_str_exceed_extensive",
"probability_str_complete": "probability_str_complete",
"probability_str_none": "probability_str_none",
"probability_str_moderate": "probability_str_moderate",
"probability_str_extensive": "probability_str_extensive",
"probability_nsd_exceed_moderate": "probability_nsd_exceed_moderate",
"probability_nsd_exceed_extensive": "probability_nsd_exceed_extensive",
"probability_nsd_complete": "probability_nsd_complete",
"probability_nsd_none": "probability_nsd_none",
"probability_nsd_moderate": "probability_nsd_moderate",
"probability_nsd_extensive": "probability_nsd_extensive",
"probability_content_exceed_moderate": "probability_content_exceed_moderate",
"probability_content_exceed_extensive": "probability_content_exceed_extensive",
"probability_content_complete": "probability_content_complete",
"probability_content_none": "probability_content_none",
"probability_content_moderate": "probability_content_moderate",
"probability_content_extensive": "probability_content_extensive",
}
self.fields = FieldMapping(gdf, aliases, output_fields, overrides)
# Ensure damage-function ID output columns exist on the GeoDataFrame
for df_prop in ("flood_peril_type"):
col_name = self.fields.get_field_name(df_prop)
if col_name and col_name not in self._gdf.columns:
self._gdf[col_name] = None