Skip to content

Commit f8797fa

Browse files
author
Benoit Bovy
committed
review changes
1 parent 4388142 commit f8797fa

File tree

4 files changed

+98
-109
lines changed

4 files changed

+98
-109
lines changed

xarray/core/dataarray.py

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -821,25 +821,21 @@ def swap_dims(self, dims_dict):
821821
ds = self._to_temp_dataset().swap_dims(dims_dict)
822822
return self._from_temp_dataset(ds)
823823

824-
def set_index(self, indexers=None, append=False, inplace=False,
825-
**kw_indexers):
824+
def set_index(self, append=False, inplace=False, **indexes):
826825
"""Set DataArray (multi-)indexes using one or more existing coordinates.
827826
828827
Parameters
829828
----------
830-
indexers : dict, optional
831-
Dictionary with keys given by dimension names and values given by
832-
(lists of) the names of existing coordinates.
833-
Any list of multiple names given for a dimension will result as
834-
a MultiIndex for that dimension.
835829
append : bool, optional
836-
If True, append the supplied indexers to the existing indexes.
837-
Otherwise replace the existing indexes (default).
830+
If True, append the supplied index(es) to the existing index(es).
831+
Otherwise replace the existing index(es) (default).
838832
inplace : bool, optional
839-
If True, set new indexes in-place. Otherwise, return a new DataArray
833+
If True, set new index(es) in-place. Otherwise, return a new DataArray
840834
object.
841-
**kw_indexers : optional
842-
Keyword arguments in the same form as ``indexers``.
835+
**indexes : {dim: index, ...}
836+
Keyword arguments with names matching dimensions and values given
837+
by (lists of) the names of existing coordinates or variables to set
838+
as new (multi-)index.
843839
844840
Returns
845841
-------
@@ -850,32 +846,32 @@ def set_index(self, indexers=None, append=False, inplace=False,
850846
--------
851847
DataArray.reset_index
852848
"""
853-
indexers = utils.combine_pos_and_kw_args(indexers, kw_indexers,
854-
'set_index')
855-
coords, _ = merge_indexes(indexers, self._coords, set(), append=append)
849+
coords, _ = merge_indexes(indexes, self._coords, set(), append=append)
856850
if inplace:
857851
self._coords = coords
858852
else:
859853
return self._replace(coords=coords)
860854

861-
def reset_index(self, dim_levels=None, drop=False, inplace=False,
862-
**kw_dim_levels):
863-
"""Extract multi-index levels as new coordinates.
855+
def reset_index(self, dim, levels=None, drop=False, inplace=False):
856+
"""Extract index(es) as new coordinates.
864857
865858
Parameters
866859
----------
867-
dim_levels : dict, optional
868-
Dictionary with keys given by dimension names and values given by
869-
(lists of) the names of the levels to extract, or None to extract
870-
all levels. Every given dimension must have a multi-index.
860+
dim : str or list
861+
Name(s) of the dimension(s) for which to extract and reset
862+
the index.
863+
levels : list or None, optional
864+
If None (default) and if `dim` has a multi-index, extract all levels
865+
as new coordinates. Otherwise extract only the given list of level
866+
names. If more than one dimension is given in `dim`, `levels` should
867+
be a list of the same length than `dim` (or simply None to extract
868+
all indexes/levels from all given dimensions).
871869
drop : bool, optional
872870
If True, remove the specified levels instead of extracting them as
873871
new coordinates (default: False).
874872
inplace : bool, optional
875873
If True, modify the dataarray in-place. Otherwise, return a new
876874
DataArray object.
877-
**kw_dim_levels : optional
878-
Keyword arguments in the same form as ``dim_levels``.
879875
880876
Returns
881877
-------
@@ -887,37 +883,31 @@ def reset_index(self, dim_levels=None, drop=False, inplace=False,
887883
--------
888884
DataArray.set_index
889885
"""
890-
dim_levels = utils.combine_pos_and_kw_args(dim_levels, kw_dim_levels,
891-
'reset_index')
892-
coords, _ = split_indexes(dim_levels, self._coords, set(), drop=drop)
886+
coords, _ = split_indexes(dim, levels, self._coords, set(), drop=drop)
893887
if inplace:
894888
self._coords = coords
895889
else:
896890
return self._replace(coords=coords)
897891

898-
def reorder_levels(self, dim_order=None, inplace=False, **kw_dim_order):
892+
def reorder_levels(self, inplace=False, **dim_order):
899893
"""Rearrange index levels using input order.
900894
901895
Parameters
902896
----------
903-
dim_order : dict, optional
904-
Dictionary with keys given by dimension names and values given
905-
by lists representing new level orders. Every given dimension
906-
must have a multi-index.
907897
inplace : bool, optional
908898
If True, modify the dataarray in-place. Otherwise, return a new
909899
DataArray object.
910-
**kw_dim_order : optional
911-
Keyword arguments in the same form as ``dim_order``.
900+
**dim_order : optional
901+
Keyword arguments with names matching dimensions and values given
902+
by lists representing new level orders. Every given dimension
903+
must have a multi-index.
912904
913905
Returns
914906
-------
915907
reindexed: DataArray
916908
Another dataarray, with this dataarray's data but replaced
917909
coordinates.
918910
"""
919-
dim_order = utils.combine_pos_and_kw_args(dim_order, kw_dim_order,
920-
'reorder_levels')
921911
replace_coords = {}
922912
for dim, order in dim_order.items():
923913
coord = self._coords[dim]

xarray/core/dataset.py

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def calculate_dimensions(variables):
103103
return dims
104104

105105

106-
def merge_indexes(indexers, variables, coord_names, append=False):
106+
def merge_indexes(indexes, variables, coord_names, append=False):
107107
"""Merge variables into multi-indexes.
108108
109109
Not public API. Used in Dataset and DataArray set_index
@@ -112,23 +112,24 @@ def merge_indexes(indexers, variables, coord_names, append=False):
112112
vars_to_replace = {}
113113
vars_to_remove = []
114114

115-
for dim, var_names in indexers.items():
115+
for dim, var_names in indexes.items():
116116
if isinstance(var_names, basestring):
117117
var_names = [var_names]
118118

119-
names = []
120-
arrays = []
119+
names, labels, levels = [], [], []
121120
current_index_variable = variables[dim]
122121

123122
if append:
124123
current_index = current_index_variable.to_index()
125124
if isinstance(current_index, pd.MultiIndex):
126125
names.extend(current_index.names)
127-
for i in range(current_index.nlevels):
128-
arrays.append(current_index.get_level_values(i))
126+
labels.extend(current_index.labels)
127+
levels.extend(current_index.levels)
129128
else:
130129
names.append('%s_level_0' % dim)
131-
arrays.append(current_index.values)
130+
cat = pd.Categorical(current_index.values, ordered=True)
131+
labels.append(cat.codes)
132+
levels.append(cat.categories)
132133

133134
for n in var_names:
134135
names.append(n)
@@ -138,9 +139,11 @@ def merge_indexes(indexers, variables, coord_names, append=False):
138139
"dimension mismatch between %r %s and %r %s"
139140
% (dim, current_index_variable.dims, n, var.dims))
140141
else:
141-
arrays.append(var.values)
142+
cat = pd.Categorical(var.values, ordered=True)
143+
labels.append(cat.codes)
144+
levels.append(cat.categories)
142145

143-
idx = pd.MultiIndex.from_arrays(arrays, names=names)
146+
idx = pd.MultiIndex(labels=labels, levels=levels, names=names)
144147
vars_to_replace[dim] = IndexVariable(dim, idx)
145148
vars_to_remove.extend(var_names)
146149

@@ -152,37 +155,44 @@ def merge_indexes(indexers, variables, coord_names, append=False):
152155
return new_variables, new_coord_names
153156

154157

155-
def split_indexes(dim_levels, variables, coord_names, drop=False):
158+
def split_indexes(dim, levels, variables, coord_names, drop=False):
156159
"""Split multi-indexes into variables.
157160
158161
Not public API. Used in Dataset and DataArray reset_index
159162
methods.
160163
"""
164+
if isinstance(dim, basestring):
165+
dim = [dim]
166+
if levels is not None:
167+
levels = [levels]
168+
if levels is None:
169+
levels = [None] * len(dim)
170+
161171
vars_to_replace = {}
162172
vars_to_create = OrderedDict()
163173

164-
for dim, levels in dim_levels.items():
165-
current_index = variables[dim].to_index()
174+
for d, levs in zip(dim, levels):
175+
current_index = variables[d].to_index()
166176
if not isinstance(current_index, pd.MultiIndex):
167-
raise ValueError("%r has no MultiIndex" % dim)
177+
raise ValueError("%r has no MultiIndex" % d)
168178

169-
if levels is None:
170-
levels = current_index.names
171-
elif not isinstance(levels, (tuple, list)):
172-
levels = [levels]
179+
if levs is None:
180+
levs = current_index.names
181+
elif not isinstance(levs, (tuple, list)):
182+
levs = [levs]
173183

174-
if len(levels) == current_index.nlevels:
184+
if len(levs) == current_index.nlevels:
175185
new_index_variable = default_index_coordinate(
176-
dim, current_index.size)
186+
d, current_index.size)
177187
else:
178188
new_index_variable = IndexVariable(
179-
dim, current_index.droplevel(levels))
180-
vars_to_replace[dim] = new_index_variable
189+
d, current_index.droplevel(levs))
190+
vars_to_replace[d] = new_index_variable
181191

182192
if not drop:
183-
for lev in levels:
184-
idx = current_index.get_level_values(lev)
185-
vars_to_create[idx.name] = IndexVariable(dim, idx)
193+
for level in levs:
194+
idx = current_index.get_level_values(level)
195+
vars_to_create[idx.name] = IndexVariable(d, idx)
186196

187197
new_variables = variables.copy()
188198
new_variables.update(vars_to_replace)
@@ -1420,26 +1430,22 @@ def swap_dims(self, dims_dict, inplace=False):
14201430
return self._replace_vars_and_dims(variables, coord_names,
14211431
inplace=inplace)
14221432

1423-
def set_index(self, indexers=None, append=False, inplace=False,
1424-
**kw_indexers):
1433+
def set_index(self, append=False, inplace=False, **indexes):
14251434
"""Set Dataset (multi-)indexes using one or more existing coordinates or
14261435
variables.
14271436
14281437
Parameters
14291438
----------
1430-
indexers : dict, optional
1431-
Dictionary with keys given by dimension names and values given by
1432-
(lists of) the names of existing coordinates or variables.
1433-
Any list of multiple names given for a dimension will result as
1434-
a MultiIndex for that dimension.
14351439
append : bool, optional
1436-
If True, append the supplied indexers to the existing indexes.
1437-
Otherwise replace the existing indexes (default).
1440+
If True, append the supplied index(es) to the existing index(es).
1441+
Otherwise replace the existing index(es) (default).
14381442
inplace : bool, optional
1439-
If True, set new indexes in-place. Otherwise, return a new dataset
1440-
object.
1441-
**kw_indexers : optional
1442-
Keyword arguments in the same form as ``indexers``.
1443+
If True, set new index(es) in-place. Otherwise, return a new
1444+
Dataset object.
1445+
**indexes : {dim: index, ...}
1446+
Keyword arguments with names matching dimensions and values given
1447+
by (lists of) the names of existing coordinates or variables to set
1448+
as new (multi-)index.
14431449
14441450
Returns
14451451
-------
@@ -1450,32 +1456,32 @@ def set_index(self, indexers=None, append=False, inplace=False,
14501456
--------
14511457
Dataset.reset_index
14521458
"""
1453-
indexers = utils.combine_pos_and_kw_args(indexers, kw_indexers,
1454-
'set_index')
1455-
variables, coord_names = merge_indexes(indexers, self._variables,
1459+
variables, coord_names = merge_indexes(indexes, self._variables,
14561460
self._coord_names,
14571461
append=append)
14581462
return self._replace_vars_and_dims(variables, coord_names=coord_names,
14591463
inplace=inplace)
14601464

1461-
def reset_index(self, dim_levels=None, drop=False, inplace=False,
1462-
**kw_dim_levels):
1463-
"""Extract multi-index levels as new coordinates.
1465+
def reset_index(self, dim, levels=None, drop=False, inplace=False):
1466+
"""Extract index(es) as new coordinates.
14641467
14651468
Parameters
14661469
----------
1467-
dim_levels : dict, optional
1468-
Dictionary with keys given by dimension names and values given by
1469-
(lists of) the names of the levels to extract, or None to extract
1470-
all levels. Every given dimension must have a multi-index.
1470+
dim : str or list
1471+
Name(s) of the dimension(s) for which to extract and reset
1472+
the index.
1473+
levels : list or None, optional
1474+
If None (default) and if `dim` has a multi-index, extract all levels
1475+
as new coordinates. Otherwise extract only the given list of level
1476+
names. If more than one dimension is given in `dim`, `levels` should
1477+
be a list of the same length than `dim` (or simply None to extract
1478+
all indexes/levels from all given dimensions).
14711479
drop : bool, optional
14721480
If True, remove the specified levels instead of extracting them as
14731481
new coordinates (default: False).
14741482
inplace : bool, optional
14751483
If True, modify the dataset in-place. Otherwise, return a new
14761484
Dataset object.
1477-
**kw_dim_levels : optional
1478-
Keyword arguments in the same form as ``dim_levels``.
14791485
14801486
Returns
14811487
-------
@@ -1486,36 +1492,30 @@ def reset_index(self, dim_levels=None, drop=False, inplace=False,
14861492
--------
14871493
Dataset.set_index
14881494
"""
1489-
dim_levels = utils.combine_pos_and_kw_args(dim_levels, kw_dim_levels,
1490-
'reset_index')
1491-
variables, coord_names = split_indexes(dim_levels, self._variables,
1495+
variables, coord_names = split_indexes(dim, levels, self._variables,
14921496
self._coord_names, drop=drop)
14931497
return self._replace_vars_and_dims(variables, coord_names=coord_names,
14941498
inplace=inplace)
14951499

1496-
def reorder_levels(self, dim_order=None, inplace=False, **kw_dim_order):
1500+
def reorder_levels(self, inplace=False, **dim_order):
14971501
"""Rearrange index levels using input order.
14981502
14991503
Parameters
15001504
----------
1501-
dim_order : dict, optional
1502-
Dictionary with keys given by dimension names and values given
1503-
by lists representing new level orders. Every given dimension
1504-
must have a multi-index.
15051505
inplace : bool, optional
15061506
If True, modify the dataset in-place. Otherwise, return a new
15071507
DataArray object.
1508-
**kw_dim_order : optional
1509-
Keyword arguments in the same form as ``dim_order``.
1508+
**dim_order : optional
1509+
Keyword arguments with names matching dimensions and values given
1510+
by lists representing new level orders. Every given dimension
1511+
must have a multi-index.
15101512
15111513
Returns
15121514
-------
15131515
reindexed: Dataset
15141516
Another dataset, with this dataset's data but replaced
15151517
coordinates.
15161518
"""
1517-
dim_order = utils.combine_pos_and_kw_args(dim_order, kw_dim_order,
1518-
'reorder_levels')
15191519
replace_variables = {}
15201520
for dim, order in dim_order.items():
15211521
coord = self._variables[dim]

0 commit comments

Comments
 (0)