@@ -417,7 +417,7 @@ class DataTree(
417
417
418
418
def __init__ (
419
419
self ,
420
- data : Dataset | None = None ,
420
+ dataset : Dataset | None = None ,
421
421
children : Mapping [str , DataTree ] | None = None ,
422
422
name : str | None = None ,
423
423
):
@@ -430,12 +430,12 @@ def __init__(
430
430
431
431
Parameters
432
432
----------
433
- data : Dataset, optional
434
- Data to store under the .ds attribute of this node.
433
+ dataset : Dataset, optional
434
+ Data to store directly at this node.
435
435
children : Mapping[str, DataTree], optional
436
- Any child nodes of this node. Default is None.
436
+ Any child nodes of this node.
437
437
name : str, optional
438
- Name for this node of the tree. Default is None.
438
+ Name for this node of the tree.
439
439
440
440
Returns
441
441
-------
@@ -449,24 +449,24 @@ def __init__(
449
449
children = {}
450
450
451
451
super ().__init__ (name = name )
452
- self ._set_node_data (_to_new_dataset (data ))
452
+ self ._set_node_data (_to_new_dataset (dataset ))
453
453
454
454
# shallow copy to avoid modifying arguments in-place (see GH issue #9196)
455
455
self .children = {name : child .copy () for name , child in children .items ()}
456
456
457
- def _set_node_data (self , ds : Dataset ):
458
- data_vars , coord_vars = _collect_data_and_coord_variables (ds )
457
+ def _set_node_data (self , dataset : Dataset ):
458
+ data_vars , coord_vars = _collect_data_and_coord_variables (dataset )
459
459
self ._data_variables = data_vars
460
460
self ._node_coord_variables = coord_vars
461
- self ._node_dims = ds ._dims
462
- self ._node_indexes = ds ._indexes
463
- self ._encoding = ds ._encoding
464
- self ._attrs = ds ._attrs
465
- self ._close = ds ._close
461
+ self ._node_dims = dataset ._dims
462
+ self ._node_indexes = dataset ._indexes
463
+ self ._encoding = dataset ._encoding
464
+ self ._attrs = dataset ._attrs
465
+ self ._close = dataset ._close
466
466
467
467
def _pre_attach (self : DataTree , parent : DataTree , name : str ) -> None :
468
468
super ()._pre_attach (parent , name )
469
- if name in parent .ds .variables :
469
+ if name in parent .dataset .variables :
470
470
raise KeyError (
471
471
f"parent { parent .name } already contains a variable named { name } "
472
472
)
@@ -534,7 +534,7 @@ def _to_dataset_view(self, rebuild_dims: bool, inherited: bool) -> DatasetView:
534
534
)
535
535
536
536
@property
537
- def ds (self ) -> DatasetView :
537
+ def dataset (self ) -> DatasetView :
538
538
"""
539
539
An immutable Dataset-like view onto the data in this node.
540
540
@@ -549,11 +549,15 @@ def ds(self) -> DatasetView:
549
549
"""
550
550
return self ._to_dataset_view (rebuild_dims = True , inherited = True )
551
551
552
- @ds .setter
553
- def ds (self , data : Dataset | None = None ) -> None :
552
+ @dataset .setter
553
+ def dataset (self , data : Dataset | None = None ) -> None :
554
554
ds = _to_new_dataset (data )
555
555
self ._replace_node (ds )
556
556
557
+ # soft-deprecated alias, to facilitate the transition from
558
+ # xarray-contrib/datatree
559
+ ds = dataset
560
+
557
561
def to_dataset (self , inherited : bool = True ) -> Dataset :
558
562
"""
559
563
Return the data in this node as a new xarray.Dataset object.
@@ -566,7 +570,7 @@ def to_dataset(self, inherited: bool = True) -> Dataset:
566
570
567
571
See Also
568
572
--------
569
- DataTree.ds
573
+ DataTree.dataset
570
574
"""
571
575
coord_vars = self ._coord_variables if inherited else self ._node_coord_variables
572
576
variables = dict (self ._data_variables )
@@ -845,8 +849,8 @@ def get( # type: ignore[override]
845
849
"""
846
850
if key in self .children :
847
851
return self .children [key ]
848
- elif key in self .ds :
849
- return self .ds [key ]
852
+ elif key in self .dataset :
853
+ return self .dataset [key ]
850
854
else :
851
855
return default
852
856
@@ -1114,7 +1118,7 @@ def from_dict(
1114
1118
if isinstance (root_data , DataTree ):
1115
1119
obj = root_data .copy ()
1116
1120
elif root_data is None or isinstance (root_data , Dataset ):
1117
- obj = cls (name = name , data = root_data , children = None )
1121
+ obj = cls (name = name , dataset = root_data , children = None )
1118
1122
else :
1119
1123
raise TypeError (
1120
1124
f'root node data (at "/") must be a Dataset or DataTree, got { type (root_data )} '
@@ -1133,7 +1137,7 @@ def depth(item) -> int:
1133
1137
if isinstance (data , DataTree ):
1134
1138
new_node = data .copy ()
1135
1139
elif isinstance (data , Dataset ) or data is None :
1136
- new_node = cls (name = node_name , data = data )
1140
+ new_node = cls (name = node_name , dataset = data )
1137
1141
else :
1138
1142
raise TypeError (f"invalid values: { data } " )
1139
1143
obj ._set_item (
@@ -1264,7 +1268,7 @@ def equals(self, other: DataTree, from_root: bool = True) -> bool:
1264
1268
1265
1269
return all (
1266
1270
[
1267
- node .ds .equals (other_node .ds )
1271
+ node .dataset .equals (other_node .dataset )
1268
1272
for node , other_node in zip (self .subtree , other .subtree , strict = True )
1269
1273
]
1270
1274
)
@@ -1294,7 +1298,7 @@ def identical(self, other: DataTree, from_root=True) -> bool:
1294
1298
return False
1295
1299
1296
1300
return all (
1297
- node .ds .identical (other_node .ds )
1301
+ node .dataset .identical (other_node .dataset )
1298
1302
for node , other_node in zip (self .subtree , other .subtree , strict = True )
1299
1303
)
1300
1304
@@ -1321,7 +1325,7 @@ def filter(self: DataTree, filterfunc: Callable[[DataTree], bool]) -> DataTree:
1321
1325
map_over_subtree
1322
1326
"""
1323
1327
filtered_nodes = {
1324
- node .path : node .ds for node in self .subtree if filterfunc (node )
1328
+ node .path : node .dataset for node in self .subtree if filterfunc (node )
1325
1329
}
1326
1330
return DataTree .from_dict (filtered_nodes , name = self .root .name )
1327
1331
@@ -1365,7 +1369,7 @@ def match(self, pattern: str) -> DataTree:
1365
1369
└── Group: /b/B
1366
1370
"""
1367
1371
matching_nodes = {
1368
- node .path : node .ds
1372
+ node .path : node .dataset
1369
1373
for node in self .subtree
1370
1374
if NodePath (node .path ).match (pattern )
1371
1375
}
@@ -1389,7 +1393,7 @@ def map_over_subtree(
1389
1393
----------
1390
1394
func : callable
1391
1395
Function to apply to datasets with signature:
1392
- `func(node.ds , *args, **kwargs) -> Dataset`.
1396
+ `func(node.dataset , *args, **kwargs) -> Dataset`.
1393
1397
1394
1398
Function will not be applied to any nodes without datasets.
1395
1399
*args : tuple, optional
@@ -1420,7 +1424,7 @@ def map_over_subtree_inplace(
1420
1424
----------
1421
1425
func : callable
1422
1426
Function to apply to datasets with signature:
1423
- `func(node.ds , *args, **kwargs) -> Dataset`.
1427
+ `func(node.dataset , *args, **kwargs) -> Dataset`.
1424
1428
1425
1429
Function will not be applied to any nodes without datasets,
1426
1430
*args : tuple, optional
@@ -1433,7 +1437,7 @@ def map_over_subtree_inplace(
1433
1437
1434
1438
for node in self .subtree :
1435
1439
if node .has_data :
1436
- node .ds = func (node .ds , * args , ** kwargs )
1440
+ node .dataset = func (node .dataset , * args , ** kwargs )
1437
1441
1438
1442
def pipe (
1439
1443
self , func : Callable | tuple [Callable , str ], * args : Any , ** kwargs : Any
@@ -1499,7 +1503,7 @@ def render(self):
1499
1503
"""Print tree structure, including any data stored at each node."""
1500
1504
for pre , fill , node in RenderDataTree (self ):
1501
1505
print (f"{ pre } DataTree('{ self .name } ')" )
1502
- for ds_line in repr (node .ds )[1 :]:
1506
+ for ds_line in repr (node .dataset )[1 :]:
1503
1507
print (f"{ fill } { ds_line } " )
1504
1508
1505
1509
def merge (self , datatree : DataTree ) -> DataTree :
@@ -1513,7 +1517,7 @@ def merge_child_nodes(self, *paths, new_path: T_Path) -> DataTree:
1513
1517
# TODO some kind of .collapse() or .flatten() method to merge a subtree
1514
1518
1515
1519
def to_dataarray (self ) -> DataArray :
1516
- return self .ds .to_dataarray ()
1520
+ return self .dataset .to_dataarray ()
1517
1521
1518
1522
@property
1519
1523
def groups (self ):
0 commit comments