Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dimensionless units as "1" - adapt to numpy 2 #1814

Merged
merged 40 commits into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
583917f
Fix NaN and Inf
aulemahal Jun 27, 2024
06d18ca
Fix tests for numpy 2
aulemahal Jun 28, 2024
7e9107e
remove pint pin
aulemahal Jun 28, 2024
e3b9851
upd changes
aulemahal Jun 28, 2024
7a36c35
Merge branch 'main' into fix-for-np2
aulemahal Jun 28, 2024
deaa702
Merge branch 'main' into fix-for-np2
Zeitsperre Jul 2, 2024
7330221
upd pin for cf-xarray
aulemahal Jul 8, 2024
b446e60
Merge branch 'main' into fix-for-np2
aulemahal Jul 8, 2024
c14d0b9
Pin cf_xarray, pint and numpy - adapt to "1" change
aulemahal Jul 8, 2024
da22473
Add ensure_absolute_tempetature to __all__ and refactor to put both s…
aulemahal Jul 8, 2024
14c1f59
new spi test values (due to np2's float32)
coxipi Jul 10, 2024
7be1d57
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 10, 2024
cc4fe55
Merge branch 'main' into fix-for-np2
aulemahal Jul 11, 2024
c21b8ed
Merge branch 'main' into fix-for-np2
Zeitsperre Jul 26, 2024
d956c3f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 26, 2024
97d653b
fix changelog
Zeitsperre Jul 26, 2024
60a186c
revert pins
Zeitsperre Jul 26, 2024
0f289e8
WIP - conditional tests
Zeitsperre Jul 26, 2024
9943914
add an older numpy build
Zeitsperre Jul 26, 2024
8967596
fix imports
Zeitsperre Jul 26, 2024
82c6f20
unpin netcdf4
Zeitsperre Jul 26, 2024
3577bbb
woops
Zeitsperre Jul 26, 2024
107d44c
use h5netcdf
Zeitsperre Jul 26, 2024
fd952b2
promote h5netcdf to dependency, address errors
Zeitsperre Jul 26, 2024
0f6f756
add h5netcdf to deptry
Zeitsperre Jul 26, 2024
4aeeb89
add xarray engine to cli
Zeitsperre Jul 26, 2024
a2b0b42
adjust more IO calls to use h5netcdf
Zeitsperre Jul 26, 2024
cf286d2
fix cannon test
Zeitsperre Jul 26, 2024
d557f4d
use h5netcdf
Zeitsperre Jul 26, 2024
4d95e63
Remove netCDF4 as a dep - put h5netcdf back to dev deps - fix cli tests
aulemahal Jul 26, 2024
3312405
replace open_dataset
Zeitsperre Jul 31, 2024
39f1e65
Merge branch 'main' into fix-for-np2
Zeitsperre Jul 31, 2024
f472a9c
Merge branch 'main' into fix-for-np2
Zeitsperre Jul 31, 2024
3f3ae71
Better Version checks
aulemahal Jul 31, 2024
967ddbb
oups wrong version
aulemahal Jul 31, 2024
14a62d5
Update CHANGELOG.rst
aulemahal Jul 31, 2024
0524386
fix doctests
aulemahal Jul 31, 2024
3d4beab
Remove opendap test as the CI doesnt have opendap support anymore
aulemahal Jul 31, 2024
1bc53fd
Fix notebooks for netCDF4 absence
aulemahal Jul 31, 2024
3ded3ed
Fix xarray 2024.7.0 regression (?) issue 9300
aulemahal Jul 31, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ Changelog

v0.52.0 (unreleased)
--------------------
Contributors to this version: David Huard (:user:`huard`).
Contributors to this version: David Huard (:user:`huard`), Pascal Bourgault (:user:`aulemahal`).

Breaking changes
^^^^^^^^^^^^^^^^
* Dimensionless quantities now use the "1" units attribute as specified by the CF conventions, previously an empty string was returned. (:pull:`1814`).
* Updated minimum versions for some dependencies: ``numpy>=2``, ``cf-xarray>=0.9.3`` and ``pint>=0.24.1``. (:pull:`1814`).

Internal changes
^^^^^^^^^^^^^^^^
Expand Down
6 changes: 3 additions & 3 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ dependencies:
- python >=3.9
- boltons >=20.1
- bottleneck >=1.3.1
- cf_xarray >=0.6.1
- cf_xarray >=0.9.3
- cftime >=1.4.1
- click >=8.1
- dask >=2.6.0
- jsonpickle
- numba
- numpy >=1.20.0
- numpy >=2
aulemahal marked this conversation as resolved.
Show resolved Hide resolved
- pandas >=2.2.0
- pint >=0.18
- pint >=0.24.1
- poppler >=0.67
- pyarrow # Strongly encouraged for Pandas v2.2.0+
- pyyaml
Expand Down
2 changes: 1 addition & 1 deletion tests/test_atmos.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ def test_wind_profile(atmosds):

def test_wind_power_potential(atmosds):
out = atmos.wind_power_potential(wind_speed=atmosds.sfcWind)
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert (out >= 0).all()
assert (out <= 1).all()

Expand Down
2 changes: 1 addition & 1 deletion tests/test_generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ def test_doyminmax(self, q_series):
for da in [dmx, dmn]:
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in da.attrs.keys()
assert da.attrs["units"] == ""
assert da.attrs["units"] == "1"
assert da.attrs["is_dayofyear"] == 1


Expand Down
2 changes: 1 addition & 1 deletion tests/test_hydrology.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def test_simple(self, snw_series):
snw = snw_series(a, start="1999-01-01")
out = xci.snw_max_doy(snw, freq="YS")
np.testing.assert_array_equal(out, [11, np.nan])
assert out.units == ""
assert out.units == "1"


class TestSnowMeltWEMax:
Expand Down
36 changes: 18 additions & 18 deletions tests/test_indices.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,11 @@ def test_simple(self, tas_series):

out = xci.cold_spell_frequency(da, thresh="-10. C", freq="ME")
np.testing.assert_array_equal(out, [1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0])
assert out.units == ""
assert out.units == "1"

out = xci.cold_spell_frequency(da, thresh="-10. C", freq="YS")
np.testing.assert_array_equal(out, 3)
assert out.units == ""
assert out.units == "1"


class TestColdSpellMaxLength:
Expand Down Expand Up @@ -885,7 +885,7 @@ def test_simple(self, tas_series):
assert lsf == 180
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in lsf.attrs.keys()
assert lsf.attrs["units"] == ""
assert lsf.attrs["units"] == "1"
assert lsf.attrs["is_dayofyear"] == 1
assert lsf.attrs["is_dayofyear"].dtype == np.int32

Expand All @@ -906,7 +906,7 @@ def test_simple(self, tas_series):
assert np.isnan(fdb)
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in fdb.attrs.keys()
assert fdb.attrs["units"] == ""
assert fdb.attrs["units"] == "1"
assert fdb.attrs["is_dayofyear"] == 1

def test_below_forbidden(self, tasmax_series):
Expand Down Expand Up @@ -937,7 +937,7 @@ def test_simple(self, tas_series):
assert np.isnan(fda)
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in fda.attrs.keys()
assert fda.attrs["units"] == ""
assert fda.attrs["units"] == "1"
assert fda.attrs["is_dayofyear"] == 1

def test_thresholds(self, tas_series):
Expand All @@ -962,7 +962,7 @@ def test_thresholds(self, tas_series):
assert out[0] == tg.indexes["time"][30].dayofyear
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

def test_above_forbidden(self, tasmax_series):
Expand Down Expand Up @@ -1049,7 +1049,7 @@ def test_simple(self, tas_series):
assert out[0] == tg.indexes["time"][20].dayofyear
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

def test_no_start(self, tas_series):
Expand Down Expand Up @@ -1082,7 +1082,7 @@ def test_varying_mid_dates(self, tas_series, d1, d2, mid_date, expected):
np.testing.assert_array_equal(gs_end, expected)
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in gs_end.attrs.keys()
assert gs_end.attrs["units"] == ""
assert gs_end.attrs["units"] == "1"
assert gs_end.attrs["is_dayofyear"] == 1


Expand Down Expand Up @@ -1162,7 +1162,7 @@ def test_simple(self, tasmin_series):
assert out[0] == tn.indexes["time"][20].dayofyear
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

def test_no_start(self, tasmin_series):
Expand Down Expand Up @@ -1195,7 +1195,7 @@ def test_varying_mid_dates(self, tasmin_series, d1, d2, mid_date, expected):
np.testing.assert_array_equal(gs_end, expected)
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in gs_end.attrs.keys()
assert gs_end.attrs["units"] == ""
assert gs_end.attrs["units"] == "1"
assert gs_end.attrs["is_dayofyear"] == 1


Expand Down Expand Up @@ -2704,7 +2704,7 @@ def test_degree_days_exceedance_date(tas_series):

for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1


Expand Down Expand Up @@ -2744,7 +2744,7 @@ def test_first_snowfall(prsn_series, prsnd_series):
assert out[0] == 166
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

# test with prsnd [m s-1]
Expand All @@ -2753,7 +2753,7 @@ def test_first_snowfall(prsn_series, prsnd_series):
assert out[0] == 166
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

# test with prsn [kg m-2 s-1]
Expand All @@ -2765,7 +2765,7 @@ def test_first_snowfall(prsn_series, prsnd_series):
assert out[0] == 166
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1


Expand Down Expand Up @@ -2902,15 +2902,15 @@ def test_continous_snow_season_start(self, snd_series, snw_series):
np.testing.assert_array_equal(out, [snd.time.dt.dayofyear[0].data + 2, np.nan])
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

out = xci.snw_season_start(snw)
assert len(out) == 2
np.testing.assert_array_equal(out, [snw.time.dt.dayofyear[0].data + 1, np.nan])
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

def test_snow_season_end(self, snd_series, snw_series):
Expand All @@ -2932,7 +2932,7 @@ def test_snow_season_end(self, snd_series, snw_series):
np.testing.assert_array_equal(out, [(doy + 219) % 366, np.nan])
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1

out = xci.snw_season_end(snw)
Expand All @@ -2941,7 +2941,7 @@ def test_snow_season_end(self, snd_series, snw_series):
np.testing.assert_array_equal(out, [(doy + 219) % 366, np.nan])
for attr in ["units", "is_dayofyear", "calendar"]:
assert attr in out.attrs.keys()
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert out.attrs["is_dayofyear"] == 1


Expand Down
6 changes: 3 additions & 3 deletions tests/test_land.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@

def test_base_flow_index(ndq_series):
out = land.base_flow_index(ndq_series, freq="YS")
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert isinstance(out, xr.DataArray)


def test_rb_flashiness_index(ndq_series):
out = land.base_flow_index(ndq_series, freq="YS")
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"
assert isinstance(out, xr.DataArray)


def test_qdoy_max(ndq_series, q_series):
out = land.doy_qmax(ndq_series, freq="YS", season="JJA")
assert out.attrs["units"] == ""
assert out.attrs["units"] == "1"

a = np.ones(450)
a[100] = 2
Expand Down
8 changes: 4 additions & 4 deletions tests/test_snow.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ def test_simple(self, snd_series):
snd = snd.expand_dims(lat=[0, 1, 2])

out = land.snd_season_start(snd)
assert out.units == ""
assert out.units == "1"
np.testing.assert_array_equal(out.isel(lat=0), snd.time.dt.dayofyear[100])

out = land.snd_season_end(snd)
assert out.units == ""
assert out.units == "1"
np.testing.assert_array_equal(out.isel(lat=0), snd.time.dt.dayofyear[200])

out = land.snd_season_length(snd)
Expand All @@ -67,11 +67,11 @@ def test_simple(self, snw_series):
snw = snw.expand_dims(lat=[0, 1, 2])

out = land.snw_season_start(snw)
assert out.units == ""
assert out.units == "1"
np.testing.assert_array_equal(out.isel(lat=0), snw.time.dt.dayofyear[100])

out = land.snw_season_end(snw)
assert out.units == ""
assert out.units == "1"
np.testing.assert_array_equal(out.isel(lat=0), snw.time.dt.dayofyear[200])

out = land.snw_season_length(snw)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_units.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ def test_units2pint(self, pr_series):
assert pint2cfunits(u) == "%"

u = units2pint("1")
assert pint2cfunits(u) == ""
assert pint2cfunits(u) == "1"

def test_pint_multiply(self, pr_series):
a = pr_series([1, 2, 3])
Expand Down Expand Up @@ -331,8 +331,8 @@ def index(
("", "sum", "count", 365, "d"),
("", "sum", "count", 365, "d"),
("kg m-2", "var", "var", 0, "kg2 m-4"),
("°C", "argmax", "doymax", 0, ""),
("°C", "sum", "integral", 365, "K d"),
("°C", "argmax", "doymax", 0, "1"),
("°C", "sum", "integral", 365, "d K"),
("°F", "sum", "integral", 365, "d °R"), # not sure why the order is different
],
)
Expand Down
Loading
Loading