|
4 | 4 | """
|
5 | 5 | import logging
|
6 | 6 | from datetime import datetime
|
| 7 | +from io import BufferedReader |
7 | 8 | from tarfile import ExFileObject
|
8 | 9 | from tokenize import TokenError
|
9 | 10 |
|
@@ -200,26 +201,30 @@ def _repr_html_(self):
|
200 | 201 | infos = self.get_infos()
|
201 | 202 | return f"""<b>{infos['nb_obs']} observations from {infos['t0']} to {infos['t1']} </b>"""
|
202 | 203 |
|
| 204 | + def parse_varname(self, name): |
| 205 | + return self[name] if isinstance(name, str) else name |
| 206 | + |
203 | 207 | def hist(self, varname, x, bins, percent=False, mean=False, nb=False):
|
204 | 208 | """Build histograms.
|
205 | 209 |
|
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 |
208 | 212 | :param array bins:
|
209 | 213 | :param bool percent: normalize by sum of all bins
|
210 | 214 | :param bool mean: compute mean by bins
|
211 | 215 | :param bool nb: only count by bins
|
212 | 216 | :return: value by bins
|
213 | 217 | :rtype: array
|
214 | 218 | """
|
| 219 | + x = self.parse_varname(x) |
215 | 220 | if nb:
|
216 |
| - v = hist_numba(self[x], bins=bins)[0] |
| 221 | + v = hist_numba(x, bins=bins)[0] |
217 | 222 | else:
|
218 |
| - v = histogram(self[x], bins=bins, weights=self[varname])[0] |
| 223 | + v = histogram(x, bins=bins, weights=self.parse_varname(varname))[0] |
219 | 224 | if percent:
|
220 | 225 | v = v.astype("f4") / v.sum() * 100
|
221 | 226 | elif mean:
|
222 |
| - v /= hist_numba(self[x], bins=bins)[0] |
| 227 | + v /= hist_numba(x, bins=bins)[0] |
223 | 228 | return v
|
224 | 229 |
|
225 | 230 | @staticmethod
|
@@ -777,7 +782,7 @@ def load_from_netcdf(
|
777 | 782 | array_dim = "NbSample"
|
778 | 783 | if isinstance(filename, bytes):
|
779 | 784 | filename = filename.astype(str)
|
780 |
| - if isinstance(filename, ExFileObject): |
| 785 | + if isinstance(filename, (ExFileObject, BufferedReader)): |
781 | 786 | filename.seek(0)
|
782 | 787 | args, kwargs = ("in-mem-file",), dict(memory=filename.read())
|
783 | 788 | else:
|
@@ -1626,7 +1631,7 @@ def scatter(self, ax, name=None, ref=None, factor=1, **kwargs):
|
1626 | 1631 | x = (x - ref) % 360 + ref
|
1627 | 1632 | kwargs = kwargs.copy()
|
1628 | 1633 | 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) |
1630 | 1635 | kwargs["c"] = v * factor
|
1631 | 1636 | return ax.scatter(x, self.latitude, **kwargs)
|
1632 | 1637 |
|
@@ -1671,7 +1676,7 @@ def filled(
|
1671 | 1676 | if "facecolors" not in kwargs:
|
1672 | 1677 | kwargs = kwargs.copy()
|
1673 | 1678 | cmap = get_cmap(cmap, lut)
|
1674 |
| - v = (self[varname] if isinstance(varname, str) else varname) * factor |
| 1679 | + v = self.parse_varname(varname) * factor |
1675 | 1680 | if vmin is None:
|
1676 | 1681 | vmin = v.min()
|
1677 | 1682 | if vmax is None:
|
@@ -1783,15 +1788,15 @@ def bins_stat(self, xname, bins=None, yname=None, method=None, mask=None):
|
1783 | 1788 |
|
1784 | 1789 | .. minigallery:: py_eddy_tracker.EddiesObservations.bins_stat
|
1785 | 1790 | """
|
1786 |
| - v = self[xname] if isinstance(xname, str) else xname |
| 1791 | + v = self.parse_varname(xname) |
1787 | 1792 | mask = self.merge_filters(mask)
|
1788 | 1793 | v = v[mask]
|
1789 | 1794 | if bins is None:
|
1790 | 1795 | bins = arange(v.min(), v.max() + 2)
|
1791 | 1796 | y, x = hist_numba(v, bins=bins)
|
1792 | 1797 | x = (x[1:] + x[:-1]) / 2
|
1793 | 1798 | if method == "mean":
|
1794 |
| - y_v = self[yname] if isinstance(yname, str) else yname |
| 1799 | + y_v = self.parse_varname(yname) |
1795 | 1800 | y_v = y_v[mask]
|
1796 | 1801 | y_, _ = histogram(v, bins=bins, weights=y_v)
|
1797 | 1802 | with errstate(divide="ignore", invalid="ignore"):
|
@@ -1948,10 +1953,10 @@ def grid_count(self, bins, intern=False, center=False, filter=slice(None)):
|
1948 | 1953 |
|
1949 | 1954 | def grid_box_stat(self, bins, varname, method=50, data=None, filter=slice(None)):
|
1950 | 1955 | """
|
1951 |
| - Compute mean of eddies in each bin |
| 1956 | + Get percentile of eddies in each bin |
1952 | 1957 |
|
1953 | 1958 | :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 |
1955 | 1960 | :param str,float method: method to apply. If float, use ?
|
1956 | 1961 | :param array data: Array used to compute stat if defined
|
1957 | 1962 | :param array,mask,slice filter: keep the data selected with the filter
|
@@ -1999,7 +2004,7 @@ def grid_stat(self, bins, varname, data=None):
|
1999 | 2004 | Return the mean of the eddies' variable in each bin
|
2000 | 2005 |
|
2001 | 2006 | :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 |
2003 | 2008 | :param array data: Array used to compute stat if defined
|
2004 | 2009 | :return: return the gridde mean variable
|
2005 | 2010 | :rtype: py_eddy_tracker.dataset.grid.RegularGridDataset
|
|
0 commit comments