Skip to content

Commit e725c89

Browse files
committed
Update .operator.distance_nonldv() for #162
1 parent c8561eb commit e725c89

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

message_ix_models/model/transport/operator.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@
2323
import numpy as np
2424
import pandas as pd
2525
import xarray as xr
26-
from genno import Operator
27-
from genno.operator import apply_units, relabel, rename_dims
26+
from genno import Computer, KeySeq, Operator, quote
27+
from genno.operator import apply_units, rename_dims
2828
from genno.testing import assert_qty_allclose, assert_units
29-
from iam_units import registry
3029
from message_ix_models import ScenarioInfo
3130
from message_ix_models.model.structure import get_codelist, get_codes
3231
from message_ix_models.report.operator import compound_growth
@@ -45,9 +44,9 @@
4544
from .config import Config
4645

4746
if TYPE_CHECKING:
48-
from genno import Computer
4947
from genno.types import AnyQuantity
5048
from message_ix import Scenario
49+
from message_ix_models import Context
5150

5251
import message_data.model.transport.factor
5352

@@ -267,29 +266,32 @@ def distance_ldv(config: dict) -> "AnyQuantity":
267266
}
268267

269268

270-
def distance_nonldv(config: dict) -> "AnyQuantity":
269+
def distance_nonldv(context: "Context") -> "AnyQuantity":
271270
"""Return annual travel distance per vehicle for non-LDV transport modes."""
272-
# Load from IEA EEI
273-
from message_data.tools import iea_eei # type: ignore [attr-defined]
271+
import message_ix_models.tools.iea.eei # noqa: F401
272+
from message_ix_models.tools import exo_data
274273

275-
dfs = iea_eei.get_eei_data(config["regions"])
276-
df = (
277-
dfs["vehicle use"]
278-
.rename(columns={"region": "nl", "year": "y", "Mode/vehicle type": "t"})
279-
.set_index(["nl", "t", "y"])
274+
log.warning(
275+
"distance_nonldv() currently returns a sum, rather than weighted average. Use"
276+
"with caution."
280277
)
281278

282-
# Check units
283-
assert "kilovkm / vehicle" == registry.parse_units(
284-
df["units"].unique()[0].replace("10^3 ", "k")
285-
)
286-
units = "Mm / vehicle / year"
279+
c = Computer()
280+
source_kw = dict(measure="Vehicle use", aggregate=True)
281+
keys = exo_data.prepare_computer(context, c, "IEA EEI", source_kw)
287282

288-
# Rename IEA EEI technology IDs to model-internal ones
289-
result = relabel(
290-
genno.Quantity(df["value"], name="non-ldv distance", units=units),
291-
dict(t=EEI_TECH_MAP),
292-
)
283+
ks = KeySeq(keys[0])
284+
285+
c.add(ks[0], "select", ks.base, indexers={"SECTOR": "transport"}, drop=True)
286+
c.add(ks[1], "rename", ks[0], quote({"Mode/vehicle type": "t"}))
287+
# Replace IEA EEI technology codes with MESSAGEix-Transport ones
288+
c.add(ks[2], "relabel", ks[1], labels=dict(t=EEI_TECH_MAP))
289+
# Ensure compatible dimensionality and convert units
290+
c.add(ks[3], "convert_units", ks[2], units="Mm / vehicle / year")
291+
c.add(ks[4], "rename_dims", ks[3], quote({"n": "nl"}))
292+
293+
# Execute the calculation
294+
result = c.get(ks[4])
293295

294296
# Select the latest year.
295297
# TODO check whether coverage varies by year; if so, then fill-forward or

message_ix_models/tests/model/transport/test_operator.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,17 @@ def test_distance_ldv(test_context, regions):
5555
)
5656

5757

58+
@pytest.mark.xfail(reason="Pending updates to message-ix-models")
5859
@pytest.mark.parametrize("regions", ["R11", "R12"])
59-
def test_distance_nonldv(regions):
60+
def test_distance_nonldv(test_context, regions):
6061
"Test :func:`.distance_nonldv`."
61-
# Configuration
62-
config = dict(regions=regions)
62+
test_context.model.regions = regions
6363

6464
# Computation runs
65-
result = distance_nonldv(config)
65+
result = distance_nonldv(test_context)
6666

6767
# Computed value has the expected dimensions and units
68-
assert ("nl", "t") == result.dims
68+
assert {"nl", "t"} == set(result.dims)
6969
assert result.units.is_compatible_with("km / vehicle / year")
7070

7171
# Check a computed value

0 commit comments

Comments
 (0)