def _get_result_dtype(self, dtype: DtypeObj) -> DtypeObj: """ Get the desired dtype of a result based on the input dtype and how it was computed. Parameters ---------- dtype : np.dtype or ExtensionDtype Input dtype. Returns ------- np.dtype or ExtensionDtype The desired dtype of the result. """ how = self.how if how in ["add", "cumsum", "sum", "prod"]: if dtype == np.dtype(bool): return np.dtype(np.int64) elif isinstance(dtype, (BooleanDtype, IntegerDtype)): return Int64Dtype() elif how in ["mean", "median", "var"]: if isinstance(dtype, (BooleanDtype, IntegerDtype)): return Float64Dtype() elif is_float_dtype(dtype) or is_complex_dtype(dtype): return dtype elif is_numeric_dtype(dtype): return np.dtype(np.float64) return dtype
def test_to_array_dtype_keyword(): result = pd.array([1, 2], dtype="Float32") assert result.dtype == Float32Dtype() # if values has dtype -> override it result = pd.array(np.array([1, 2], dtype="float32"), dtype="Float64") assert result.dtype == Float64Dtype()
def get_result_dtype(self, dtype: DtypeObj) -> DtypeObj: """ Get the desired dtype of a result based on the input dtype and how it was computed. Parameters ---------- dtype : np.dtype or ExtensionDtype Input dtype. Returns ------- np.dtype or ExtensionDtype The desired dtype of the result. """ from pandas.core.arrays.boolean import BooleanDtype from pandas.core.arrays.floating import Float64Dtype from pandas.core.arrays.integer import ( Int64Dtype, _IntegerDtype, ) how = self.how if how in ["add", "cumsum", "sum", "prod"]: if dtype == np.dtype(bool): return np.dtype(np.int64) elif isinstance(dtype, (BooleanDtype, _IntegerDtype)): return Int64Dtype() elif how in ["mean", "median", "var"] and isinstance( dtype, (BooleanDtype, _IntegerDtype)): return Float64Dtype() return dtype
def test_to_array_inferred_dtype(): # if values has dtype -> respect it result = pd.array(np.array([1, 2], dtype="float32")) assert result.dtype == Float32Dtype() # if values have no dtype -> always float64 result = pd.array([1.0, 2.0]) assert result.dtype == Float64Dtype()
def test_to_array_integer(): result = pd.array([1, 2], dtype="Float64") expected = pd.array([1.0, 2.0], dtype="Float64") tm.assert_extension_array_equal(result, expected) # for integer dtypes, the itemsize is not preserved # TODO can we specify "floating" in general? result = pd.array(np.array([1, 2], dtype="int32"), dtype="Float64") assert result.dtype == Float64Dtype()
def test_uses_pandas_na(): a = pd.array([1, None], dtype=Float64Dtype()) assert a[1] is pd.NA
def test_to_array_integer(): result = pd.array([1, 2], dtype="Float64") expected = pd.array([1.0, 2.0], dtype="Float64") tm.assert_extension_array_equal(result, expected) # for integer dtypes, the itemsize is not preserved # TODO can we specify "floating" in general? result = pd.array(np.array([1, 2], dtype="int32"), dtype="Float64") assert result.dtype == Float64Dtype() @pytest.mark.parametrize( "bool_values, values, target_dtype, expected_dtype", [ ([False, True], [0, 1], Float64Dtype(), Float64Dtype()), ([False, True], [0, 1], "Float64", Float64Dtype()), ([False, True, np.nan], [0, 1, np.nan ], Float64Dtype(), Float64Dtype()), ], ) def test_to_array_bool(bool_values, values, target_dtype, expected_dtype): result = pd.array(bool_values, dtype=target_dtype) assert result.dtype == expected_dtype expected = pd.array(values, dtype=target_dtype) tm.assert_extension_array_equal(result, expected) def test_series_from_float(data): # construct from our dtype & string dtype dtype = data.dtype
import pytest import pandas as pd from pandas.core.arrays.floating import Float32Dtype, Float64Dtype def test_dtypes(dtype): # smoke tests on auto dtype construction np.dtype(dtype.type).kind == "f" assert dtype.name is not None @pytest.mark.parametrize( "dtype, expected", [(Float32Dtype(), "Float32Dtype()"), (Float64Dtype(), "Float64Dtype()")], ) def test_repr_dtype(dtype, expected): assert repr(dtype) == expected def test_repr_array(): result = repr(pd.array([1.0, None, 3.0])) expected = "<FloatingArray>\n[1.0, <NA>, 3.0]\nLength: 3, dtype: Float64" assert result == expected def test_repr_array_long(): data = pd.array([1.0, 2.0, None] * 1000) expected = """<FloatingArray> [ 1.0, 2.0, <NA>, 1.0, 2.0, <NA>, 1.0, 2.0, <NA>, 1.0,