66 lines
1.4 KiB
Python
66 lines
1.4 KiB
Python
|
import math
|
||
|
import numbers
|
||
|
from contextlib import suppress
|
||
|
|
||
|
|
||
|
def is_scalar_nan(x):
|
||
|
"""Test if x is NaN.
|
||
|
|
||
|
This function is meant to overcome the issue that np.isnan does not allow
|
||
|
non-numerical types as input, and that np.nan is not float('nan').
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
x : any type
|
||
|
Any scalar value.
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
bool
|
||
|
Returns true if x is NaN, and false otherwise.
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
>>> import numpy as np
|
||
|
>>> from sklearn.utils._missing import is_scalar_nan
|
||
|
>>> is_scalar_nan(np.nan)
|
||
|
True
|
||
|
>>> is_scalar_nan(float("nan"))
|
||
|
True
|
||
|
>>> is_scalar_nan(None)
|
||
|
False
|
||
|
>>> is_scalar_nan("")
|
||
|
False
|
||
|
>>> is_scalar_nan([np.nan])
|
||
|
False
|
||
|
"""
|
||
|
return (
|
||
|
not isinstance(x, numbers.Integral)
|
||
|
and isinstance(x, numbers.Real)
|
||
|
and math.isnan(x)
|
||
|
)
|
||
|
|
||
|
|
||
|
def is_pandas_na(x):
|
||
|
"""Test if x is pandas.NA.
|
||
|
|
||
|
We intentionally do not use this function to return `True` for `pd.NA` in
|
||
|
`is_scalar_nan`, because estimators that support `pd.NA` are the exception
|
||
|
rather than the rule at the moment. When `pd.NA` is more universally
|
||
|
supported, we may reconsider this decision.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
x : any type
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
boolean
|
||
|
"""
|
||
|
with suppress(ImportError):
|
||
|
from pandas import NA
|
||
|
|
||
|
return x is NA
|
||
|
|
||
|
return False
|