diff --git a/mlair/data_handler/data_handler_mixed_sampling.py b/mlair/data_handler/data_handler_mixed_sampling.py index a389445e8af8db0559fd1bf8f3445475cb62082e..79e40424549a7c2e16c08f618e649f08984919fa 100644 --- a/mlair/data_handler/data_handler_mixed_sampling.py +++ b/mlair/data_handler/data_handler_mixed_sampling.py @@ -4,23 +4,17 @@ __date__ = '2020-11-05' from mlair.data_handler.data_handler_single_station import DataHandlerSingleStation from mlair.data_handler.data_handler_with_filter import DataHandlerFirFilterSingleStation, \ DataHandlerFilterSingleStation, DataHandlerClimateFirFilterSingleStation -# from mlair.data_handler.data_handler_with_filter import DataHandlerKzFilterSingleStation from mlair.data_handler.data_handler_with_filter import DataHandlerClimateFirFilter, DataHandlerFirFilter -# from mlair.data_handler.data_handler_with_filter import DataHandlerKzFilter from mlair.data_handler import DefaultDataHandler from mlair import helpers -from mlair.helpers import remove_items from mlair.configuration.defaults import DEFAULT_SAMPLING, DEFAULT_INTERPOLATION_LIMIT, DEFAULT_INTERPOLATION_METHOD from mlair.helpers.filter import filter_width_kzf import copy -import inspect -from typing import Callable import datetime as dt from typing import Any from functools import partial -import numpy as np import pandas as pd import xarray as xr @@ -113,6 +107,16 @@ class DataHandlerMixedSamplingWithFilterSingleStation(DataHandlerMixedSamplingSi def _check_sampling(self, **kwargs): assert kwargs.get("sampling") == ("hourly", "daily") + def apply_filter(self): + raise NotImplementedError + + def create_filter_index(self) -> pd.Index: + """Create name for filter dimension.""" + raise NotImplementedError + + def _create_lazy_data(self): + raise NotImplementedError + def make_input_target(self): """ A FIR filter is applied on the input data that has hourly resolution. Lables Y are provided as aggregated values @@ -160,36 +164,10 @@ class DataHandlerMixedSamplingWithFilterSingleStation(DataHandlerMixedSamplingSi self.input_data = self._slice_prep(_input_data, start_inp, end_inp) self.target_data = self._slice_prep(_target_data, self.start, self.end) -# -# class DataHandlerMixedSamplingWithKzFilterSingleStation(DataHandlerMixedSamplingWithFilterSingleStation, -# DataHandlerKzFilterSingleStation): -# _requirements1 = DataHandlerKzFilterSingleStation.requirements() -# _requirements2 = DataHandlerMixedSamplingWithFilterSingleStation.requirements() -# _requirements = list(set(_requirements1 + _requirements2)) -# -# def estimate_filter_width(self): -# """ -# f = 0.5 / (len * sqrt(itr)) -> T = 1 / f -# :return: -# """ -# return int(self.kz_filter_length[0] * np.sqrt(self.kz_filter_iter[0]) * 2) -# -# def _extract_lazy(self, lazy_data): -# _data, _meta, _input_data, _target_data, self.cutoff_period, self.cutoff_period_days, \ -# self.filter_dim_order = lazy_data -# super(__class__, self)._extract_lazy((_data, _meta, _input_data, _target_data)) -# -# -# class DataHandlerMixedSamplingWithKzFilter(DataHandlerKzFilter): -# """Data handler using mixed sampling for input and target. Inputs are temporal filtered.""" -# -# data_handler = DataHandlerMixedSamplingWithKzFilterSingleStation -# data_handler_transformation = DataHandlerMixedSamplingWithKzFilterSingleStation -# _requirements = list(set(data_handler.requirements() + DataHandlerKzFilter.requirements())) - class DataHandlerMixedSamplingWithFirFilterSingleStation(DataHandlerMixedSamplingWithFilterSingleStation, DataHandlerFirFilterSingleStation): + _requirements1 = DataHandlerFirFilterSingleStation.requirements() _requirements2 = DataHandlerMixedSamplingWithFilterSingleStation.requirements() _requirements = list(set(_requirements1 + _requirements2)) @@ -204,9 +182,17 @@ class DataHandlerMixedSamplingWithFirFilterSingleStation(DataHandlerMixedSamplin else: return max(self.filter_order) + def apply_filter(self): + DataHandlerFirFilterSingleStation.apply_filter() + + def create_filter_index(self, add_unfiltered_index=True) -> pd.Index: + return DataHandlerFirFilterSingleStation.create_filter_index(self, add_unfiltered_index=add_unfiltered_index) + def _extract_lazy(self, lazy_data): - _data, _meta, _input_data, _target_data, self.fir_coeff, self.filter_dim_order = lazy_data - super(__class__, self)._extract_lazy((_data, _meta, _input_data, _target_data)) + DataHandlerFirFilterSingleStation._extract_lazy(self, lazy_data) + + def _create_lazy_data(self): + return DataHandlerFirFilterSingleStation._create_lazy_data(self) @staticmethod def _get_fs(**kwargs): diff --git a/mlair/data_handler/data_handler_with_filter.py b/mlair/data_handler/data_handler_with_filter.py index 1c72ed6e6aa1d6069d71f5a54dd0d9deadf173d3..93118bafa77004fbabf2020309bcad99c3c86e34 100644 --- a/mlair/data_handler/data_handler_with_filter.py +++ b/mlair/data_handler/data_handler_with_filter.py @@ -3,7 +3,6 @@ __author__ = 'Lukas Leufen' __date__ = '2020-08-26' -import inspect import copy import numpy as np import pandas as pd @@ -13,8 +12,7 @@ from functools import partial import logging from mlair.data_handler.data_handler_single_station import DataHandlerSingleStation from mlair.data_handler import DefaultDataHandler -from mlair.helpers import remove_items, to_list, TimeTrackingWrapper, statistics -from mlair.helpers.filter import KolmogorovZurbenkoFilterMovingWindow as KZFilter +from mlair.helpers import to_list, TimeTrackingWrapper, statistics from mlair.helpers.filter import FIRFilter, ClimateFIRFilter, omega_null_kzf # define a more general date type for type hinting @@ -223,7 +221,7 @@ class DataHandlerFirFilterSingleStation(DataHandlerFilterSingleStation): def _extract_lazy(self, lazy_data): _data, _meta, _input_data, _target_data, self.fir_coeff, self.filter_dim_order = lazy_data - super(__class__, self)._extract_lazy((_data, _meta, _input_data, _target_data)) + super()._extract_lazy((_data, _meta, _input_data, _target_data)) def transform(self, data_in, dim: Union[str, int] = 0, inverse: bool = False, opts=None, transformation_dim=None): @@ -310,68 +308,6 @@ class DataHandlerFirFilter(DataHandlerFilter): data_handler_transformation = DataHandlerFirFilterSingleStation _requirements = list(set(data_handler.requirements() + DataHandlerFilter.requirements())) -# -# class DataHandlerKzFilterSingleStation(DataHandlerFilterSingleStation): -# """Data handler for a single station to be used by a superior data handler. Inputs are kz filtered.""" -# -# _requirements = DataHandlerFilterSingleStation.requirements() -# _hash = DataHandlerFilterSingleStation._hash + ["kz_filter_length", "kz_filter_iter"] -# -# def __init__(self, *args, kz_filter_length, kz_filter_iter, **kwargs): -# self._check_sampling(**kwargs) -# # self.original_data = None # ToDo: implement here something to store unfiltered data -# self.kz_filter_length = to_list(kz_filter_length) -# self.kz_filter_iter = to_list(kz_filter_iter) -# self.cutoff_period = None -# self.cutoff_period_days = None -# super().__init__(*args, **kwargs) -# -# @TimeTrackingWrapper -# def apply_filter(self): -# """Apply kolmogorov zurbenko filter only on inputs.""" -# kz = KZFilter(self.input_data, wl=self.kz_filter_length, itr=self.kz_filter_iter, filter_dim=self.time_dim) -# filtered_data: List[xr.DataArray] = kz.run() -# self.cutoff_period = kz.period_null() -# self.cutoff_period_days = kz.period_null_days() -# self.input_data = xr.concat(filtered_data, pd.Index(self.create_filter_index(), name=self.filter_dim)) -# # this is just a code snippet to check the results of the kz filter -# # import matplotlib -# # matplotlib.use("TkAgg") -# # import matplotlib.pyplot as plt -# # self.input_data.sel(filter="74d", variables="temp", Stations="DEBW107").plot() -# # self.input_data.sel(variables="temp", Stations="DEBW107").plot.line(hue="filter") -# -# def create_filter_index(self) -> pd.Index: -# """ -# Round cut off periods in days and append 'res' for residuum index. -# -# Round small numbers (<10) to single decimal, and higher numbers to int. Transform as list of str and append -# 'res' for residuum index. -# """ -# index = np.round(self.cutoff_period_days, 1) -# f = lambda x: int(np.round(x)) if x >= 10 else np.round(x, 1) -# index = list(map(f, index.tolist())) -# index = list(map(lambda x: str(x) + "d", index)) + ["res"] -# self.filter_dim_order = index -# return pd.Index(index, name=self.filter_dim) -# -# def _create_lazy_data(self): -# return [self._data, self.meta, self.input_data, self.target_data, self.cutoff_period, self.cutoff_period_days, -# self.filter_dim_order] -# -# def _extract_lazy(self, lazy_data): -# _data, _meta, _input_data, _target_data, self.cutoff_period, self.cutoff_period_days, \ -# self.filter_dim_order = lazy_data -# super(__class__, self)._extract_lazy((_data, _meta, _input_data, _target_data)) -# -# -# class DataHandlerKzFilter(DataHandlerFilter): -# """Data handler using kz filtered data.""" -# -# data_handler = DataHandlerKzFilterSingleStation -# data_handler_transformation = DataHandlerKzFilterSingleStation -# _requirements = list(set(data_handler.requirements() + DataHandlerFilter.requirements())) -# class DataHandlerClimateFirFilterSingleStation(DataHandlerFirFilterSingleStation): """ diff --git a/mlair/helpers/helpers.py b/mlair/helpers/helpers.py index 679f5a28fc564d56cd6f3794ee8fe8e1877b2b4c..77be3e2c8edcd43207ac40f67370067826be064b 100644 --- a/mlair/helpers/helpers.py +++ b/mlair/helpers/helpers.py @@ -4,7 +4,6 @@ __date__ = '2019-10-21' import inspect import math -import sys import numpy as np import xarray as xr diff --git a/test/test_data_handler/test_data_handler_mixed_sampling.py b/test/test_data_handler/test_data_handler_mixed_sampling.py index 04ce8dc17fe18b1fddd38e42b8d6a464ea831e63..6a4f5da262e298ad0eb6993b3dd2adf76a742d6e 100644 --- a/test/test_data_handler/test_data_handler_mixed_sampling.py +++ b/test/test_data_handler/test_data_handler_mixed_sampling.py @@ -6,21 +6,15 @@ from mlair.data_handler.data_handler_mixed_sampling import DataHandlerMixedSampl DataHandlerMixedSamplingWithFirFilterSingleStation, DataHandlerMixedSamplingWithFirFilter, \ DataHandlerFirFilterSingleStation, DataHandlerMixedSamplingWithClimateFirFilterSingleStation, \ DataHandlerMixedSamplingWithClimateFirFilter -# from mlair.data_handler.data_handler_mixed_sampling import DataHandlerMixedSamplingWithKzFilter, \ -# DataHandlerMixedSamplingWithKzFilterSingleStation, DataHandlerSeparationOfScales, \ -# DataHandlerSeparationOfScalesSingleStation from mlair.data_handler.data_handler_with_filter import DataHandlerFilter, DataHandlerFilterSingleStation, \ DataHandlerClimateFirFilterSingleStation -# from mlair.data_handler.data_handler_with_filter import DataHandlerKzFilter, DataHandlerKzFilterSingleStation from mlair.data_handler.data_handler_single_station import DataHandlerSingleStation from mlair.data_handler.default_data_handler import DefaultDataHandler -from mlair.helpers import remove_items from mlair.configuration.defaults import DEFAULT_INTERPOLATION_METHOD from mlair.helpers.testing import get_all_args import pytest import mock -import inspect class TestDataHandlerMixedSampling: @@ -101,53 +95,18 @@ class TestDataHandlerMixedSamplingSingleStation: def test_setup_data_path(self): pass -# -# class TestDataHandlerMixedSamplingWithKzFilter: -# -# def test_data_handler(self): -# obj = object.__new__(DataHandlerMixedSamplingWithKzFilter) -# assert obj.data_handler.__qualname__ == DataHandlerMixedSamplingWithKzFilterSingleStation.__qualname__ -# -# def test_data_handler_transformation(self): -# obj = object.__new__(DataHandlerMixedSamplingWithKzFilter) -# assert obj.data_handler_transformation.__qualname__ == DataHandlerMixedSamplingWithKzFilterSingleStation.__qualname__ -# -# def test_requirements(self): -# -# reqs = get_all_args(DataHandlerFilter) -# obj = object.__new__(DataHandlerMixedSamplingWithKzFilter) -# assert sorted(obj.own_args()) == reqs -# reqs = get_all_args(DataHandlerFilter, DefaultDataHandler, DataHandlerKzFilterSingleStation, -# DataHandlerFilterSingleStation, DataHandlerSingleStation, remove=["self", "id_class"]) -# assert sorted(obj._requirements) == reqs -# assert sorted(obj.requirements()) == reqs -# -# -# class TestDataHandlerMixedSamplingWithKzFilterSingleStation: -# -# def test_requirements(self): -# -# reqs = get_all_args(DataHandlerMixedSamplingWithKzFilterSingleStation) -# obj = object.__new__(DataHandlerMixedSamplingWithKzFilterSingleStation) -# assert reqs == ["self"] -# assert sorted(obj.own_args()) == reqs -# reqs = get_all_args(DataHandlerKzFilterSingleStation, DataHandlerFilterSingleStation, DataHandlerSingleStation, -# remove="self") -# assert sorted(obj._requirements) == reqs -# assert sorted(obj.requirements()) == reqs -# -# -# class TestDataHandlerMixedSamplingWithFilterSingleStation: -# -# def test_requirements(self): -# -# reqs = get_all_args(DataHandlerMixedSamplingWithKzFilterSingleStation) -# obj = object.__new__(DataHandlerMixedSamplingWithFilterSingleStation) -# assert reqs == ["self"] -# assert sorted(obj.own_args()) == reqs -# reqs = get_all_args(DataHandlerFilterSingleStation, DataHandlerSingleStation, remove="self") -# assert sorted(obj._requirements) == reqs -# assert sorted(obj.requirements()) == reqs + +class TestDataHandlerMixedSamplingWithFilterSingleStation: + + def test_requirements(self): + + reqs = get_all_args(DataHandlerMixedSamplingWithFilterSingleStation) + obj = object.__new__(DataHandlerMixedSamplingWithFilterSingleStation) + assert reqs == ["self"] + assert sorted(obj.own_args()) == reqs + reqs = get_all_args(DataHandlerFilterSingleStation, DataHandlerSingleStation, remove="self") + assert sorted(obj._requirements) == reqs + assert sorted(obj.requirements()) == reqs class TestDataHandlerMixedSamplingWithFirFilter: