Source code for macrosynergy.management.types.qdf.base
"""
Module hosting custom types and meta-classes for use across the package.
"""
from typing import List
import pandas as pd
[docs]class QuantamentalDataFrameMeta(type):
"""
Metaclass to support type checks for `QuantamentalDataFrame`.
"""
IndexCols: List[str] = ["real_date", "cid", "xcat"]
_StrIndexCols: List[str] = ["cid", "xcat"]
def __instancecheck__(cls, instance):
IDX_COLS = QuantamentalDataFrameMeta.IndexCols
try:
# the try except offers a safety net in case the instance is not a
# pd.DataFrame and one of the checks raises an error
result = isinstance(instance, pd.DataFrame)
result = result and instance.index.name is None
result = result and not isinstance(instance.columns, pd.MultiIndex)
result = result and all([col in instance.columns for col in IDX_COLS])
result = result and len(instance.columns) > len(IDX_COLS)
result = result and len(instance.columns) == len(set(instance.columns))
datetypestr = str(instance["real_date"].dtype)
is_valid_dt64 = (datetypestr in ["datetime64[ns]", "datetime64[ms]"]) or (
datetypestr.startswith("datetime64[") and datetypestr.endswith("]")
)
correct_date_type: bool = (
is_valid_dt64
or isinstance(instance["real_date"].dtype, pd.DatetimeTZDtype)
or instance.empty
)
result = result and correct_date_type
except: # noqa
result: bool = False
finally:
return result
[docs]class QuantamentalDataFrameBase(pd.DataFrame, metaclass=QuantamentalDataFrameMeta):
"""
Base class to extend `pd.DataFrame` for Quantamental DataFrames. This class is a
parent class to macrosynergy.types.QuantamentalDataFrame.
"""
IndexCols: List[str] = ["real_date", "cid", "xcat"]
_StrIndexCols: List[str] = ["cid", "xcat"]
IndexColsSortOrder = ["cid", "xcat", "real_date"]