Source code for dispel.processing.level_filters
"""Filters used to process specific levels."""
from typing import Iterable, Set
from dispel.data.levels import Level
from dispel.processing.level import LevelFilter
[docs]
class DurationFilter(LevelFilter):
    """A level filter to fetch level less than a given duration."""
[docs]
    def __init__(self, max_duration: float):
        self.max_duration = max_duration 
[docs]
    def repr(self) -> str:
        """Get representation of the filter."""
        return f"Level with a duration < {self.max_duration} seconds." 
[docs]
    def filter(self, levels: Iterable[Level]) -> Set[Level]:
        """Keep all levels with duration less than max_duration."""
        out = set()
        for level in levels:
            if level.duration.total_seconds() < self.max_duration:
                out.add(level)
        return out 
 
[docs]
class AbsentDataSetFilter(LevelFilter):
    """Filter out levels with absent data set ids."""
[docs]
    def __init__(self, data_set_id: str):
        self.data_set_id = data_set_id 
[docs]
    def repr(self):
        """Get representation of the filter."""
        return f"only levels with {self.data_set_id}>" 
[docs]
    def filter(self, levels: Iterable[Level]) -> Set[Level]:
        """Filter levels missing the specified data set id."""
        return set(filter(lambda x: x.has_raw_data_set(self.data_set_id), levels)) 
 
[docs]
class NotEmptyDatasetFilter(LevelFilter):
    """Filter out levels without the dataset or with empty dataset."""
[docs]
    def __init__(self, data_set_id: str):
        self.data_set_id = data_set_id 
[docs]
    def repr(self):
        """Get representation of the filter."""
        return f"only levels with dataset {self.data_set_id} and that is notempty." 
[docs]
    def filter(self, levels: Iterable[Level]) -> Set[Level]:
        """Filter levels missing a dataset or with empty dataset."""
        not_empty_levels = filter(
            lambda x: x.has_raw_data_set(self.data_set_id), levels
        )
        return set(
            filter(
                lambda x: len(x.get_raw_data_set(self.data_set_id).data) > 0,
                not_empty_levels,
            )
        ) 
 
[docs]
class LastLevelFilter(LevelFilter):
    """A level filter to process only the last level."""
[docs]
    def repr(self) -> str:
        """Get representation of the filter."""
        return "last level" 
[docs]
    def filter(self, levels: Iterable[Level]) -> Set[Level]:
        """Keep last level."""
        last_level = None
        out = set()
        for level in levels:
            last_level = level
        if last_level:
            out.add(last_level)
        return out 
 
[docs]
class NotEmptyDataSetFilter(LevelFilter):
    """Filter out levels with empty data set."""
[docs]
    def __init__(self, data_set_id: str):
        self.data_set_id = data_set_id 
[docs]
    def repr(self):
        """Get representation of the filter."""
        return f"only level with not empty {self.data_set_id}>" 
[docs]
    def filter(self, levels: Iterable[Level]) -> Set[Level]:
        """Filter levels with empty dataset."""
        return set(
            filter(lambda x: len(x.get_raw_data_set(self.data_set_id).data) > 0, levels)
        )