Saltar al contenido principal

Water Scarcity GFM

El Gap Filling Module de Escasez de Agua calcula la huella de escasez hídrica de los productos alimentarios combinando datos de consumo de agua específicos del producto con índices regionales de estrés hídrico. Este enfoque tiene en cuenta que el consumo de agua en regiones con escasez hídrica tiene un mayor impacto ambiental que el mismo consumo en regiones con abundancia de agua.

Referencia Rápida

PropiedadDescripción
Se ejecuta enModeledActivityNode con padre FoodProductFlowNode que contiene un nombre de producto
DependenciasOriginGapFillingWorker
Entrada claveTipo de producto (término FoodEx2), país de origen
SalidaFlujo de consumo de agua escasa en metros cúbicos
ActivadorProducto coincide con un identificador de huella de escasez hídrica

Cuándo se Ejecuta

El módulo se activa cuando:

  1. Un ModeledActivityNode tiene un padre FoodProductFlowNode con un nombre de producto
  2. El producto coincide con un identificador de huella de escasez hídrica en el glosario
  3. El módulo está programado en el nodo hoja de Brightway (en el origen)

Salida Clave

El módulo añade un flujo de consumo de agua escasa al grafo de cálculo:

  • Consumo de Agua Escasa: Medido en metros cúbicos (m3) por kilogramo de producto
  • Conectado a un ElementaryResourceEmissionNode para el cálculo de impacto

Metodología Científica

El modelo de escasez hídrica usa factores del Índice de Estrés Hídrico (IEH) proporcionados por Scherer y Pfister (2016). Esta metodología incluye explícitamente el estrés hídrico regional como un factor de ponderación para el consumo de agua dulce, proporcionando una medida más significativa ambientalmente que el volumen de agua bruto solo.

Enfoque del Índice de Estrés Hídrico

La huella de escasez hídrica se calcula usando la fórmula:

Agua Escasa [L/kg] = Consumo de Agua Azul [L/kg] * Índice de Estrés Hídrico [adimensional]

Donde:

  • Consumo de Agua Azul: La cantidad de agua superficial y subterránea consumida durante la producción
  • Índice de Estrés Hídrico: Un factor regional que representa la escasez de agua (escala de 0 a 1)

Estrés Hídrico Regional

El estrés hídrico depende de:

  • La cantidad de agua consumida en una región comparada con el agua naturalmente disponible de la precipitación
  • Correcciones por agua que retorna a la cuenca hidrográfica (por ejemplo, después de enfriamiento en producción eléctrica)

La base de datos incluye factores de escasez hídrica diferenciados para 162 países, permitiendo evaluaciones regionales precisas.

Flujo de Cálculo

Cantidad de Producto [g] -> Convertir a [kg] -> Factor IEH [L agua escasa/kg] -> Agua Escasa [L]

El cálculo se realiza en el nivel más bajo del grafo y se agrega hacia el producto principal.


Detalles de Implementación

Fuente de Datos

Los factores de escasez hídrica se almacenan en EDB_water_expected_wsi_per_kg_country_excel_corrected.xlsx, que contiene:

  • Identificadores de producto (WS_ID)
  • Factores IEH específicos por país para 162 países
  • Valores de mediana para cálculos de respaldo

Lógica de Coincidencia

Los productos se emparejan con datos de escasez hídrica mediante:

  1. Términos FoodEx2 del nombre del producto
  2. Enlaces de glosario que mapean combinaciones de términos a identificadores de escasez hídrica
water_scarcity_term_uid = self.gfm_factory.linked_water_scarcity_terms.get(
frozenset([term.uid for term in parent_flow_product_name_terms])
)

Manejo de Códigos de País

El módulo maneja los códigos de país de la siguiente manera:

  1. Recupera la propiedad flow_location del producto o nodos padre
  2. Convierte códigos ISO de 3 letras a códigos de 2 letras usando iso_3166_map_3_to_2_letter
  3. Busca el factor IEH específico del país

Comportamiento de Respaldo

EscenarioComportamiento
No se encuentra origenUsa mediana de todos los países disponibles
Se encuentran múltiples orígenesUsa mediana de todos los países disponibles
Origen no está en la tabla IEHUsa mediana para ese producto en todos los países
Producto no está en la tabla IEHEscasez hídrica establecida en cero
Producto no tiene ID de IEHEscasez hídrica establecida en cero

Exclusión de Transporte

El módulo omite flujos relacionados con transporte para evitar doble conteo:

if product_name_term.sub_class_of == self.gfm_factory.root_transport_term.uid:
transport_term = True
if transport_term:
continue

Manejo de Productos Secos

Para ingredientes que se subdividen en versiones frescas y secas (mediante el Water Loss GFM):

  • La escasez hídrica se calcula para la cantidad de ingrediente fresco
  • La escasez hídrica también se calcula para la cantidad de ingrediente fresco correspondiente a la versión seca
  • Esto tiene en cuenta correctamente la mayor cantidad de producto fresco necesario para producir versiones secas

Modificaciones del Grafo

El módulo realiza las siguientes modificaciones al grafo:

Paso 1: Eliminar Arista Original

remove_edge_mutation = RemoveEdgeMutation(
from_node_uid=parent_flow.uid,
to_node_uid=self.node.uid,
)

Paso 2: Crear Actividad de Consumo de Agua

water_consumption_activity = FoodProcessingActivityNode.model_construct(
uid=UuidStr(uuid4()),
production_amount=self.node.production_amount.duplicate(),
)

Paso 3: Re-establecer Conexiones de Flujo

El módulo crea un nuevo nodo de flujo de alimento entre la actividad de consumo de agua y el nodo Brightway original.

Paso 4: Añadir Flujo de Agua Escasa

scarce_water_consumption_flow = FlowNode.model_construct(
uid=UuidStr(uuid4()),
product_name=NamesProp.unvalidated_construct(
terms=[
GlossaryTermProp.unvalidated_construct(
term_uid=self.gfm_factory.scarce_water_consumption_term.uid
)
]
),
amount_in_original_source_unit=QuantityProp.unvalidated_construct(
# El signo negativo indica consumo
value=-production_amount_in_kg * scarce_water_consumption_m3_per_kg,
unit_term_uid=self.gfm_factory.cubic_meter_term.uid,
for_reference=ReferenceAmountEnum.amount_for_activity_production_amount,
),
)

Paso 5: Conectar a Nodo de Recurso Elemental

El flujo de agua escasa se conecta a un ElementaryResourceEmissionNode compartido para la evaluación de impacto.


Referencia Completa del Código

Lógica de Programación del Worker

def should_be_scheduled(self) -> bool:
"""Si programar el worker de gap filling de escasez hídrica."""
if (
isinstance(self.node, ModeledActivityNode)
and self.node.get_parent_nodes()
and any(
isinstance(parent_node, FoodProductFlowNode) and parent_node.product_name
for parent_node in self.node.get_parent_nodes()
)
):
return True
return False

Comprobación de Preparación para Ejecución

def can_run_now(self) -> GapFillingWorkerStatusEnum:
"""Si el worker de gap filling de escasez hídrica puede ejecutarse."""
global_gfm_state = self.get_global_gfm_state()

# Esperar determinación de origen
if global_gfm_state.get(OriginGapFillingWorker.__name__, 0) == NodeGfmStateEnum.scheduled.value:
return GapFillingWorkerStatusEnum.reschedule

# Solo ejecutar en nodo hoja de Brightway
if any(isinstance(sub_node, FoodProductFlowNode) for sub_node in self.node.get_sub_nodes()):
return GapFillingWorkerStatusEnum.cancel

return GapFillingWorkerStatusEnum.ready

Cálculo de Escasez Hídrica

# Convertir cantidad de producción a kilogramos
production_amount_unit: Term = self.node.production_amount.get_unit_term()
production_amount_in_kg = UnitWeightConverter.convert_between_same_unit_types(
self.node.production_amount.value,
production_amount_unit,
self.gfm_factory.kilogram_term,
"mass-in-g",
)

# Buscar factor específico del país
if flow_country_code in water_scarcity_term.data:
scarce_water_consumption_m3_per_kg = water_scarcity_term.data[flow_country_code]
else:
# Respaldo a mediana
scarce_water_consumption_m3_per_kg = water_scarcity_term.data["median"]

# Calcular consumo de agua escasa
scarce_water_value = -production_amount_in_kg * scarce_water_consumption_m3_per_kg

Inicialización de la Factory

El WaterScarcityGapFillingFactory inicializa los siguientes datos en caché:

Términos de Unidad

self.cubic_meter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_cubic-meter", root_unit_term.access_group_uid)
)
self.liter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_liter", root_unit_term.access_group_uid)
)
self.kilogram_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_kilogram", root_unit_term.access_group_uid)
)

Caché de Enlaces de Glosario

water_scarcity_glossary_links = await self.service_provider.glossary_link_service.get_glossary_links_by_gfm(
gap_filling_module="WaterScarcity"
)
for water_scarcity_glossary_link in water_scarcity_glossary_links:
self.linked_water_scarcity_terms[
frozenset(water_scarcity_glossary_link.term_uids)
] = water_scarcity_glossary_link.linked_term_uid

Ejemplo de Cálculo

Escenario: 500g de tomates de España

Paso 1: Convertir a Kilogramos

500g = 0,5 kg

Paso 2: Buscar Factor IEH

De la base de datos de escasez hídrica para tomates en España:

Factor IEH = 142,3 L agua escasa/kg

Paso 3: Calcular Agua Escasa

Agua Escasa = 0,5 kg * 142,3 L/kg = 71,15 L agua escasa

Paso 4: Convertir a Metros Cúbicos

71,15 L = 0,07115 m3 agua escasa

Comparación por Origen

Los mismos tomates de diferentes orígenes tendrían diferentes impactos:

OrigenFactor IEH (L/kg)Agua Escasa (L) para 500g
España142,371,15
Países Bajos12,86,40
Marruecos285,6142,80
Italia98,449,20

Esto demuestra por qué los factores de estrés hídrico específicos por origen son críticos para una evaluación ambiental precisa.


Limitaciones Conocidas

Cobertura de Datos

  • 162 países cubiertos: La mayoría de los principales países productores de alimentos están incluidos
  • Países faltantes: Algunos países pueden no tener datos IEH; se usan valores de mediana como respaldo
  • Cobertura de productos: No todos los productos alimentarios tienen IDs de escasez hídrica asignados

Limitaciones de Herencia

La implementación actual no soporta herencia de IDs de escasez hídrica entre productos relacionados:

  • En el sistema heredado, los productos podían heredar IDs de IEH de productos vinculados
  • En la implementación actual, los productos sin un ID de IEH directo reciben cero escasez hídrica
  • Esto puede resultar en subestimación para algunos productos (por ejemplo, harinas especiales que podrían heredar de harina general)

Resolución de Datos

  • Solo resolución a nivel de país (sin diferenciación subnacional)
  • No tiene en cuenta variaciones estacionales en el estrés hídrico
  • Usa valores esperados (promedio) en lugar de datos específicos del año real

Respaldo de Mediana

Cuando se usan valores de mediana (origen desconocido, datos de país faltantes), no se muestra ninguna advertencia en la salida. Este es un comportamiento conocido documentado en revisiones científicas.


Fuentes de Datos

Fuente Principal

Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.

Los datos de escasez hídrica combinan:

  • Consumo de agua azul de bases de datos de Análisis de Ciclo de Vida
  • Valores del Índice de Estrés Hídrico basados en la disponibilidad de agua a nivel de cuenca hidrográfica

Estructura de la Base de Datos

Los factores de escasez hídrica se almacenan en la Base de Datos de Eaternity (EDB) con:

  • water-scarcity-footprint-id: Vincula productos a entradas de datos IEH
  • Valores específicos por país: Almacenados para cada combinación producto-país
  • Valores de mediana: Pre-calculados para escenarios de respaldo

Referencias

  1. Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.

  2. Pfister, S., Koehler, A., & Hellweg, S. (2009). Assessing the environmental impacts of freshwater consumption in LCA. Environmental Science and Technology, 43(11), 4098-4104.

  3. Eaternity Database (EDB). Water Scarcity Footprint Data. Documentación interna.