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)))