geowatch.tasks.fusion.datamodules.temporal_sampling.utils module¶
- geowatch.tasks.fusion.datamodules.temporal_sampling.utils.guess_missing_unixtimes(unixtimes, assume_delta=86400)[source]¶
Hueristic solution to fill in missing time values via interpolation / extrapolation.
To succesfully interpolate nan values must be between two non-nan values. In all other cases we have to make an assumption about the timedelta between frames, which can be specified and is one day by default.
- Parameters:
unixtimes (ndarray) – numpy array of numeric unix timestamps that may contain nan values.
assume_delta (float) – The fallback delta between timesteps when surrounding context is unavailable. Defaults to 86400 seconds - i.e. 1 day.
- Returns:
The same array, but nan values are filled with interpolated or extrapolated values.
- Return type:
ndarray
Example
>>> from geowatch.tasks.fusion.datamodules.temporal_sampling.utils import * # NOQA >>> import ubelt as ub >>> cases = [ >>> np.array([np.nan, np.nan, np.nan, np.nan, np.nan]), >>> np.array([np.nan, 20, 30, np.nan, np.nan]), >>> np.array([0, np.nan, np.nan, np.nan, 10]), >>> np.array([np.nan, np.nan, 9001, np.nan, np.nan]), >>> np.array([1, 2, 3, 4, 5]), >>> np.array([1, 2, np.nan, 4, 5]), >>> ] >>> for case_ in cases: >>> unixtimes = case_ >>> print('case_ = {}'.format(ub.urepr(case_, nl=1))) >>> guess = guess_missing_unixtimes(unixtimes) >>> print('guess = {}'.format(ub.urepr(guess, nl=1)))
- geowatch.tasks.fusion.datamodules.temporal_sampling.utils.coerce_time_kernel(pattern)[source]¶
Obtain a time kernel from user input
- Parameters:
pattern (str | Iterable[str | Number]) – A string code or a iterable of time coercable time deltas in ascending order. A pattern code is a ‘,’ separated string of coercable time deltas.
- Returns:
ascending timedelta offsets in seconds
- Return type:
ndarray
Example
>>> from geowatch.tasks.fusion.datamodules.temporal_sampling.utils import * # NOQA >>> import ubelt as ub >>> valid_patterns = [ >>> '-1y,-30d,-1d,0,1d,30d,1y', >>> '-60s,0s,60s', >>> '-1d,-60s,20s,60s,1d', >>> '1,1,1,1,1', >>> '(1,1,1,1,1)', >>> ] >>> for pattern in valid_patterns: >>> kernel = coerce_time_kernel(pattern) >>> assert np.all(kernel == coerce_time_kernel(pattern)), 'should be idempotent' >>> print('kernel = {}'.format(ub.urepr(kernel.tolist(), nl=0))) kernel = [-31536000.0, -2592000.0, -86400.0, 0.0, 86400.0, 2592000.0, 31536000.0] kernel = [-60.0, 0.0, 60.0] kernel = [-86400.0, -60.0, 20.0, 60.0, 86400.0] kernel = [1.0, 1.0, 1.0, 1.0, 1.0] kernel = [1.0, 1.0, 1.0, 1.0, 1.0] >>> import pytest >>> invalid_patterns = [ >>> '3s,2s,1s' >>> '-10,5,3,-2,0,1' >>> ] >>> for pattern in invalid_patterns: >>> with pytest.raises(ValueError): >>> kernel = coerce_time_kernel(pattern) >>> with pytest.raises(TypeError): >>> coerce_time_kernel(3.14)
- geowatch.tasks.fusion.datamodules.temporal_sampling.utils.coerce_multi_time_kernel(pattern)[source]¶
Obtain a list of time kernels from user input.
Example
>>> from geowatch.tasks.fusion.datamodules.temporal_sampling.utils import * # NOQA >>> import ubelt as ub >>> valid_patterns = [ >>> '(-1d,0,1d),(1,2)', >>> '1,1,1', >>> '(1,1,1,1,1)', >>> ['-1,0,+1', '0'], >>> ] >>> for pattern in valid_patterns: >>> multi_kernel = coerce_multi_time_kernel(pattern) >>> recon = coerce_multi_time_kernel(multi_kernel) >>> a = [r.tolist() for r in recon] >>> b = [r.tolist() for r in multi_kernel] >>> assert a == b, 'should be idempotent' >>> print('multi_kernel = {}'.format(ub.urepr(multi_kernel, nl=1))) multi_kernel = [ np.array([-86400., 0., 86400.], dtype=np.float64), np.array([1., 2.], dtype=np.float64), ] multi_kernel = [ np.array([1., 1., 1.], dtype=np.float64), ] multi_kernel = [ np.array([1., 1., 1., 1., 1.], dtype=np.float64), ] multi_kernel = [ np.array([-1., 0., 1.], dtype=np.float64), np.array([0.], dtype=np.float64), ]
Example
>>> from geowatch.tasks.fusion.datamodules.temporal_sampling.utils import * # NOQA >>> import ubelt as ub >>> pattern = ('-3y', '-2.5y', '-2y', '-1.5y', '-1y', 0, '1y', '1.5y', '2y', '2.5y', '3y') >>> multi_kernel = coerce_multi_time_kernel(pattern) >>> print('multi_kernel = {}'.format(ub.urepr(multi_kernel, nl=2)))
>>> # FIXME: Bug ambigous case >>> pattern = ('-3y', '-2.5y', '-2y', '-1.5y', '-1y', '0', '1y', '1.5y', '2y', '2.5y', '3y') >>> multi_kernel = coerce_multi_time_kernel(pattern) >>> print('multi_kernel = {}'.format(ub.urepr(multi_kernel, nl=2)))