mlde-utils 0.2.2__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/PKG-INFO +3 -2
  2. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/pyproject.toml +1 -1
  3. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/__init__.py +3 -6
  4. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/regrid.py +12 -2
  5. mlde_utils-0.2.4/src/mlde_utils/data/select_domain.py +100 -0
  6. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/shift_lon_break.py +3 -1
  7. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/PKG-INFO +3 -2
  8. mlde_utils-0.2.2/src/mlde_utils/data/select_domain.py +0 -63
  9. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/LICENSE +0 -0
  10. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/MANIFEST.in +0 -0
  11. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/README.md +0 -0
  12. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/setup.cfg +0 -0
  13. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/__init__.py +0 -0
  14. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/coarsen.py +0 -0
  15. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/constrain.py +0 -0
  16. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/diff.py +0 -0
  17. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/remapcon.py +0 -0
  18. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/resample.py +0 -0
  19. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/select_gcm_domain.py +0 -0
  20. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/split_by_year.py +0 -0
  21. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/sum.py +0 -0
  22. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km/uk/moose_grid.nc +0 -0
  23. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-27x/uk/moose_grid.nc +0 -0
  24. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-2x/uk/moose_grid.nc +0 -0
  25. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-4x/uk/moose_grid.nc +0 -0
  26. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/2.2km-coarsened-8x/uk/moose_grid.nc +0 -0
  27. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/60km/global/pr/moose_grid.nc +0 -0
  28. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/target_grids/60km/global/vorticity850/moose_grid.nc +0 -0
  29. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/data/vorticity.py +0 -0
  30. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/training/__init__.py +0 -0
  31. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/training/dataset.py +0 -0
  32. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils/transforms.py +0 -0
  33. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/SOURCES.txt +0 -0
  34. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/dependency_links.txt +0 -0
  35. {mlde_utils-0.2.2 → mlde_utils-0.2.4}/src/mlde_utils.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: mlde_utils
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: A package for shared code between ML downscaling repos
5
5
  Author-email: Henry Addison <henry.addison@bristol.ac.uk>
6
6
  Project-URL: Homepage, https://github.com/henryaddison/mlde_utils
@@ -11,5 +11,6 @@ Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.7
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
+ Dynamic: license-file
14
15
 
15
16
  # Util code for ML downscaling emulator
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mlde_utils"
7
- version = "0.2.2"
7
+ version = "0.2.4"
8
8
  authors = [
9
9
  { name="Henry Addison", email="henry.addison@bristol.ac.uk" },
10
10
  ]
@@ -37,7 +37,8 @@ class VariableMetadata:
37
37
  domain,
38
38
  resolution,
39
39
  ensemble_member,
40
- scenario="rcp85",
40
+ scenario,
41
+ collection,
41
42
  ):
42
43
  self.base_dir = base_dir
43
44
  self.variable = variable
@@ -46,11 +47,7 @@ class VariableMetadata:
46
47
  self.domain = domain
47
48
  self.scenario = scenario
48
49
  self.ensemble_member = ensemble_member
49
-
50
- if self.resolution.startswith("2.2km"):
51
- self.collection = "land-cpm"
52
- elif self.resolution.startswith("60km"):
53
- self.collection = "land-gcm"
50
+ self.collection = collection
54
51
 
55
52
  def __str__(self):
56
53
  return "VariableMetadata: " + str(self.__dict__)
@@ -1,5 +1,6 @@
1
1
  import iris
2
2
  import iris.analysis
3
+ import logging
3
4
  import xarray as xr
4
5
 
5
6
  """
@@ -43,7 +44,12 @@ class Regrid:
43
44
  src_lat_name = "grid_latitude"
44
45
  src_lon_name = "grid_longitude"
45
46
  else:
46
- raise RuntimeError("Unrecognised grid system")
47
+ logging.warning(
48
+ "Unrecognised grid system. Assuming lat-lon, GeogCS(6371229.0)"
49
+ )
50
+ src_coord_sys = iris.coord_systems.GeogCS(6371229.0)
51
+ src_lat_name = "latitude"
52
+ src_lon_name = "longitude"
47
53
 
48
54
  if "latitude_longitude" in self.target_ds.variables:
49
55
  target_grid_mapping = "latitude_longitude"
@@ -111,7 +117,11 @@ class Regrid:
111
117
  ["time", "bnds"],
112
118
  ds[key].values,
113
119
  ds[key].attrs,
114
- {"units": "hours since 1970-01-01 00:00:00", "calendar": "360_day"},
120
+ {
121
+ k: ds["time"].encoding[k]
122
+ for k in ["units", "calendar"]
123
+ if k in ds["time"].encoding
124
+ },
115
125
  )
116
126
  for key in ["time_bnds"]
117
127
  }
@@ -0,0 +1,100 @@
1
+ import logging
2
+ import math
3
+
4
+ import numpy as np
5
+
6
+ from mlde_utils import cp_model_rotated_pole, platecarree
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ class SelectDomain:
12
+
13
+ DOMAIN_CENTRES_LON_LAT = {
14
+ "london": (-0.118092, 51.509865),
15
+ "birmingham": (-1.898575, 52.489471),
16
+ "glasgow": (-4.25763000, 55.86515000),
17
+ "aberdeen": (-2.09814000, 57.14369000),
18
+ "scotland": (-4.20264580, 56.49067120),
19
+ "dublin": (-6.267494, 53.344105),
20
+ }
21
+
22
+ DOMAIN_CENTRES_RP_LONG_LAT = {
23
+ domain_name: cp_model_rotated_pole.transform_point(
24
+ *lon_lat, src_crs=platecarree
25
+ )
26
+ for domain_name, lon_lat in DOMAIN_CENTRES_LON_LAT.items()
27
+ }
28
+
29
+ def __init__(self, subdomain, grid="cpm", size=64) -> None:
30
+ self.subdomain = subdomain
31
+ self.grid = grid
32
+ self.size = size
33
+
34
+ def run(self, ds):
35
+ logger.info(f"Selecting subdomain {self.subdomain}")
36
+ if self.grid == "cpm":
37
+ centre_xy = self.DOMAIN_CENTRES_RP_LONG_LAT[self.subdomain]
38
+ query = dict(
39
+ grid_longitude=360.0 + centre_xy[0],
40
+ grid_latitude=centre_xy[1],
41
+ )
42
+ elif self.grid == "gcm":
43
+ centre_xy = self.DOMAIN_CENTRES_LON_LAT[self.subdomain]
44
+ query = dict(
45
+ longitude=centre_xy[0],
46
+ latitude=centre_xy[1],
47
+ )
48
+ else:
49
+ raise ValueError(f"Unknown grid type: {self.grid}")
50
+
51
+ centre_ds = ds.sel(query, method="nearest")
52
+ if self.grid == "cpm":
53
+ centre_long_idx = np.where(
54
+ ds.grid_longitude.values == centre_ds.grid_longitude.values
55
+ )[0].item()
56
+ centre_lat_idx = np.where(
57
+ ds.grid_latitude.values == centre_ds.grid_latitude.values
58
+ )[0].item()
59
+ elif self.grid == "gcm":
60
+ centre_long_idx = np.where(
61
+ ds.longitude.values == centre_ds.longitude.values
62
+ )[0].item()
63
+ centre_lat_idx = np.where(ds.latitude.values == centre_ds.latitude.values)[
64
+ 0
65
+ ].item()
66
+ else:
67
+ raise ValueError(f"Unknown grid type: {self.grid}")
68
+
69
+ radius = self.size - 1
70
+ left_length = math.floor(radius / 2.0)
71
+ right_length = math.ceil(radius / 2.0)
72
+ down_length = math.floor(radius / 2.0)
73
+ up_length = math.ceil(radius / 2.0)
74
+
75
+ if self.grid == "cpm":
76
+ ds = ds.sel(
77
+ grid_longitude=slice(
78
+ ds.grid_longitude[centre_long_idx - left_length].values,
79
+ ds.grid_longitude[centre_long_idx + right_length].values,
80
+ ),
81
+ grid_latitude=slice(
82
+ ds.grid_latitude[centre_lat_idx - down_length].values,
83
+ ds.grid_latitude[centre_lat_idx + up_length].values,
84
+ ),
85
+ )
86
+ elif self.grid == "gcm":
87
+ ds = ds.sel(
88
+ longitude=slice(
89
+ ds.longitude[centre_long_idx - left_length].values,
90
+ ds.longitude[centre_long_idx + right_length].values,
91
+ ),
92
+ latitude=slice(
93
+ ds.latitude[centre_lat_idx - down_length].values,
94
+ ds.latitude[centre_lat_idx + up_length].values,
95
+ ),
96
+ )
97
+ else:
98
+ raise ValueError(f"Unknown grid type: {self.grid}")
99
+
100
+ return ds
@@ -10,7 +10,9 @@ class ShiftLonBreak:
10
10
 
11
11
  def run(self, ds):
12
12
  orig_lon_attrs = ds[self.lon_name].attrs
13
- ds.coords[self.lon_name] = (ds.coords[self.lon_name] + 180) % 360 - 180
13
+ ds = ds.assign_coords(
14
+ {self.lon_name: (((ds.coords[self.lon_name] + 180) % 360) - 180)}
15
+ )
14
16
  ds = ds.sortby(ds[self.lon_name])
15
17
  ds[self.lon_name].attrs = orig_lon_attrs
16
18
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: mlde_utils
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: A package for shared code between ML downscaling repos
5
5
  Author-email: Henry Addison <henry.addison@bristol.ac.uk>
6
6
  Project-URL: Homepage, https://github.com/henryaddison/mlde_utils
@@ -11,5 +11,6 @@ Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.7
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
+ Dynamic: license-file
14
15
 
15
16
  # Util code for ML downscaling emulator
@@ -1,63 +0,0 @@
1
- import logging
2
- import math
3
-
4
- import numpy as np
5
-
6
- from mlde_utils import cp_model_rotated_pole, platecarree
7
-
8
- logger = logging.getLogger(__name__)
9
-
10
-
11
- class SelectDomain:
12
-
13
- DOMAIN_CENTRES_LON_LAT = {
14
- "london": (-0.118092, 51.509865),
15
- "birmingham": (-1.898575, 52.489471),
16
- }
17
-
18
- DOMAIN_CENTRES_RP_LONG_LAT = {
19
- domain_name: cp_model_rotated_pole.transform_point(
20
- *lon_lat, src_crs=platecarree
21
- )
22
- for domain_name, lon_lat in DOMAIN_CENTRES_LON_LAT.items()
23
- }
24
-
25
- def __init__(self, subdomain, size=64) -> None:
26
- self.subdomain = subdomain
27
- self.size = size
28
-
29
- def run(self, ds):
30
- logger.info(f"Selecting subdomain {self.subdomain}")
31
-
32
- centre_rp_lon_lat = self.DOMAIN_CENTRES_RP_LONG_LAT[self.subdomain]
33
- centre_ds = ds.sel(
34
- grid_longitude=360.0 + centre_rp_lon_lat[0],
35
- grid_latitude=centre_rp_lon_lat[1],
36
- method="nearest",
37
- )
38
-
39
- centre_long_idx = np.where(
40
- ds.grid_longitude.values == centre_ds.grid_longitude.values
41
- )[0].item()
42
- centre_lat_idx = np.where(
43
- ds.grid_latitude.values == centre_ds.grid_latitude.values
44
- )[0].item()
45
-
46
- radius = self.size - 1
47
- left_length = math.floor(radius / 2.0)
48
- right_length = math.ceil(radius / 2.0)
49
- down_length = math.floor(radius / 2.0)
50
- up_length = math.ceil(radius / 2.0)
51
-
52
- ds = ds.sel(
53
- grid_longitude=slice(
54
- ds.grid_longitude[centre_long_idx - left_length].values,
55
- ds.grid_longitude[centre_long_idx + right_length].values,
56
- ),
57
- grid_latitude=slice(
58
- ds.grid_latitude[centre_lat_idx - down_length].values,
59
- ds.grid_latitude[centre_lat_idx + up_length].values,
60
- ),
61
- )
62
-
63
- return ds
File without changes
File without changes
File without changes
File without changes