Source code for genno.compat.sdmx
from typing import TYPE_CHECKING, Iterable, List, Mapping, Optional, Union
if TYPE_CHECKING:
from sdmx.model.common import Code, Codelist
[docs]def codelist_to_groups(
codes: Union["Codelist", Iterable["Code"]], dim: Optional[str] = None
) -> Mapping[str, Mapping[str, List[str]]]:
"""Convert `codes` into a mapping from parent items to their children.
The returned value is suitable for use with :func:`~.computations.aggregate`.
Parameters
----------
codes
Either a :class:`sdmx.Codelist <sdmx.model.common.Codelist>` object or any
iterable of :class:`sdmx.Code <sdmx.model.common.Code>`.
dim : str, optional
Dimension to aggregate. If `codes` is a code list and `dim` is not given, the
ID of the code list is used; otherwise `dim` must be supplied.
"""
from sdmx.model.common import Codelist
if isinstance(codes, Codelist):
items: Iterable["Code"] = codes.items.values()
dim = dim or codes.id
else:
items = codes
if dim is None:
raise ValueError("Must provide a dimension ID for aggregation")
groups = dict()
for code in filter(lambda c: len(c.child), items):
groups[code.id] = list(map(str, code.child))
return {dim: groups}