Skip to content

Commit eaef32b

Browse files
committed
add method to check if variable is an array or field name
1 parent 40ce202 commit eaef32b

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

src/py_eddy_tracker/observations/observation.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"""
55
import logging
66
from datetime import datetime
7+
from io import BufferedReader
78
from tarfile import ExFileObject
89
from tokenize import TokenError
910

@@ -200,26 +201,30 @@ def _repr_html_(self):
200201
infos = self.get_infos()
201202
return f"""<b>{infos['nb_obs']} observations from {infos['t0']} to {infos['t1']} </b>"""
202203

204+
def parse_varname(self, name):
205+
return self[name] if isinstance(name, str) else name
206+
203207
def hist(self, varname, x, bins, percent=False, mean=False, nb=False):
204208
"""Build histograms.
205209
206-
:param str varname: variable to use to compute stat
207-
:param str x: variable to use to know in which bins
210+
:param str,array varname: variable to use to compute stat
211+
:param str,array x: variable to use to know in which bins
208212
:param array bins:
209213
:param bool percent: normalize by sum of all bins
210214
:param bool mean: compute mean by bins
211215
:param bool nb: only count by bins
212216
:return: value by bins
213217
:rtype: array
214218
"""
219+
x = self.parse_varname(x)
215220
if nb:
216-
v = hist_numba(self[x], bins=bins)[0]
221+
v = hist_numba(x, bins=bins)[0]
217222
else:
218-
v = histogram(self[x], bins=bins, weights=self[varname])[0]
223+
v = histogram(x, bins=bins, weights=self.parse_varname(varname))[0]
219224
if percent:
220225
v = v.astype("f4") / v.sum() * 100
221226
elif mean:
222-
v /= hist_numba(self[x], bins=bins)[0]
227+
v /= hist_numba(x, bins=bins)[0]
223228
return v
224229

225230
@staticmethod
@@ -777,7 +782,7 @@ def load_from_netcdf(
777782
array_dim = "NbSample"
778783
if isinstance(filename, bytes):
779784
filename = filename.astype(str)
780-
if isinstance(filename, ExFileObject):
785+
if isinstance(filename, (ExFileObject, BufferedReader)):
781786
filename.seek(0)
782787
args, kwargs = ("in-mem-file",), dict(memory=filename.read())
783788
else:
@@ -1626,7 +1631,7 @@ def scatter(self, ax, name=None, ref=None, factor=1, **kwargs):
16261631
x = (x - ref) % 360 + ref
16271632
kwargs = kwargs.copy()
16281633
if name is not None and "c" not in kwargs:
1629-
v = self[name] if isinstance(name, str) else name
1634+
v = self.parse_varname(name)
16301635
kwargs["c"] = v * factor
16311636
return ax.scatter(x, self.latitude, **kwargs)
16321637

@@ -1671,7 +1676,7 @@ def filled(
16711676
if "facecolors" not in kwargs:
16721677
kwargs = kwargs.copy()
16731678
cmap = get_cmap(cmap, lut)
1674-
v = (self[varname] if isinstance(varname, str) else varname) * factor
1679+
v = self.parse_varname(varname) * factor
16751680
if vmin is None:
16761681
vmin = v.min()
16771682
if vmax is None:
@@ -1783,15 +1788,15 @@ def bins_stat(self, xname, bins=None, yname=None, method=None, mask=None):
17831788
17841789
.. minigallery:: py_eddy_tracker.EddiesObservations.bins_stat
17851790
"""
1786-
v = self[xname] if isinstance(xname, str) else xname
1791+
v = self.parse_varname(xname)
17871792
mask = self.merge_filters(mask)
17881793
v = v[mask]
17891794
if bins is None:
17901795
bins = arange(v.min(), v.max() + 2)
17911796
y, x = hist_numba(v, bins=bins)
17921797
x = (x[1:] + x[:-1]) / 2
17931798
if method == "mean":
1794-
y_v = self[yname] if isinstance(yname, str) else yname
1799+
y_v = self.parse_varname(yname)
17951800
y_v = y_v[mask]
17961801
y_, _ = histogram(v, bins=bins, weights=y_v)
17971802
with errstate(divide="ignore", invalid="ignore"):
@@ -1948,10 +1953,10 @@ def grid_count(self, bins, intern=False, center=False, filter=slice(None)):
19481953

19491954
def grid_box_stat(self, bins, varname, method=50, data=None, filter=slice(None)):
19501955
"""
1951-
Compute mean of eddies in each bin
1956+
Get percentile of eddies in each bin
19521957
19531958
:param (numpy.array,numpy.array) bins: bins (grid) to count
1954-
:param str varname: variable to apply the method
1959+
:param str varname: variable to apply the method if data is None and will be output name
19551960
:param str,float method: method to apply. If float, use ?
19561961
:param array data: Array used to compute stat if defined
19571962
:param array,mask,slice filter: keep the data selected with the filter
@@ -1999,7 +2004,7 @@ def grid_stat(self, bins, varname, data=None):
19992004
Return the mean of the eddies' variable in each bin
20002005
20012006
:param (numpy.array,numpy.array) bins: bins (grid) to compute the mean on
2002-
:param str varname: name of variable to compute the mean on
2007+
:param str varname: name of variable to compute the mean on and output grid_name
20032008
:param array data: Array used to compute stat if defined
20042009
:return: return the gridde mean variable
20052010
:rtype: py_eddy_tracker.dataset.grid.RegularGridDataset

0 commit comments

Comments
 (0)