diff --git a/ci/requirements/environment.yml b/ci/requirements/environment.yml index 5d31b2feb89..b4354b14f40 100644 --- a/ci/requirements/environment.yml +++ b/ci/requirements/environment.yml @@ -56,6 +56,7 @@ dependencies: - types-pytz - types-PyYAML - types-setuptools + - types-openpyxl - typing_extensions - zarr - pip: diff --git a/conftest.py b/conftest.py index 532a7badd91..200696431ea 100644 --- a/conftest.py +++ b/conftest.py @@ -22,7 +22,9 @@ def pytest_runtest_setup(item): pytest.skip( "set --run-network-tests to run test requiring an internet connection" ) - if "mypy" in item.keywords and not item.config.getoption("--run-mypy"): + if any("mypy" in m.name for m in item.own_markers) and not item.config.getoption( + "--run-mypy" + ): pytest.skip("set --run-mypy option to run mypy tests") diff --git a/pyproject.toml b/pyproject.toml index 6b45aef89e4..85cb8f1bc0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,7 @@ types = [ "types-pexpect", "types-psutil", "types-pycurl", + "types-openpyxl", "types-python-dateutil", "types-pytz", "types-setuptools", diff --git a/xarray/core/coordinates.py b/xarray/core/coordinates.py index 47773ddfbb6..b6c8e4a0dc5 100644 --- a/xarray/core/coordinates.py +++ b/xarray/core/coordinates.py @@ -177,13 +177,13 @@ def to_index(self, ordered_dims: Sequence[Hashable] | None = None) -> pd.Index: # compute the cartesian product code_list += [ - np.tile(np.repeat(code, repeat_counts[i]), tile_counts[i]) + np.tile(np.repeat(code, repeat_counts[i]), tile_counts[i]).tolist() for code in codes ] level_list += levels names += index.names - return pd.MultiIndex(level_list, code_list, names=names) + return pd.MultiIndex(levels=level_list, codes=code_list, names=names) class Coordinates(AbstractCoordinates): diff --git a/xarray/core/groupby.py b/xarray/core/groupby.py index 6a3ce156ce6..3bdc30eb1f0 100644 --- a/xarray/core/groupby.py +++ b/xarray/core/groupby.py @@ -527,7 +527,7 @@ def factorize(self) -> EncodedGroups: _flatcodes = where(mask.data, -1, _flatcodes) full_index = pd.MultiIndex.from_product( - (grouper.full_index.values for grouper in groupers), + list(grouper.full_index.values for grouper in groupers), names=tuple(grouper.name for grouper in groupers), ) # This will be unused when grouping by dask arrays, so skip.. diff --git a/xarray/core/indexes.py b/xarray/core/indexes.py index c2bc8b94f3f..0b4eee7b21c 100644 --- a/xarray/core/indexes.py +++ b/xarray/core/indexes.py @@ -1046,9 +1046,11 @@ def stack( *[lev.factorize() for lev in level_indexes], strict=True ) labels_mesh = np.meshgrid(*split_labels, indexing="ij") - labels = [x.ravel() for x in labels_mesh] + labels = [x.ravel().tolist() for x in labels_mesh] - index = pd.MultiIndex(levels, labels, sortorder=0, names=variables.keys()) + index = pd.MultiIndex( + levels=levels, codes=labels, sortorder=0, names=variables.keys() + ) level_coords_dtype = {k: var.dtype for k, var in variables.items()} return cls(index, dim, level_coords_dtype=level_coords_dtype) @@ -1120,7 +1122,8 @@ def from_variables_maybe_expand( levels.append(cat.categories) level_variables[name] = var - index = pd.MultiIndex(levels, codes, names=names) + codes_as_lists = [list(x) for x in codes] + index = pd.MultiIndex(levels=levels, codes=codes_as_lists, names=names) level_coords_dtype = {k: var.dtype for k, var in level_variables.items()} obj = cls(index, dim, level_coords_dtype=level_coords_dtype) index_vars = obj.create_variables(level_variables) diff --git a/xarray/tests/test_dataset.py b/xarray/tests/test_dataset.py index bdae9daf758..b273b7d1a0d 100644 --- a/xarray/tests/test_dataset.py +++ b/xarray/tests/test_dataset.py @@ -2923,7 +2923,7 @@ def test_drop_indexes(self) -> None: assert_identical(actual, ds) # test index corrupted - midx = pd.MultiIndex.from_tuples([([1, 2]), ([3, 4])], names=["a", "b"]) + midx = pd.MultiIndex.from_tuples([(1, 2), (3, 4)], names=["a", "b"]) midx_coords = Coordinates.from_pandas_multiindex(midx, "x") ds = Dataset(coords=midx_coords) @@ -3219,7 +3219,7 @@ def test_rename_dimension_coord_warnings(self) -> None: ds.rename(x="x") def test_rename_multiindex(self) -> None: - midx = pd.MultiIndex.from_tuples([([1, 2]), ([3, 4])], names=["a", "b"]) + midx = pd.MultiIndex.from_tuples([(1, 2), (3, 4)], names=["a", "b"]) midx_coords = Coordinates.from_pandas_multiindex(midx, "x") original = Dataset({}, midx_coords)