|
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