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
| Propiedad | Descripción |
|---|---|
| Se ejecuta en | ModeledActivityNode con padre FoodProductFlowNode que contiene un nombre de producto |
| Dependencias | OriginGapFillingWorker |
| Entrada clave | Tipo de producto (término FoodEx2), país de origen |
| Salida | Flujo de consumo de agua escasa en metros cúbicos |
| Activador | Producto coincide con un identificador de huella de escasez hídrica |
Cuándo se Ejecuta
El módulo se activa cuando:
- Un
ModeledActivityNodetiene un padreFoodProductFlowNodecon un nombre de producto - El producto coincide con un identificador de huella de escasez hídrica en el glosario
- 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
ElementaryResourceEmissionNodepara 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:
- Términos FoodEx2 del nombre del producto
- 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:
- Recupera la propiedad
flow_locationdel producto o nodos padre - Convierte códigos ISO de 3 letras a códigos de 2 letras usando
iso_3166_map_3_to_2_letter - Busca el factor IEH específico del país
Comportamiento de Respaldo
| Escenario | Comportamiento |
|---|---|
| No se encuentra origen | Usa mediana de todos los países disponibles |
| Se encuentran múltiples orígenes | Usa mediana de todos los países disponibles |
| Origen no está en la tabla IEH | Usa mediana para ese producto en todos los países |
| Producto no está en la tabla IEH | Escasez hídrica establecida en cero |
| Producto no tiene ID de IEH | Escasez 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:
| Origen | Factor IEH (L/kg) | Agua Escasa (L) para 500g |
|---|---|---|
| España | 142,3 | 71,15 |
| Países Bajos | 12,8 | 6,40 |
| Marruecos | 285,6 | 142,80 |
| Italia | 98,4 | 49,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
-
Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.
-
Pfister, S., Koehler, A., & Hellweg, S. (2009). Assessing the environmental impacts of freshwater consumption in LCA. Environmental Science and Technology, 43(11), 4098-4104.
-
Eaternity Database (EDB). Water Scarcity Footprint Data. Documentación interna.