Source code for lories.components.component

# -*- coding: utf-8 -*-
"""
lories.components.component
~~~~~~~~~~~~~~~~~~~~~~~~~~~


"""

from __future__ import annotations

from typing import Any, Dict, Optional

import pandas as pd
from lories._core._component import _Component  # noqa
from lories._core._configurations import Configurations  # noqa
from lories._core._registrator import RegistratorContext  # noqa
from lories._core.typing import Timestamp  # noqa
from lories.components.access import ComponentAccess
from lories.connectors.access import ConnectorAccess
from lories.core.activator import Activator
from lories.core.register import Registrator
from lories.data.access import DataAccess
from lories.data.converters import ConverterAccess
from lories.util import to_date


[docs] class Component(_Component, Registrator, Activator): __converters: ConverterAccess __connectors: ConnectorAccess __components: ComponentAccess __data: DataAccess def __init__( self, context: RegistratorContext, configs: Optional[Configurations] = None, **kwargs, ) -> None: super().__init__(context=context, configs=configs, **kwargs) self.__converters = ConverterAccess(self) self.__connectors = ConnectorAccess(self) self.__components = ComponentAccess(self) self.__data = DataAccess(self) def _at_configure(self, configs: Configurations) -> None: self.__data.configure(configs.get_member(DataAccess.TYPE, ensure_exists=True)) def _on_configure(self, configs: Configurations) -> None: self.__converters.load(configure=False, sort=False) self.__converters.sort() self.__converters.configure() self.__connectors.load(configure=False, sort=False) self.__connectors.sort() self.__connectors.configure() self.__components.load(configure=False, sort=False) self.__components.sort() self.__components.configure() self.__data.load() def _at_duplicate(self, **changes) -> None: self.__converters.duplicate(**changes) self.__connectors.duplicate(**changes) self.__components.duplicate(**changes) @property def components(self) -> ComponentAccess: return self.__components @property def converters(self) -> ConverterAccess: return self.__converters @property def connectors(self) -> ConnectorAccess: return self.__connectors @property def data(self) -> DataAccess: return self.__data def get( self, start: Optional[Timestamp | str] = None, end: Optional[Timestamp | str] = None, **kwargs, ) -> pd.DataFrame: start = to_date(start) end = to_date(end) data = self.__data.to_frame(unique=False) if data.empty or (start is not None and start < data.index[0]) or (end is not None and end > data.index[-1]): logged = self.__data.from_logger(start=start, end=end, unique=False) if not logged.empty: data = logged if data.empty else data.combine_first(logged) return self._get_range(data, start, end, **kwargs) @staticmethod def _get_range( data: pd.DataFrame, start: Optional[Timestamp | str] = None, end: Optional[Timestamp | str] = None, **kwargs, ) -> pd.DataFrame: if data.empty: return data if start is not None: start = to_date(start, **kwargs) data = data[data.index >= start] if end is not None: end = to_date(end, **kwargs) data = data[data.index <= end] return data # noinspection PyShadowingBuiltins def _get_vars(self) -> Dict[str, Any]: vars = super()._get_vars() vars.pop("type", None) return vars