Source code for rook.operations.normalise
"""Normalise datasets and hold operation results."""
from collections import OrderedDict
import pathlib
from clisops.utils.dataset_utils import open_xr_dataset
from loguru import logger
import xarray as xr
from rook.io.datasets import open_dataset
[docs]
def normalise(collection, *, fix_provider=None):
"""Open input collections."""
logger.info(f"Working on datasets: {collection}")
norm_collection = OrderedDict()
for source in collection:
ds = open_dataset(source, fix_provider=fix_provider)
norm_collection[source.key] = ds
return norm_collection
[docs]
def keep_dataset(ds):
"""Return a dataset unchanged."""
return ds
[docs]
def normalise_file_groups(
collection,
*,
prepare_dataset=None,
concat_dim="time",
opener=open_xr_dataset,
):
"""Open grouped file paths and concatenate each group."""
norm_collection = OrderedDict()
if prepare_dataset is None:
prepare_dataset = keep_dataset
for dset, file_paths in collection.items():
datasets = [prepare_dataset(opener(file)) for file in file_paths]
norm_collection[dset] = xr.concat(datasets, dim=concat_dim)
return norm_collection
[docs]
class ResultSet:
"""A class to hold the results from an operation."""
def __init__(self, inputs=None): # noqa: D107
self._results = OrderedDict()
self.metadata = {"inputs": inputs, "process": "something", "version": 0.1}
self.file_uris = []
[docs]
def add(self, dset, result):
"""Add outputs with ds id key and collect file URIs."""
self._results[dset] = result
for item in result:
if isinstance(item, str) and (
pathlib.Path(item).is_file() or item.startswith("https")
):
self.file_uris.append(item)