| # Authors: The scikit-learn developers | |
| # SPDX-License-Identifier: BSD-3-Clause | |
| 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 | |