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.
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/PKG-INFO +18 -3
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/__init__.py +1 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/anomaly.py +8 -50
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/api.py +1 -16
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/ensembles.py +2 -1
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mp_matchups.py +2 -1
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/plot.py +17 -2
- nctoolkit-1.1.2/nctoolkit/runthis.py → nctoolkit-1.1.5/nctoolkit/runners.py +52 -426
- nctoolkit-1.1.5/nctoolkit/runthis.py +346 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/static_plot.py +10 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/temporal_stat.py +64 -21
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/to_nc.py +1 -1
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit.egg-info/SOURCES.txt +1 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/setup.py +2 -2
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/CITATION.cff +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/CODE_OF_CONDUCT.md +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/LICENSE +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/MANIFEST.in +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/README.md +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/benchmarks/benchmark_nctoolkit_versus_xarray.ipynb +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/cheatsheet/nctoolkit_cheatsheet.pdf +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/cheatsheet/nctoolkit_cheatsheet.pptx +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/checklists/api_checker.ipynb +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/geotiff.tif +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/pubplot_test.png +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/test1.html +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/data/test2.html +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/add_etc.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/append.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/assign.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/cdo_command.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/cellareas.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/centres.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/checks.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/cleanup.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/clear.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/compare.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/compare_data.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/corr.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/create_ensemble.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/crop.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/deprecated.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/distgrid.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/drop.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/esoteric.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/experimental.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/fill.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/flatten.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/fldstat.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/format.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/generate_grid.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/inttime.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/invert.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/masking.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/matchpoint.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mergers.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/meridonials.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mp_adders.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/mp_matchers.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/nco_command.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/phenology.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/reduce.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/reduce_grid.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/regrid.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/remove.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/rename.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/resample.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/rollstat.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/run.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/session.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/set.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/setters.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/shape.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/shift.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/show.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/split.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/strip_vars.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/subset.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/sumall.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/temp_file.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/temporals.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/thresholds.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/to_lonlat.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/toxarray.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/tozlev.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/unify.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/utils.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/validator.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/validator_funs.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/verticals.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/zip.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/nctoolkit/zonals.py +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/requirements.txt +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/setup.cfg +0 -0
- {nctoolkit-1.1.2 → nctoolkit-1.1.5}/testing/test_parallel.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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"] = ""
|