Source code for meerkat.block.ref

from __future__ import annotations

from typing import TYPE_CHECKING, Mapping, Sequence, Union

if TYPE_CHECKING:
    from meerkat.block.abstract import AbstractBlock
    from meerkat.columns.abstract import AbstractColumn


[docs]class BlockRef(Mapping): def __init__(self, columns: Mapping[str, AbstractColumn], block: AbstractBlock): self.columns: Mapping[str, AbstractColumn] = columns self.block: AbstractBlock = block def __getitem__(self, index: Union[str, Sequence[str]]): if isinstance(index, str): return self.columns[index] else: return self.__class__( columns={col: self.columns[col].view() for col in index}, block=self.block, ) def __delitem__(self, key): self.columns.pop(key) def __len__(self): return len(self.columns) def __contains__(self, value): return value in self.columns def __iter__(self): return iter(self.columns) @property def block_indices(self): return {name: col._block_index for name, col in self.columns.items()}
[docs] def apply(self, method_name: str = "_get", *args, **kwargs): # apply method to the block return getattr(self.block, method_name)(*args, **kwargs, block_ref=self)
[docs] def update(self, block_ref: BlockRef): if id(block_ref.block) != id(self.block): raise ValueError( "Can only update BlockRef with another BlockRef pointing " "to the same block." ) self.columns.update(block_ref.columns)