Source code for genno.compat.pandas

import logging
from collections.abc import Iterator
from contextlib import contextmanager
from functools import cache

from packaging.version import Version, parse

__all__ = [
    "disable_copy_on_write",
    "handles_parquet_attrs",
    "manager_classes",
    "version",
]

log = logging.getLogger(__name__)


[docs] @cache def version() -> Version: """Return the version of :mod:`pandas` as a :class:`packaging.version.Version`.""" import pandas return parse(pandas.__version__)
[docs] @contextmanager def disable_copy_on_write(name: str) -> Iterator[None]: """Context manager to disable Pandas :ref:`pandas:copy_on_write`. A message is logged with level :any:`logging.DEBUG` if the setting is changed. The fixture has no effect in pandas 3.0.0 and later, in which the option is always enabled. """ import pandas cow = "mode.copy_on_write" was_enabled = version() < Version("3") and pandas.get_option(cow) if was_enabled: log.debug(f"Override pandas.options.{cow} = True for {name}") pandas.set_option(cow, False if Version("2.2") <= version() else "warn") try: yield finally: if was_enabled: pandas.set_option(cow, True)
[docs] @cache def handles_parquet_attrs() -> bool: """Return :any:`True` if :mod:`pandas` can read/write attrs to/from Parquet files. If not, a message is logged. """ if version() < Version("2.1.0"): log.info( f"Pandas {version()!s} < 2.1.0 cannot read/write Quantity.attrs " f"to/from Parquet; {__name__} will use pickle from the standard library" ) return False else: return True
[docs] @cache def manager_classes() -> tuple[type, ...]: """Pandas class(es) for which a fast-path :py:`pd.Series.__init__()` can be used.""" if version() < Version("3"): from pandas.core.internals.base import DataManager return (DataManager,) else: from pandas.core.internals.managers import SingleBlockManager return (SingleBlockManager,)