41
41
FrozenMappingWarningOnValuesAccess ,
42
42
contains_only_chunked_or_numpy ,
43
43
either_dict_or_kwargs ,
44
+ emit_user_level_warning ,
44
45
hashable ,
45
46
is_scalar ,
46
47
maybe_wrap_array ,
@@ -284,6 +285,7 @@ class ResolvedGrouper(Generic[T_DataWithCoords]):
284
285
grouper : Grouper
285
286
group : T_Group
286
287
obj : T_DataWithCoords
288
+ eagerly_compute_group : bool = field (repr = False )
287
289
288
290
# returned by factorize:
289
291
encoded : EncodedGroups = field (init = False , repr = False )
@@ -310,6 +312,18 @@ def __post_init__(self) -> None:
310
312
311
313
self .group = _resolve_group (self .obj , self .group )
312
314
315
+ if (
316
+ self .eagerly_compute_group
317
+ and not isinstance (self .group , _DummyGroup )
318
+ and is_chunked_array (self .group .variable ._data )
319
+ ):
320
+ emit_user_level_warning (
321
+ f"Eagerly computing the DataArray you're grouping by ({ self .group .name !r} ) "
322
+ "is deprecated and will be removed in v2025.05.0. "
323
+ "Please load this array's data manually using `.compute` or `.load`." ,
324
+ DeprecationWarning ,
325
+ )
326
+
313
327
self .encoded = self .grouper .factorize (self .group )
314
328
315
329
@property
@@ -330,7 +344,11 @@ def __len__(self) -> int:
330
344
331
345
332
346
def _parse_group_and_groupers (
333
- obj : T_Xarray , group : GroupInput , groupers : dict [str , Grouper ]
347
+ obj : T_Xarray ,
348
+ group : GroupInput ,
349
+ groupers : dict [str , Grouper ],
350
+ * ,
351
+ eagerly_compute_group : bool ,
334
352
) -> tuple [ResolvedGrouper , ...]:
335
353
from xarray .core .dataarray import DataArray
336
354
from xarray .core .variable import Variable
@@ -355,7 +373,11 @@ def _parse_group_and_groupers(
355
373
356
374
rgroupers : tuple [ResolvedGrouper , ...]
357
375
if isinstance (group , DataArray | Variable ):
358
- rgroupers = (ResolvedGrouper (UniqueGrouper (), group , obj ),)
376
+ rgroupers = (
377
+ ResolvedGrouper (
378
+ UniqueGrouper (), group , obj , eagerly_compute_group = eagerly_compute_group
379
+ ),
380
+ )
359
381
else :
360
382
if group is not None :
361
383
if TYPE_CHECKING :
@@ -368,7 +390,9 @@ def _parse_group_and_groupers(
368
390
grouper_mapping = cast ("Mapping[Hashable, Grouper]" , groupers )
369
391
370
392
rgroupers = tuple (
371
- ResolvedGrouper (grouper , group , obj )
393
+ ResolvedGrouper (
394
+ grouper , group , obj , eagerly_compute_group = eagerly_compute_group
395
+ )
372
396
for group , grouper in grouper_mapping .items ()
373
397
)
374
398
return rgroupers
0 commit comments