Source code for visions.types.float

from typing import Sequence

import pandas.api.types as pdt
import numpy as np
import pandas as pd

from visions.relations import IdentityRelation, InferenceRelation, TypeRelation
from visions.types import VisionsBaseType
from visions.utils.coercion import test_utils
from visions.utils.warning_handling import suppress_warnings


def test_string_is_float(series) -> bool:
    coerced_series = test_utils.option_coercion_evaluator(string_to_float)(series)
    return coerced_series is not None and coerced_series in Float


def string_to_float(series: pd.Series) -> pd.Series:
    # Slightly faster to check for the character if it's not present than to
    # attempt the replacement
    # if any("," in x for x in series.dropna()):
    #     series = series.str.replace(",", "")

    return to_float(series)


def test_is_float(series: pd.Series) -> bool:
    coerced_series = test_utils.option_coercion_evaluator(to_float)(series)
    return coerced_series is not None and coerced_series in Float


def to_float(series: pd.Series) -> pd.Series:
    return series.astype(float)


def _get_relations(cls) -> Sequence[TypeRelation]:
    from visions.types import Generic, String, Complex

    relations = [
        IdentityRelation(cls, Generic),
        InferenceRelation(
            cls, String, relationship=test_string_is_float, transformer=string_to_float
        ),
        InferenceRelation(
            cls,
            Complex,
            relationship=lambda s: all(np.imag(s.values) == 0),
            transformer=suppress_warnings(to_float),
        ),
    ]
    return relations


[docs]class Float(VisionsBaseType): """**Float** implementation of :class:`visions.types.type.VisionsBaseType`. Examples: >>> x = pd.Series([1.0, 2.5, 5.0, np.nan]) >>> x in visions.Float True """ @classmethod def get_relations(cls) -> Sequence[TypeRelation]: return _get_relations(cls) @classmethod def contains_op(cls, series: pd.Series) -> bool: return pdt.is_float_dtype(series)