datatree: Tree-aware dataset handling/selection
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 4.2k
- Forks
- 1.4k
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 14
Description
What is your issue?
I'm looking for a good way to apply a function to a subset of nodes that share some common characteristics encoded in the subtree path.
Imagine the following data tree
import xarray as xr import datatree from datatree import map_over_subtree dt = datatree.DataTree.from_dict({ 'control/lowRes' : xr.Dataset({'z':(('x'),[0,1,2])}), 'control/highRes' : xr.Dataset({'z':(('x'),[0,1,2,3,4,5])}), 'plus4K/lowRes' : xr.Dataset({'z':(('x'),[0,1,2])}), 'plus4K/highRes' : xr.Dataset({'z':(('x'),[0,1,2,3,4,5])}) })To apply a function to all
controlor allplus4Knodes is straight forward by just selecting the specific subtree, e.g.dt['control']. However, in case alllowResdataset should be manipulated this becomes more elaborative and I wonder what the best approach would be.* `dt['control/lowRes','plus4K/lowRes']` is not yet implemented and would also be complex for large data trees * `dt['*/lowRes']` could be one idea to make the subtree selection more straight forward, where `*` is a wildcard * `dt.search(regex)` could make this even more generalCurrently, I use the @map_over_subtree decorator, which also has some limitations as the function does not know its tree origin (as noted in the code) and it needs to be inferred from the dataset itself, which is sometimes possible (here the length of the dataset) but does not need to be always the case.
@map_over_subtree def resolution_specific_func(ds): if len(ds.x) == 3: ds = ds.z*2 elif len(ds.x) == 6: ds = ds.z*4 return ds z= resolution_specific_func(dt)I do not know how the tree information could be passed through the decorator, but maybe it is okay if the
DatasetViewclass has an additional property (e.g._path) that could be filled withdt.pathduring the call of DatasetView._from_node()?. This would lead to@map_over_subtree def resolution_specific_func(ds): if 'lowRes' in ds._path: ds = ds.z*2 if 'highRes' in ds._path: ds = ds.z*4 return dsand would allow for tree-aware manipulation of the datasets.
What do you think? Happy to open a PR if this makes sense.
Originally posted by @observingClouds in https://github.com/xarray-contrib/datatree/issues/254#issue-1835784457
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading datatree/datatree.py around the map_over_subtree limitation and the DatasetView._from_node() path mentioned in the issue. Compare the proposed wildcard or regex selection with passing tree-path information through DatasetView, then establish which API is wanted. Done means an agreed tree-aware selection or manipulation behavior with coverage for the example paths.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100