from dataclasses import dataclass
from enum import Enum
[docs]
class IndexNames(Enum):
OJBECT_CODE = "object_code"
PROD_CODE = "Exio prod code"
ACT_CODE = "Exio act code"
COUNTRY_CODE = "Exio country code"
AGGREGATION = "Aggregation"
SUBSTITUTION_FACTOR = "substitution factor"
REPLACED_PRODUCT = "replaced product"
REPL_FACTOR = "repl factor"
PRODUCT = "product"
PRODUCTION = "production"
UNIT = "unit"
VALUE = "Value"
MARKET = "market"
FLAG = "flag"
ORIGIN_COUNTRY = "Exio origin country code"
DESTIN_COUNTRY = "Exio destin. country code"
FACTOR = "factor"
SHARE = "share"
EXIO3 = "nace-related code"
EMIS_SUBSTANCE = "Exio substance"
EMIS_COMPARTMENT = "Exio compartment"
GLOBAL_AREA = "Global"
RESOURCE = "Exio resource"
EXIO_ACT = "Exiobase activity" # TODO: used at the beginning in IEA when the workflow was not clear, to be replaced with "Exio act code"
EXIO_CNT = "Exiobase country"
EXIO_CNT_acron = "Exiobase cnt"
EXIO_PRD = "Exiobase product"
EXIO_CODE = "Exiobase code"
DESCRIP = "description"
REPLACED_MRK = "Replaced market"
POSITION = "position"
PACK_CODE = "exio4_pack_id"
WASTE_FRACTION = "Exio waste"
WASTE_MARKET = "Exio waste market"
PACK_PROD = "Exio packaging prod code"
PACKAGED = "Packaged product"
PACK_MARKET = "Exio packaging market"
INPUT_PROD = "Exio prod code (input)"
VALUE_IN = "Value (input)"
VALUE_FOOTPRINT = "Value (footprint)"
UNIT_DESTIN = "unit (source)"
UNIT_SOURCE = "unit (input)"
UNIT_FOOTPRINT = "unit (footprint)"
CLIMATE_METRIC = "climate metric"
ANIMAL_CATEGORY = "animal categ"
PERIOD = "time"
AGRI_SYSTEM = "system"
EXIO_ACCOUNT = "Account"
NUTRIENT_CONT = "nutrient content"
COEFFICIENT = "coeff"
REF_PROD_CODE = "Exio ref. prod code"
LCI_VALUE = "Value_lci"
LCI_UNIT = "unit_lci"
LCI_FLAG = "flag_lci"
SOURCE = "source"
SOURCE_CODE = "source_code"
SOURCE_NAME = "source_name"
SOURCE_CLASS = "source_class"
SOURCE_LINK = "source_link"
TARGET_CODE = "target_code"
TARGET_NAME = "target_name"
TARGET_CLASS = "target_class"
TARGET_LINK = "target_link"
PARENT_CODE = "parent_code"
PARENT_NAME = "parent_name"
PARENT_CLASS = "parent_class"
PARENT_LINK = "parent_link"
SCENARIO = "scenario"
TRADE_ROUTE_ID = "trade route ID"
TRANSPORT_MODE = "transport mode"
EDGE = "edge"
ORIGIN_COUNTRY_EDGE = "Exio origin country code edge"
DESTIN_COUNTRY_EDGE = "Exio destin. country code edge"
TRANSPORT_MODE_EDGE = "transport mode edge"
EXIO3_ACT = "exio_v3"
PERIOD_DELAY = "time delay"
ASSOCIATED_TREAT = "associated treatment service"
[docs]
class EmissCompartment(Enum):
AIR = "Air"
WATER = "Water"
SOIL = "Soil"
[docs]
class land_use_categ(Enum):
sf_to_cp = "secondary forest to crop"
pf_to_mf = "primary forest to managed forest"
sf_to_mf = "secondary forest to managed forest"
gr_to_ps = "grassland to pasture"
int_cp = "intensification of cropland"
int_ps = "intensification of pasture"
unit_land = "ha-weighted" # TODO: to be replaced by PropertyEnum.LAND.unit
[docs]
class global_land_categ(Enum):
arable = "Arable Land"
forest = "Forest Land"
grass = "Grassland"
[docs]
class fao_categ(Enum):
ITEM = "Item"
ELEM = "Element"
UNIT = "Unit"
AREA = "Area"
[docs]
class animal_system(Enum):
MILK = "milk"
MEAT = "meat"
[docs]
class ipcc_categ(Enum):
ef4_wet = "Wet climate"
ef4_dry = "Dry climate"
fract_leach_wet = "Wet climate"
[docs]
@dataclass
class Property:
name: str
value: float
unit: str
upperbound: float | None = None
lowerbound: float | None = None
[docs]
class PropertyEnum(Enum):
MASS = ("tonnes", Property)
ENERGY = ("TJ", Property)
CURRENCY = ("Meuro", Property)
ITEM_COUNT = ("items", Property)
WASTE_SERVICE = ("tonnes (service)", Property)
LAND = ("ha-weighted", Property)
FREIGHT = ("tkm", Property)
NA = ("undefined", Property)
def __init__(self, unit: str, cls: Property) -> None:
self.unit = unit
self.cls = cls
[docs]
def create_property(
self, value, upperbound=float("inf"), lowerbound=float("-inf")
) -> Property:
return self.cls(
value=value,
unit=self.unit,
name=self.name,
upperbound=upperbound,
lowerbound=lowerbound,
)
# TODO: Use service discovery tools when we get more endpoints. (@Fan)
[docs]
class APIEndpoints(Enum):
BASE_URL = "https://lca.aau.dk/api/"
ACTIVITIES = "activity-names/"
ACTIVITY_CORR = "activity-corr/"
PRODUCTS = "products/"
PRODUCT = "product/" # TODO: use plural form (@Fan 2024-10-03 15:15:15)
PRODUCT_CORR = "product-corr/"
LOCATIONS = "locations/"
LOCATION_CORR = "location-corr/"
METADATA = "datasets/"
FOOTPRINT = "footprint/"
PROPERTIES = "properties/"
SUPPLY = "supply/"
USE = "use/"
RECIPES = "recipes/"
TOKEN = "user/token/"
[docs]
@classmethod
def get_url(cls, name: str) -> str:
"""
Return the full URL for a given endpoint name.
Parameters:
- name: The name of the endpoint to retrieve.
Returns:
- The full URL of the requested endpoint.
"""
# Ensure the requested name is a valid enum member
if name in cls.__members__:
endpoint = cls[name].value
# Special handling for BASE_URL
if name == "BASE_URL":
return endpoint
return f"{cls.BASE_URL.value}{endpoint}"
else:
raise ValueError(f"{name} is not a valid API endpoint")
[docs]
class Exio_fert_nutrients:
nutrients = ["N", "P2O5", "K2O"]
market_dict = {"N": "M_Nfert", "P2O5": "M_P2O5fert", "K2O": "M_K2Ofert"}
[docs]
@dataclass
class data_index_categ:
# data structure of emissions df
emiss_categ = [
IndexNames.COUNTRY_CODE.value,
IndexNames.EMIS_SUBSTANCE.value,
IndexNames.EMIS_COMPARTMENT.value,
IndexNames.ACT_CODE.value,
IndexNames.UNIT.value,
]
# data use and supply
general_categ = [
IndexNames.ORIGIN_COUNTRY.value,
IndexNames.PROD_CODE.value,
IndexNames.DESTIN_COUNTRY.value,
IndexNames.ACT_CODE.value,
IndexNames.UNIT.value,
]
# data use and supply
trade_categ = [
IndexNames.ORIGIN_COUNTRY.value,
IndexNames.PROD_CODE.value,
IndexNames.DESTIN_COUNTRY.value,
IndexNames.UNIT.value,
]
balance_categ = [
IndexNames.ORIGIN_COUNTRY.value,
IndexNames.PROD_CODE.value,
IndexNames.DESTIN_COUNTRY.value,
IndexNames.ACT_CODE.value,
]
balance_columns = [
IndexNames.VALUE.value,
IndexNames.FLAG.value,
IndexNames.UNIT.value,
]
# data use and supply
column_categ = [IndexNames.VALUE.value, IndexNames.FLAG.value]
pack_index = [
IndexNames.ORIGIN_COUNTRY.value,
IndexNames.PROD_CODE.value,
IndexNames.DESTIN_COUNTRY.value,
IndexNames.ACT_CODE.value,
IndexNames.PACK_CODE.value,
]
waste_sup_index = [
IndexNames.ORIGIN_COUNTRY.value,
IndexNames.PROD_CODE.value,
IndexNames.DESTIN_COUNTRY.value,
IndexNames.ACT_CODE.value,
IndexNames.WASTE_FRACTION.value,
]
waste_sup_col = [
IndexNames.VALUE.value,
IndexNames.FLAG.value,
IndexNames.UNIT.value,
]
fao_clean_index = [
IndexNames.COUNTRY_CODE.value,
fao_categ.ITEM.value,
fao_categ.ELEM.value,
fao_categ.UNIT.value,
]
fao_animal_system_index = [
IndexNames.COUNTRY_CODE.value,
fao_categ.ITEM.value,
fao_categ.ELEM.value,
IndexNames.AGRI_SYSTEM.value,
IndexNames.ANIMAL_CATEGORY.value,
IndexNames.UNIT.value,
IndexNames.PERIOD.value,
]