Source code for compressed_lists.biocframe_list
from typing import List, Optional, Sequence, Union
import biocutils as ut
from biocframe import BiocFrame
from .base import CompressedList
from .partition import Partitioning
from .split_generic import _generic_register_helper, splitAsCompressedList
__author__ = "Jayaram Kancherla"
__copyright__ = "Jayaram Kancherla"
__license__ = "MIT"
[docs]
class CompressedBiocFrameList(CompressedList):
"""CompressedList for BiocFrames."""
[docs]
def __init__(
self,
unlist_data: BiocFrame,
partitioning: Partitioning,
element_metadata: Optional[dict] = None,
metadata: Optional[dict] = None,
**kwargs,
):
"""Initialize a CompressedBiocFrameList.
Args:
unlist_data:
BiocFrame object.
partitioning:
Partitioning object defining element boundaries.
element_metadata:
Optional metadata for elements.
metadata:
Optional general metadata.
kwargs:
Additional arguments.
"""
if not isinstance(unlist_data, BiocFrame):
raise TypeError("'unlist_data' is not a `BiocFrame` object.")
super().__init__(
unlist_data, partitioning, element_type="BiocFrame", element_metadata=element_metadata, metadata=metadata
)
[docs]
@classmethod
def from_list(
cls, lst: List[BiocFrame], names: Optional[Sequence[str]] = None, metadata: Optional[dict] = None
) -> "CompressedBiocFrameList":
"""Create a `CompressedBiocFrameList` from a regular list.
This concatenates the list of `BiocFrame` objects.
Args:
lst:
List of `BiocFrame` objects.
names:
Optional names for list elements.
metadata:
Optional metadata.
Returns:
A new `CompressedList`.
"""
unlist_data = ut.relaxed_combine_rows(*lst)
partitioning = Partitioning.from_list(lst, names)
return cls(unlist_data, partitioning, metadata=metadata)
[docs]
def __getitem__(self, key: Union[int, str, slice]):
"""Override to handle column extraction using `splitAsCompressedList`."""
if isinstance(key, str):
column_data = self._unlist_data.get_column(key)
return splitAsCompressedList(
column_data, groups_or_partitions=self._partitioning, names=self.names, metadata=self.metadata
)
else:
return super().__getitem__(key)
@splitAsCompressedList.register
def _(
data: BiocFrame,
groups_or_partitions: Union[list, Partitioning],
names: Optional[Sequence[str]] = None,
metadata: Optional[dict] = None,
) -> CompressedBiocFrameList:
"""Handle lists of BiocFrame objects."""
partitioned_data, groups_or_partitions = _generic_register_helper(
data=data, groups_or_partitions=groups_or_partitions, names=names
)
if not isinstance(partitioned_data, BiocFrame):
partitioned_data = ut.relaxed_combine_rows(*partitioned_data)
return CompressedBiocFrameList(unlist_data=partitioned_data, partitioning=groups_or_partitions, metadata=metadata)