Source code for pylawr.transform.memorymixin
#!/bin/env python
# -*- coding: utf-8 -*-
# system modules
import logging
import abc
import datetime
# external modules
import numpy as np
import xarray as xr
logger = logging.getLogger(__name__)
[docs]class MemoryMixin(abc.ABC):
"""
Abstract base class for dynamic filters (e.g. static clutter or noise is
dependent of the recent states)
"""
def __init__(self):
self._trainable_vars = ()
[docs] def reset(self):
"""
Reset the trainable values of this filter. The trainable values will
be set to their default value.
"""
for var in self._trainable_vars:
setattr(self, var, None)
logger.warning(
'The filter {0:s} is reset!'.format(self.__class__.__name__)
)
[docs] @abc.abstractmethod
def fit(self, *args, **kwargs):
"""
Fit the filter to a new state
"""
pass
[docs] def set_xr_params(self, ds):
"""
The parameters from an xarray dataset are read and converted into
attributes of this filter.
Parameters
----------
ds : xarray.Dataset
the filter parameters
"""
for var in ds.variables:
setattr(self, var, ds[var].values)
[docs] @classmethod
def from_xarray(cls, ds):
"""
Create a filter from a given parameters dataset.
Parameters
----------
ds : :any:`xarray.Dataset`
a filter parameters dataset
Returns
-------
Filter
the filter with the specified parameters
"""
f = cls()
f.set_xr_params(ds)
return f
[docs] @abc.abstractmethod
def to_xarray(self):
"""
Serialize this filter's parameters to an :any:`xarray.Dataset`
Returns
-------
:any:`xarray.Dataset`
the filter's parameters as dataset
"""
pass
@property
@abc.abstractmethod
def fitted(self):
pass
[docs] @staticmethod
def _get_time(array, time_obj=None):
"""
Get the time from array or given time_obj.
Parameters
----------
array: array-like
The **linear** reflectivity :math:`Z`
time_obj : datetime.datetime, numpy.datetime64 or None
The time ``array`` was recorded. If None, the time will be
determined from ``array.time``, if available, otherwise it will be
set to :any:`datetime.datetime.now`. Default is None.
Returns
-------
time_obj : numpy.datetime64
The time from given time_obj or determined automatically as
numpy.datetime64 object.
"""
logger.debug("Determining the time of this reflectivity dataarray")
if time_obj is None:
try:
time_obj = array.time.values[0]
assert time_obj.size == 1
logger.debug("Using the dataarray's 'time' attribute value")
except IndexError:
time_obj = array.time.values
except (AttributeError, AssertionError):
time_obj = datetime.datetime.now()
logger.debug("Dataarray has no 'time' attribute. Using current "
"system time.")
elif not isinstance(time_obj, (datetime.datetime, np.datetime64)):
raise TypeError(
'The given time object needs to be `datetime.datetime`, '
'`numpy.datetime64` or None!'
)
time_obj = np.datetime64(time_obj)
return time_obj