nctoolkit 1.1.2__tar.gz → 1.1.5__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 (96) hide show
  1. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/PKG-INFO +18 -3
  2. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/__init__.py +1 -0
  3. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/anomaly.py +8 -50
  4. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/api.py +1 -16
  5. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/ensembles.py +2 -1
  6. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mp_matchups.py +2 -1
  7. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/plot.py +17 -2
  8. nctoolkit-1.1.2/nctoolkit/runthis.py → nctoolkit-1.1.5/nctoolkit/runners.py +52 -426
  9. nctoolkit-1.1.5/nctoolkit/runthis.py +346 -0
  10. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/static_plot.py +10 -0
  11. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/temporal_stat.py +64 -21
  12. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/to_nc.py +1 -1
  13. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit.egg-info/SOURCES.txt +1 -0
  14. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/setup.py +2 -2
  15. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/CITATION.cff +0 -0
  16. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/CODE_OF_CONDUCT.md +0 -0
  17. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/LICENSE +0 -0
  18. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/MANIFEST.in +0 -0
  19. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/README.md +0 -0
  20. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/benchmarks/benchmark_nctoolkit_versus_xarray.ipynb +0 -0
  21. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/cheatsheet/nctoolkit_cheatsheet.pdf +0 -0
  22. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/cheatsheet/nctoolkit_cheatsheet.pptx +0 -0
  23. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/checklists/api_checker.ipynb +0 -0
  24. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/geotiff.tif +0 -0
  25. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/pubplot_test.png +0 -0
  26. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/test1.html +0 -0
  27. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/test2.html +0 -0
  28. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/add_etc.py +0 -0
  29. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/append.py +0 -0
  30. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/assign.py +0 -0
  31. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/cdo_command.py +0 -0
  32. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/cellareas.py +0 -0
  33. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/centres.py +0 -0
  34. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/checks.py +0 -0
  35. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/cleanup.py +0 -0
  36. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/clear.py +0 -0
  37. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/compare.py +0 -0
  38. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/compare_data.py +0 -0
  39. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/corr.py +0 -0
  40. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/create_ensemble.py +0 -0
  41. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/crop.py +0 -0
  42. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/deprecated.py +0 -0
  43. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/distgrid.py +0 -0
  44. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/drop.py +0 -0
  45. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/esoteric.py +0 -0
  46. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/experimental.py +0 -0
  47. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/fill.py +0 -0
  48. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/flatten.py +0 -0
  49. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/fldstat.py +0 -0
  50. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/format.py +0 -0
  51. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/generate_grid.py +0 -0
  52. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/inttime.py +0 -0
  53. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/invert.py +0 -0
  54. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/masking.py +0 -0
  55. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/matchpoint.py +0 -0
  56. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mergers.py +0 -0
  57. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/meridonials.py +0 -0
  58. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mp_adders.py +0 -0
  59. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mp_matchers.py +0 -0
  60. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/nco_command.py +0 -0
  61. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/phenology.py +0 -0
  62. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/reduce.py +0 -0
  63. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/reduce_grid.py +0 -0
  64. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/regrid.py +0 -0
  65. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/remove.py +0 -0
  66. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/rename.py +0 -0
  67. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/resample.py +0 -0
  68. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/rollstat.py +0 -0
  69. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/run.py +0 -0
  70. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/session.py +0 -0
  71. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/set.py +0 -0
  72. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/setters.py +0 -0
  73. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/shape.py +0 -0
  74. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/shift.py +0 -0
  75. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/show.py +0 -0
  76. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/split.py +0 -0
  77. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/strip_vars.py +0 -0
  78. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/subset.py +0 -0
  79. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/sumall.py +0 -0
  80. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/temp_file.py +0 -0
  81. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/temporals.py +0 -0
  82. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/thresholds.py +0 -0
  83. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/to_lonlat.py +0 -0
  84. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/toxarray.py +0 -0
  85. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/tozlev.py +0 -0
  86. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/unify.py +0 -0
  87. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/utils.py +0 -0
  88. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/validator.py +0 -0
  89. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/validator_funs.py +0 -0
  90. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/verticals.py +0 -0
  91. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/zip.py +0 -0
  92. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/zonals.py +0 -0
  93. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/requirements.txt +0 -0
  94. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/setup.cfg +0 -0
  95. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/testing/test_parallel.py +0 -0
  96. {nctoolkit-1.1.2 → nctoolkit-1.1.5}/testing/test_scripting.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nctoolkit
3
- Version: 1.1.2
3
+ Version: 1.1.5
4
4
  Summary: A Python package for netCDF analysis and post-processing
5
5
  Home-page: https://github.com/pmlmodelling/nctoolkit
6
6
  Author: Robert Wilson
@@ -17,12 +17,27 @@ Classifier: Programming Language :: Python :: 3.9
17
17
  Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Requires-Python: >=3.6.1
20
- Provides-Extra: complete
21
20
  License-File: LICENSE
21
+ Requires-Dist: xarray
22
+ Requires-Dist: netCDF4
23
+ Requires-Dist: hvplot
24
+ Requires-Dist: panel
25
+ Requires-Dist: pandas
26
+ Requires-Dist: ncplot>=0.2.8
27
+ Requires-Dist: dill
28
+ Requires-Dist: python-dateutil
29
+ Requires-Dist: matplotlib
30
+ Requires-Dist: multiprocess
31
+ Provides-Extra: complete
32
+ Requires-Dist: geoviews; extra == "complete"
33
+ Requires-Dist: rioxarray; extra == "complete"
34
+ Requires-Dist: cfchecker; extra == "complete"
35
+ Requires-Dist: geocube; extra == "complete"
36
+ Requires-Dist: geopandas; extra == "complete"
22
37
 
23
38
 
24
39
 
25
- **nctoolkit** is a comprehensive Python (3.6 and above) package for analyzing netCDF data on Linux and macOS.
40
+ **nctoolkit** is a comprehensive Python (3.8 and above) package for analyzing netCDF data on Linux and macOS.
26
41
 
27
42
  Core abilities of nctoolkit include:
28
43
 
@@ -11,6 +11,7 @@ from nctoolkit.api import (
11
11
  open_url,
12
12
  )
13
13
 
14
+
14
15
  from nctoolkit.unify import unify
15
16
  from nctoolkit.shape import open_shape
16
17
 
@@ -9,9 +9,13 @@ from nctoolkit.show import nc_years
9
9
  from nctoolkit.temp_file import temp_file
10
10
  from nctoolkit.session import remove_safe, session_info, nc_safe_par, nc_safe
11
11
  from nctoolkit.api import update_options
12
+ from nctoolkit.runners import ann_anomaly
12
13
 
13
14
  if platform.system() == "Linux":
14
15
  import multiprocessing as mp
16
+ #start = mp.get_start_method()
17
+ #if start != "spawn":
18
+ # mp.set_start_method("spawn")
15
19
  from multiprocessing import Manager
16
20
 
17
21
  manager = Manager()
@@ -22,55 +26,6 @@ else:
22
26
  manager = Manager()
23
27
 
24
28
 
25
- def ann_anomaly(
26
- ff, baseline, metric, window, align, precision, new_files, new_commands, nc_safe
27
- ):
28
- """
29
- Function to calculate the anomaly for a single file
30
- """
31
-
32
- # throw error if baseline is not valid
33
- orig_safe = copy.deepcopy(nc_safe)
34
- target = temp_file("nc")
35
- nc_safe.append(target)
36
- try:
37
- if len([yy for yy in baseline if yy not in nc_years(ff)]) > 0:
38
- raise ValueError("Check that the years in baseline are in the dataset!")
39
-
40
- # create the target file
41
- # generate the cdo command
42
- if metric == "absolute":
43
- cdo_command = (
44
- f"cdo -sub -runmean,{window} -yearmean {ff} -timmean "
45
- f"-selyear,{baseline[0]}/{baseline[1]} {ff} {target}"
46
- )
47
- else:
48
- cdo_command = (
49
- f"cdo -div -runmean,{window} -yearmean {ff} -timmean "
50
- f"-selyear,{baseline[0]}/{baseline[1]} {ff} {target}"
51
- )
52
-
53
- # run the command and save the temp file
54
-
55
- cdo_command = tidy_command(cdo_command)
56
- cdo_command = cdo_command.replace(
57
- "cdo ", f"cdo --timestat_date {align} "
58
- ).replace(" ", " ")
59
-
60
- target = run_cdo(cdo_command, target, precision=precision)
61
- if target not in nc_safe:
62
- nc_safe.append(target)
63
-
64
- # update the new files and commands
65
- new_files.append(target)
66
- new_commands.append(cdo_command)
67
- except BaseException as e:
68
- try:
69
- nc_safe.remove(target)
70
- except:
71
- pass
72
- return e
73
-
74
29
 
75
30
  def annual_anomaly(self, baseline=None, metric="absolute", window=1, align="right"):
76
31
  """
@@ -163,6 +118,9 @@ def annual_anomaly(self, baseline=None, metric="absolute", window=1, align="righ
163
118
  # This cannot possibly be threaded in cdo. Release it
164
119
 
165
120
  self.run()
121
+ for ff in self:
122
+ if len([yy for yy in baseline if yy not in nc_years(ff)]) > 0:
123
+ raise ValueError("Check that the years in baseline are in the dataset!")
166
124
 
167
125
  # calculate the anomalies for each file
168
126
  # this is not parallelized yet
@@ -185,7 +143,7 @@ def annual_anomaly(self, baseline=None, metric="absolute", window=1, align="righ
185
143
  target_list = []
186
144
  results = dict()
187
145
 
188
- pool = mp.pool.Pool(cores)
146
+ pool = mp.get_context('fork').Pool(cores)
189
147
  precision = copy.deepcopy(self._precision)
190
148
  for ff in self:
191
149
  results[ff] = pool.apply_async(
@@ -137,21 +137,7 @@ cdo_methods.append("reduce_dim")
137
137
  session_info["cdo_methods"] = cdo_methods
138
138
 
139
139
 
140
- def coast_check():
141
- try:
142
- import geoviews
143
- import cartopy
144
- from cartopy import crs
145
- import cartopy.crs as ccrs
146
-
147
- projection = ccrs.PlateCarree()
148
- return True
149
- except:
150
- return False
151
-
152
-
153
- session_info["coast"] = coast_check()
154
- #session_info["coast"] = None
140
+ session_info["coast"] = None
155
141
 
156
142
 
157
143
  session_info["interactive"] = sys.__stdin__.isatty()
@@ -1935,7 +1921,6 @@ class DataSet(object):
1935
1921
 
1936
1922
  from nctoolkit.phenology import phenology
1937
1923
 
1938
- # from nctoolkit.phenology import initiation
1939
1924
 
1940
1925
  from nctoolkit.plot import plot
1941
1926
  from nctoolkit.static_plot import pub_plot
@@ -167,7 +167,8 @@ def ensemble_median(self):
167
167
  self.run()
168
168
 
169
169
  if len(self) == 1:
170
- warnings.warn(message="There is only one file in the dataset")
170
+ warnings.warn(message="There is only one file in the dataset, so ensemble median cannot be calculated.")
171
+ return None
171
172
 
172
173
  cdo_command = "--sortname -enspctl,50"
173
174
 
@@ -131,7 +131,8 @@ def matchup(self, tmean=False, regrid="bil", max_extrap=5, quiet = False):
131
131
  points = points.merge(grid)
132
132
 
133
133
  if len(points) == 0:
134
- raise ValueError("None of the points are contained within the dataset grid")
134
+ warnings.warn("None of the points are contained within the dataset grid")
135
+ return None
135
136
 
136
137
  if len(points) < n_start:
137
138
  n_remove = n_start - len(points)
@@ -1,9 +1,21 @@
1
1
  import signal
2
- from ncplot import view
3
2
 
4
3
  from contextlib import contextmanager
5
4
  from nctoolkit.session import session_info
6
5
 
6
+ def coast_check():
7
+ try:
8
+ import geoviews
9
+ import cartopy
10
+ from cartopy import crs
11
+ import cartopy.crs as ccrs
12
+
13
+ projection = ccrs.PlateCarree()
14
+ return True
15
+ except:
16
+ return False
17
+
18
+
7
19
 
8
20
  class TimeoutException(Exception):
9
21
  pass
@@ -37,7 +49,7 @@ def plot(self, vars=None, autoscale=True, out=None, coast=None, **kwargs):
37
49
  out: str
38
50
  Name of output file if you want to save as html. Defaults to None.
39
51
  coast: bool
40
- Set to True if you want a coastline to show up on spatial map. Default is True if cartopy is installed and working. Otherwise it is False.
52
+ Set to True if you want a coastline to show up on spatial map. Default is True if a working version of cartopy is available. It is False otherwise.
41
53
 
42
54
  **kwargs: Optional args to be sent to hvplot
43
55
 
@@ -59,7 +71,10 @@ def plot(self, vars=None, autoscale=True, out=None, coast=None, **kwargs):
59
71
  >>> ds.plot("var_of_choice")
60
72
 
61
73
  """
74
+ from ncplot import view
62
75
 
76
+ if session_info["coast"] is None:
77
+ session_info["coast"] = coast_check()
63
78
 
64
79
  if "title" not in kwargs.keys():
65
80
  kwargs["title"] = ""