1212from collections import namedtuple
1313from itertools import zip_longest
1414
15+ import numpy as np
16+
1517from . import conf , error , misc , parfile , phyvars , stagyyparsers , _step
1618from ._step import UNDETERMINED
1719
@@ -259,6 +261,43 @@ def at_step(self, istep):
259261 return self ._tseries .loc [istep ]
260262
261263
264+ class _RprofsAveraged (_step ._Rprofs ):
265+ """Radial profiles time-averaged over a :class:`_StepsView`.
266+
267+ The :attr:`_StepsView.rprofs_averaged` attribute is an instance of this
268+ class.
269+
270+ It implements the same interface as :class:`~stagpy._step._Rprofs` but
271+ returns time-averaged profiles instead.
272+
273+ Attributes:
274+ steps (:class:`_StepsView`): the object owning the
275+ :class:`_RprofsAveraged` instance
276+ """
277+
278+ def __init__ (self , steps ):
279+ self .steps = steps .filter (rprofs = True )
280+ self ._cached_data = {}
281+ super ().__init__ (next (iter (self .steps )))
282+
283+ def __getitem__ (self , name ):
284+ # the averaging method has two shortcomings:
285+ # - does not take into account time changing geometry;
286+ # - does not take into account time changing timestep.
287+ if name in self ._cached_data :
288+ return self ._cached_data [name ]
289+ steps_iter = iter (self .steps )
290+ rprof , rad , meta = next (steps_iter ).rprofs [name ]
291+ rprof = np .copy (rprof )
292+ nprofs = 1
293+ for step in steps_iter :
294+ nprofs += 1
295+ rprof += step .rprofs [name ].values
296+ rprof /= nprofs
297+ self ._cached_data [name ] = _step .Rprof (rprof , rad , meta )
298+ return self ._cached_data [name ]
299+
300+
262301class _Steps :
263302 """Collections of time steps.
264303
@@ -494,6 +533,7 @@ class _StepsView:
494533 def __init__ (self , steps_col , items ):
495534 self ._col = steps_col
496535 self ._items = items
536+ self ._rprofs_averaged = None
497537 self ._flt = {
498538 'snap' : False ,
499539 'rprofs' : False ,
@@ -502,6 +542,12 @@ def __init__(self, steps_col, items):
502542 }
503543 self ._dflt_func = self ._flt ['func' ]
504544
545+ @property
546+ def rprofs_averaged (self ):
547+ if self ._rprofs_averaged is None :
548+ self ._rprofs_averaged = _RprofsAveraged (self )
549+ return self ._rprofs_averaged
550+
505551 def __repr__ (self ):
506552 rep = repr (self ._col )
507553 items = []
0 commit comments