Skip to content

Commit 837fa1a

Browse files
committed
Add EddyInfos to have some quick stat
1 parent 8073c07 commit 837fa1a

File tree

4 files changed

+89
-9
lines changed

4 files changed

+89
-9
lines changed

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"EddyId = py_eddy_tracker.appli.grid:eddy_id",
4141
# eddies
4242
"MergeEddies = py_eddy_tracker.appli.eddies:merge_eddies",
43+
"EddyInfos = py_eddy_tracker.appli.eddies:display_infos",
4344
# network
4445
"EddyNetworkGroup = py_eddy_tracker.appli.network:build_network",
4546
"EddyNetworkBuildPath = py_eddy_tracker.appli.network:divide_network",

src/py_eddy_tracker/appli/eddies.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from netCDF4 import Dataset
2424
from .. import EddyParser
2525
from ..observations.tracking import TrackEddiesObservations
26+
from ..observations.observation import EddiesObservations
2627

2728

2829
def merge_eddies():
@@ -54,3 +55,20 @@ def merge_eddies():
5455
other = other.add_rotation_type()
5556
obs = obs.merge(other)
5657
obs.write_file(filename=args.out)
58+
59+
60+
def display_infos():
61+
parser = EddyParser("Display General inforamtion")
62+
parser.add_argument("observations", nargs='+', help="Input observations to compute frequency")
63+
args = parser.parse_args()
64+
array_vars = [
65+
"speed_contour_longitude",
66+
"speed_contour_latitude",
67+
"effective_contour_longitude",
68+
"effective_contour_latitude",
69+
"uavg_profile",
70+
]
71+
for filename in args.observations:
72+
print(f"-- {filename} --")
73+
e = EddiesObservations.load_file(filename, remove_vars=array_vars)
74+
print(e.__repr__())

src/py_eddy_tracker/observations/observation.py

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,66 @@ def shape(self):
199199
return self.observations.shape
200200

201201
def __repr__(self):
202-
return "%d observations" % len(self.observations)
202+
"""
203+
return general informations on dataset as a string
204+
205+
:return: informations on datasets
206+
:rtype: str
207+
"""
208+
t0, t1 = self.period
209+
period = t1 - t0 + 1
210+
bins_lat = (-90, -60, -15, 15, 60, 90)
211+
bins_amplitude = array((0, 1, 2, 3, 4, 5, 10, 500))
212+
bins_radius = array((0, 15, 30, 45, 60, 75, 100, 200, 2000))
213+
nb_obs = self.observations.shape[0]
214+
215+
def hist(varname, x="lat", bins=bins_lat, percent=False, mean=False, nb=False):
216+
"""
217+
:param str varname: variable to use to compute stat
218+
:param str x: variable to use to know in which bins
219+
:param array bins:
220+
:param bool percent: normalize by sum of all bins
221+
:param bool mean: compute mean by bins
222+
:param nb mean: only count by bins
223+
:return: value by bins
224+
:rtype: array
225+
"""
226+
if nb:
227+
v = histogram(self[x], bins=bins)[0]
228+
else:
229+
v = histogram(self[x], bins=bins, weights=self[varname])[0]
230+
if percent:
231+
v = v.astype("f4") / v.sum() * 100
232+
elif mean:
233+
v /= histogram(self[x], bins=bins)[0]
234+
return v
235+
236+
def box_display(value):
237+
"""Return value evenly spaced with few numbers"""
238+
return "".join([f"{v_:10.2f}" for v_ in value])
239+
240+
return f"""{nb_obs} observations from {t0} to {t1} ({period} days, ~{nb_obs / period:.0f} obs/day)
241+
Speed area : {self["speed_area"].sum() / period / 1e12:.2f} Mkm²/day
242+
Effective area : {self["effective_area"].sum() / period / 1e12:.2f} Mkm²/day
243+
244+
Distribution in Amplitude:
245+
Amplitude bounds (cm) {box_display(bins_amplitude)}
246+
Percent of eddies : {box_display(hist('time', 'amplitude', bins_amplitude / 100., percent=True, nb=True))}
247+
248+
Distribution in Radius:
249+
Speed radius (km) {box_display(bins_radius)}
250+
Percent of eddies : {box_display(hist('time', 'radius_s', bins_radius * 1000., percent=True, nb=True))}
251+
252+
Distribution in Latitude
253+
Latitude bounds {box_display(bins_lat)}
254+
Percent of eddies : {box_display(hist('time', percent=True, nb=True))}
255+
Percent of speed area : {box_display(hist('speed_area', percent=True))}
256+
Percent of effective area : {box_display(hist('effective_area', percent=True))}
257+
258+
Mean speed radius (km) : {box_display(hist('radius_s', mean=True) / 1000.)}
259+
Mean effective radius (km): {box_display(hist('radius_e', mean=True) / 1000.)}
260+
Mean amplitude (cm) : {box_display(hist('amplitude', mean=True) * 100.)}
261+
"""
203262

204263
def __getitem__(self, attr):
205264
if attr in self.elements:
@@ -1366,6 +1425,16 @@ def interp_grid(
13661425
else:
13671426
raise Exception(f'method "{method}" unknown')
13681427

1428+
@property
1429+
def period(self):
1430+
"""
1431+
Give time coverage
1432+
1433+
:return: first and last date
1434+
:rtype: (int,int)
1435+
"""
1436+
return self.time.min(), self.time.max()
1437+
13691438

13701439
@njit(cache=True)
13711440
def grid_count_(grid, i, j):

src/py_eddy_tracker/observations/tracking.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,6 @@ def extract_with_period(self, period, **kwargs):
192192
mask *= self.time <= (dataset_period[1] + p_max)
193193
return self.__extract_with_mask(mask, **kwargs)
194194

195-
@property
196-
def period(self):
197-
"""
198-
Give time coverage
199-
Returns: 2 date
200-
"""
201-
return self.time.min(), self.time.max()
202-
203195
def get_mask_from_id(self, tracks):
204196
mask = zeros(self.tracks.shape, dtype=bool_)
205197
compute_mask_from_id(tracks, self.index_from_track, self.nb_obs_by_track, mask)

0 commit comments

Comments
 (0)