datastock 0.0.35__py3-none-any.whl → 0.0.37__py3-none-any.whl

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.
@@ -0,0 +1,406 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Mon Feb 5 15:16:42 2024
4
+
5
+ @author: dvezinet
6
+ """
7
+
8
+
9
+ import numpy as np
10
+
11
+
12
+ from . import _generic_utils
13
+ from . import _generic_check
14
+
15
+
16
+
17
+ #############################################
18
+ #############################################
19
+ # Main
20
+ #############################################
21
+
22
+
23
+ def main(
24
+ coll=None,
25
+ # options
26
+ show_which=None,
27
+ show=None,
28
+ # print parameters
29
+ sep=None,
30
+ line=None,
31
+ justify=None,
32
+ table_sep=None,
33
+ # bool options
34
+ verb=True,
35
+ returnas=False,
36
+ ):
37
+
38
+ # -------------
39
+ # check inputs
40
+ # -------------
41
+
42
+ show_which, show = _check_inputs(
43
+ coll=coll,
44
+ show_which=show_which,
45
+ show=show,
46
+ )
47
+
48
+ # intialize
49
+ lcol, lar = [], []
50
+
51
+ # -----------------------
52
+ # Build for dref
53
+ # -----------------------
54
+
55
+ if 'ref' in show_which and len(coll._dref) > 0:
56
+ lcol, lar = _show_ref(coll, lcol=lcol, lar=lar, show=show)
57
+
58
+ # -----------------------
59
+ # Build for ddata
60
+ # -----------------------
61
+
62
+ if 'data' in show_which and len(coll._ddata) > 0:
63
+ lcol, lar = _show_data(coll, lcol=lcol, lar=lar, show=show)
64
+
65
+ # -----------------------
66
+ # Build for dobj
67
+ # -----------------------
68
+
69
+ anyobj = (
70
+ len(coll._dobj) > 0
71
+ and any([
72
+ ss in show_which
73
+ for ss in ['obj'] + list(coll._dobj.keys())
74
+ ])
75
+ )
76
+ if anyobj:
77
+ for k0 in coll._dobj.keys():
78
+ if 'obj' in show_which or k0 in show_which:
79
+ func = coll._get_show_obj(k0)
80
+ lcol, lar = func(coll=coll, which=k0, lcol=lcol, lar=lar, show=show)
81
+
82
+ return _generic_utils.pretty_print(
83
+ headers=lcol,
84
+ content=lar,
85
+ sep=sep,
86
+ line=line,
87
+ table_sep=table_sep,
88
+ verb=verb,
89
+ returnas=returnas,
90
+ )
91
+
92
+
93
+ ###########################################################
94
+ ###########################################################
95
+ # check
96
+ ###########################################################
97
+
98
+
99
+ def _check_inputs(
100
+ coll=None,
101
+ show_which=None,
102
+ show=None,
103
+ ):
104
+
105
+ # -------------
106
+ # show_which
107
+ # -------------
108
+
109
+ if show_which is None:
110
+ show_which = ['ref', 'data', 'obj']
111
+
112
+ if isinstance(show_which, str):
113
+ show_which = [show_which]
114
+
115
+ lok = ['ref', 'data'] + list(coll._dobj.keys())
116
+ show_which = _generic_check._check_var_iter(
117
+ show_which, 'show_which',
118
+ types=(list, tuple),
119
+ types_iter=str,
120
+ allowed=lok + ['obj'],
121
+ )
122
+
123
+ # tuple => exclusion
124
+ if isinstance(show_which, tuple):
125
+
126
+ if 'obj' in show_which:
127
+ show_which = [
128
+ k0 for k0 in ['ref', 'data'] if k0 not in show_which
129
+ ]
130
+
131
+ else:
132
+ show_which = [
133
+ k0 for k0 in lok
134
+ if k0 not in show_which
135
+ ]
136
+ else:
137
+ if 'obj' in show_which:
138
+ show_which = (
139
+ [k0 for k0 in ['ref', 'data'] if k0 in show_which]
140
+ + list(coll._dobj.keys())
141
+ )
142
+
143
+ # -------------
144
+ # show
145
+ # -------------
146
+
147
+ if len(show_which) == 1:
148
+
149
+ if isinstance(show, str):
150
+ show = [show]
151
+
152
+ if show_which[0] == 'ref':
153
+ lok = list(coll.dref.keys())
154
+ elif show_which[0] == 'data':
155
+ lok = list(coll.ddata.keys())
156
+ else:
157
+ lok = list(coll.dobj.get(show_which[0], {}).keys())
158
+
159
+ show = _generic_check._check_var_iter(
160
+ show, 'show',
161
+ types=(list, tuple),
162
+ types_iter=str,
163
+ allowed=lok,
164
+ )
165
+
166
+ else:
167
+ show = None
168
+
169
+ return show_which, show
170
+
171
+
172
+ ###########################################################
173
+ ###########################################################
174
+ # specific show
175
+ ###########################################################
176
+
177
+
178
+ def _show_ref(coll=None, lcol=None, lar=None, show=None):
179
+
180
+ # ----------------
181
+ # column names
182
+ # ----------------
183
+
184
+ lcol.append(['ref key', 'size', 'nb. data', 'nb. data monot.'])
185
+
186
+ # ---------------
187
+ # prepare array
188
+ # ---------------
189
+
190
+ lk0 = [
191
+ k0 for k0 in coll._dref.keys()
192
+ if show is None or k0 in show
193
+ ]
194
+
195
+ lar.append([
196
+ [
197
+ k0,
198
+ str(coll._dref[k0]['size']),
199
+ str(len(coll._dref[k0]['ldata'])),
200
+ str(len(coll._dref[k0]['ldata_monot'])),
201
+ ]
202
+ for k0 in lk0
203
+ ])
204
+
205
+ # ---------------------------
206
+ # indices (for interactivity)
207
+ # ---------------------------
208
+
209
+ lp = coll.get_lparam(which='ref')
210
+ if 'indices' in lp:
211
+ lcol[0].append('indices')
212
+ for ii, (k0, v0) in enumerate(coll._dref.items()):
213
+ if coll._dref[k0]['indices'] is None:
214
+ lar[0][ii].append(str(v0['indices']))
215
+ else:
216
+ lar[0][ii].append(str(list(v0['indices'])))
217
+
218
+ # ---------------------------
219
+ # group (for interactivity)
220
+ # ---------------------------
221
+
222
+ if 'group' in lp:
223
+ lcol[0].append('group')
224
+ for ii, (k0, v0) in enumerate(coll._dref.items()):
225
+ lar[0][ii].append(str(coll._dref[k0]['group']))
226
+
227
+ # ---------------------------
228
+ # inc (for interactivity)
229
+ # ---------------------------
230
+
231
+ if 'inc' in lp:
232
+ lcol[0].append('increment')
233
+ for ii, (k0, v0) in enumerate(coll._dref.items()):
234
+ lar[0][ii].append(str(coll._dref[k0]['inc']))
235
+
236
+ return lcol, lar
237
+
238
+
239
+ def _show_data(coll=None, lcol=None, lar=None, show=None):
240
+
241
+ # ----------------
242
+ # parameters
243
+ # ----------------
244
+
245
+ lk = _show_get_fields(
246
+ which='data',
247
+ lparam=coll.get_lparam(which='data', for_show=True),
248
+ dshow=coll._dshow,
249
+ )
250
+
251
+ # ---------------------------
252
+ # column names
253
+ # ---------------------------
254
+
255
+ lcol.append(['data'] + [pp.split('.')[-1] for pp in lk])
256
+
257
+ # ---------------------------
258
+ # data
259
+ # ---------------------------
260
+
261
+ lk0 = [
262
+ k0 for k0 in coll._ddata.keys()
263
+ if show is None or k0 in show
264
+ ]
265
+
266
+ lar.append([
267
+ [k0] + _show_extract(dobj=coll._ddata[k0], lk=lk)
268
+ for k0 in lk0
269
+ ])
270
+
271
+ return lcol, lar
272
+
273
+
274
+ def _show_obj_def(coll=None, which=None, lcol=None, lar=None, show=None):
275
+
276
+ # ----------------
277
+ # parameters
278
+ # ----------------
279
+
280
+ lk = _show_get_fields(
281
+ which=which,
282
+ lparam=coll.get_lparam(which=which, for_show=True),
283
+ dshow=coll._dshow,
284
+ )
285
+
286
+ # ---------------------------
287
+ # column names
288
+ # ---------------------------
289
+
290
+ lcol.append([which] + [pp.split('.')[-1] for pp in lk])
291
+
292
+ # ---------------------------
293
+ # data
294
+ # ---------------------------
295
+
296
+ lkey = [
297
+ k1 for k1 in coll._dobj.get(which, {}).keys()
298
+ if show is None or k1 in show
299
+ ]
300
+
301
+ lar.append([
302
+ [k1] + _show_extract(dobj=coll.dobj[which][k1], lk=lk)
303
+ for k1 in lkey
304
+ ])
305
+
306
+ return lcol, lar
307
+
308
+
309
+ ###########################################################
310
+ ###########################################################
311
+ # Utilities
312
+ ###########################################################
313
+
314
+
315
+ def _get_lparam_show_append(which, key, val, lparam, for_show):
316
+
317
+ c0 = (
318
+ callable(val)
319
+ or 'class' in key
320
+ or 'handle' in key
321
+ or (which == 'axes' and key == 'bck')
322
+ or isinstance(val, dict)
323
+ )
324
+ if key not in lparam and ((not for_show) or (for_show and not c0)):
325
+ lparam.append(key)
326
+
327
+
328
+ def _get_lparam(which=None, dd=None, for_show=None):
329
+
330
+ if for_show:
331
+ lparam = []
332
+ for k0, v0 in dd.items():
333
+ for k1, v1 in v0.items():
334
+ if isinstance(v1, dict):
335
+ for k2, v2 in v1.items():
336
+ k3 = f'{k1}.{k2}'
337
+ _get_lparam_show_append(
338
+ which, k3, v2, lparam, for_show,
339
+ )
340
+ else:
341
+ _get_lparam_show_append(
342
+ which, k1, v1, lparam, for_show,
343
+ )
344
+
345
+ else:
346
+ lparam = list(list(dd.values())[0].keys())
347
+
348
+ return lparam
349
+
350
+
351
+ def _show_get_fields(which=None, lparam=None, dshow=None):
352
+
353
+ # show dict
354
+ if which not in dshow.keys():
355
+ lk = lparam
356
+
357
+ else:
358
+ lk = dshow[which]
359
+
360
+ if isinstance(lk, list):
361
+ lk = [
362
+ kk for kk in dshow[which]
363
+ if kk in lparam
364
+ ]
365
+ elif isinstance(lk, tuple):
366
+ lk = [
367
+ kk for kk in lparam
368
+ if kk not in dshow[which]
369
+ ]
370
+ else:
371
+ msg = f"Unreckognized dshow['{which}']"
372
+ raise Exception(msg)
373
+
374
+ return lk
375
+
376
+
377
+ def _show_extract(dobj=None, lk=None):
378
+
379
+ lv0 = []
380
+ for k0 in lk:
381
+
382
+ lk0 = k0.split('.')
383
+ for ii in range(len(lk0)):
384
+ if ii == 0:
385
+ v0 = dobj[lk0[ii]]
386
+ elif v0 is not None:
387
+ v0 = v0[lk0[ii]]
388
+
389
+ # formatting
390
+ if isinstance(v0, float):
391
+ lv0.append(f'{v0:.2e}')
392
+
393
+ elif isinstance(v0, np.ndarray) and v0.size == 3:
394
+ if v0.dtype == float:
395
+ lv0.append(
396
+ np.array2string(
397
+ v0,
398
+ formatter={'float': lambda x: f'{x:.3e}'},
399
+ ),
400
+ )
401
+ else:
402
+ lv0.append(str(v0))
403
+ else:
404
+ lv0.append(str(v0))
405
+
406
+ return lv0
@@ -34,6 +34,8 @@ def get_ref_vector(
34
34
  # ressources
35
35
  ddata=None,
36
36
  dref=None,
37
+ # data to find vector for
38
+ key0=None,
37
39
  # inputs
38
40
  key=None,
39
41
  ref=None,
@@ -58,13 +60,21 @@ def get_ref_vector(
58
60
  default=True,
59
61
  )
60
62
 
61
- # key
63
+ # key0
62
64
  lkok = list(ddata.keys()) + [None]
63
- key = _generic_check._check_var(
64
- key, 'key',
65
+ key0 = _generic_check._check_var(
66
+ key0, 'key0',
65
67
  allowed=lkok,
66
68
  )
67
69
 
70
+ # key
71
+ if key is not None:
72
+ lkok = list(ddata.keys()) + [None]
73
+ key = _generic_check._check_var(
74
+ key, 'key',
75
+ allowed=lkok,
76
+ )
77
+
68
78
  # ref
69
79
  lkok = list(dref.keys()) + [None]
70
80
  ref = _generic_check._check_var(
@@ -72,8 +82,8 @@ def get_ref_vector(
72
82
  allowed=lkok,
73
83
  )
74
84
 
75
- if key is None and ref is None:
76
- msg = "Please provide key or ref at least!"
85
+ if key0 is None and ref is None:
86
+ msg = "Please provide key0 or ref at least!"
77
87
  raise Exception(msg)
78
88
 
79
89
  # warn
@@ -87,8 +97,8 @@ def get_ref_vector(
87
97
  # hasref, hasvect
88
98
 
89
99
  hasref = None
90
- if ref is not None and key is not None:
91
- hasref = ref in ddata[key]['ref']
100
+ if ref is not None and key0 is not None:
101
+ hasref = ref in ddata[key0]['ref']
92
102
  if not hasref:
93
103
  ref = None
94
104
  elif ref is not None:
@@ -96,8 +106,8 @@ def get_ref_vector(
96
106
 
97
107
  if hasref is True:
98
108
  refok = (ref,)
99
- elif key is not None:
100
- refok = ddata[key]['ref']
109
+ elif key0 is not None:
110
+ refok = ddata[key0]['ref']
101
111
 
102
112
  # identify possible vect
103
113
  if hasref is not False:
@@ -113,10 +123,14 @@ def get_ref_vector(
113
123
  ])
114
124
  ]
115
125
 
116
- # particular case
126
+ # if key is provided
117
127
  if key is not None and key in lk_vect:
118
128
  lk_vect = [key]
119
129
 
130
+ # particular case
131
+ if key0 is not None and key0 in lk_vect:
132
+ lk_vect = [key0]
133
+
120
134
  # cases
121
135
  if len(lk_vect) == 0:
122
136
  if warn is True:
@@ -137,7 +151,7 @@ def get_ref_vector(
137
151
  if warn is True:
138
152
  msg = (
139
153
  f"Multiple possible vectors found:\n{lk_vect}\n"
140
- f"\t- key: {key}\n"
154
+ f"\t- key0: {key0}\n"
141
155
  f"\t- ref: {ref}\n"
142
156
  f"\t- hasref: {hasref}\n"
143
157
  f"\t- refok: {refok}\n"
@@ -397,7 +411,7 @@ def _get_ref_vector_find_identical(
397
411
  _, hasvecti, _, key_vecti = get_ref_vector(
398
412
  ddata=ddata,
399
413
  dref=dref,
400
- key=k0,
414
+ key0=k0,
401
415
  ref=ref,
402
416
  dim=dim,
403
417
  quant=quant,
@@ -437,6 +451,7 @@ def get_ref_vector_common(
437
451
  # inputs
438
452
  keys=None,
439
453
  # for selecting ref vector
454
+ key=None,
440
455
  ref=None,
441
456
  dim=None,
442
457
  quant=None,
@@ -499,7 +514,9 @@ def get_ref_vector_common(
499
514
  hasrefi, hasvecti, refi, key_vecti, vali, dindi = get_ref_vector(
500
515
  ddata=ddata,
501
516
  dref=dref,
502
- key=k0,
517
+ key0=k0,
518
+ # select vector
519
+ key=key,
503
520
  ref=ref,
504
521
  dim=dim,
505
522
  quant=quant,
@@ -732,7 +749,7 @@ def _get_ref_vector_common_values(
732
749
  hasrefi, hasvecti, refi, key_vecti, vali, dindi = get_ref_vector(
733
750
  ddata=ddata,
734
751
  dref=dref,
735
- key=k0,
752
+ key0=k0,
736
753
  ref=ref,
737
754
  dim=dim,
738
755
  quant=quant,
@@ -847,7 +864,7 @@ def _uniformize_check(
847
864
  param = _generic_check._check_var(
848
865
  param, 'param',
849
866
  types=str,
850
- allowed=['dim', 'quant', 'name', 'units'],
867
+ allowed=['key', 'dim', 'quant', 'name', 'units'],
851
868
  default='dim',
852
869
  )
853
870
 
@@ -855,10 +872,11 @@ def _uniformize_check(
855
872
  # list availabe values for param and associated refs
856
873
  dparref = {
857
874
  k0: [
858
- v1[param] for k1, v1 in coll.ddata.items()
875
+ (k1 if param == 'key' else v1[param])
876
+ for k1, v1 in coll.ddata.items()
859
877
  if v1['monot'] == (True,)
860
878
  and v1['ref'][0] == k0
861
- and (lparam is None or v1[param] in lparam)
879
+ and (lparam is None or (param != 'key' and v1[param] in lparam))
862
880
  ]
863
881
  for k0 in refs
864
882
  }
@@ -898,7 +916,7 @@ def _uniformize_check(
898
916
  for k0, v0 in dparam.items():
899
917
  lout = [
900
918
  k1 for k1 in v0['keys']
901
- if coll.get_ref_vector(key=k1, **{param: k0})[3] is None
919
+ if coll.get_ref_vector(key0=k1, **{param: k0})[3] is None
902
920
  ]
903
921
  if len(lout) > 0:
904
922
  dfails[k0] = lout
@@ -1047,4 +1065,4 @@ def uniformize(
1047
1065
  if returnas == 'dataframe':
1048
1066
  pass
1049
1067
 
1050
- return stu
1068
+ return stu
datastock/_class2.py CHANGED
@@ -1374,53 +1374,9 @@ class DataStock2(DataStock1):
1374
1374
  # -------------------
1375
1375
 
1376
1376
  def on_close(self, event):
1377
- kcan = [
1378
- k0 for k0, v0 in self._dobj['canvas'].items()
1379
- if v0['handle'] == event.canvas
1380
- ]
1381
- if len(kcan) > 1:
1382
- raise Exception('Several matching canvas')
1383
- elif len(kcan) == 1:
1384
-
1385
- if len(self._dobj['canvas']) == 1:
1386
- self.close_all()
1387
-
1388
- else:
1389
- lax = [
1390
- k1 for k1, v1 in self._dobj['axes'].items()
1391
- if v1['canvas'] == kcan[0]
1392
- ]
1393
- lmob = [
1394
- k1 for k1, v1 in self._dobj['mobile'].items()
1395
- if v1['axes'] in lax
1396
- ]
1397
- for k1 in lax:
1398
- del self._dobj['axes'][k1]
1399
- for k1 in lmob:
1400
- del self._dobj['mobile'][k1]
1401
- del self._dobj['canvas'][kcan[0]]
1402
-
1403
- def close_all(self):
1404
-
1405
- # close figures
1406
- if 'axes' in self._dobj.keys():
1407
- lfig = set([
1408
- v0['handle'].figure for v0 in self._dobj['axes'].values()
1409
- ])
1410
- for ff in lfig:
1411
- plt.close(ff)
1412
-
1413
- # delete obj dict
1414
- lk = ['interactivity', 'mobile', 'key', 'canvas', 'group', 'axes']
1415
- for kk in lk:
1416
- if kk in self._dobj.keys():
1417
- del self._dobj[kk]
1418
-
1419
- # remove interactivity-specific param in dref
1420
- lp = list(set(self.get_lparam(which='ref')).intersection(
1421
- ['indices', 'group', 'inc']
1422
- ))
1423
- self.remove_param(which='ref', param=lp)
1377
+ self.remove_all(excluded=['canvas']) # to avoid crash
1378
+ print("\n---- CLOSING interactive figure ----")
1379
+ print(f"\tleft in dax: {self.get_nbytes()[0]/1000} Ko\n")
1424
1380
 
1425
1381
 
1426
1382
  # #############################################################################
@@ -1431,4 +1387,4 @@ class DataStock2(DataStock1):
1431
1387
 
1432
1388
  __all__ = [
1433
1389
  sorted([k0 for k0 in locals() if k0.startswith('DataStock')])[-1]
1434
- ]
1390
+ ]
datastock/_class3.py CHANGED
@@ -24,8 +24,8 @@ class DataStock3(DataStock2):
24
24
  keyZ=None,
25
25
  keyU=None,
26
26
  ind=None,
27
- vmin=None,
28
- vmax=None,
27
+ dvminmax=None,
28
+ dscale=None,
29
29
  cmap=None,
30
30
  aspect=None,
31
31
  nmax=None,
@@ -43,13 +43,19 @@ class DataStock3(DataStock2):
43
43
  dax=None,
44
44
  dmargin=None,
45
45
  fs=None,
46
+ wintit=None,
47
+ tit=None,
46
48
  dcolorbar=None,
47
49
  dleg=None,
48
50
  label=None,
49
51
  connect=None,
50
52
  inplace=None,
51
53
  ):
52
- """ Plot the desired 2d data array as a matrix """
54
+ """ Plot the desired 1d, 2, 3, or 4d data array as a matrix
55
+
56
+ other axes can be plotted using monotonous (optionally uniform) arrays
57
+
58
+ """
53
59
  return _plot_as_array.plot_as_array(
54
60
  # parameters
55
61
  coll=self,
@@ -59,8 +65,8 @@ class DataStock3(DataStock2):
59
65
  keyZ=keyZ,
60
66
  keyU=keyU,
61
67
  ind=ind,
62
- vmin=vmin,
63
- vmax=vmax,
68
+ dvminmax=dvminmax,
69
+ dscale=dscale,
64
70
  cmap=cmap,
65
71
  aspect=aspect,
66
72
  nmax=nmax,
@@ -78,6 +84,8 @@ class DataStock3(DataStock2):
78
84
  dax=dax,
79
85
  dmargin=dmargin,
80
86
  fs=fs,
87
+ wintit=wintit,
88
+ tit=tit,
81
89
  dcolorbar=dcolorbar,
82
90
  dleg=dleg,
83
91
  label=label,
@@ -416,4 +424,4 @@ class DataStock3(DataStock2):
416
424
 
417
425
  __all__ = [
418
426
  sorted([k0 for k0 in locals() if k0.startswith('DataStock')])[-1]
419
- ]
427
+ ]