From 4dca3f812bc7e51e64a023a2672a421e09ce6089 Mon Sep 17 00:00:00 2001 From: jreback Date: Fri, 31 Jan 2014 09:44:39 -0500 Subject: [PATCH] BUG: bug in nanops.var with ddof=1 and 1 elements would sometimes return inf rather than nan on some platforms (GH6136) --- doc/source/release.rst | 2 ++ pandas/core/nanops.py | 15 +++++++++++++-- pandas/tests/test_series.py | 8 ++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index b9115c79354a6..b194bff2ece59 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -177,6 +177,8 @@ Bug Fixes - Consistency with dtypes in setting an empty DataFrame (:issue:`6171`) - Bug in selecting on a multi-index ``HDFStore`` even in the prescence of under specificed column spec (:issue:`6169`) + - Bug in ``nanops.var`` with ``ddof=1`` and 1 elements would sometimes return ``inf`` + rather than ``nan`` on some platforms (:issue:`6136`) pandas 0.13.0 ------------- diff --git a/pandas/core/nanops.py b/pandas/core/nanops.py index 2722905bf49c0..636532bc5fbf9 100644 --- a/pandas/core/nanops.py +++ b/pandas/core/nanops.py @@ -302,14 +302,25 @@ def nanvar(values, axis=None, skipna=True, ddof=1): else: count = float(values.size - mask.sum()) + d = count-ddof if skipna: values = values.copy() np.putmask(values, mask, 0) + # always return NaN, never inf + if np.isscalar(count): + if count <= ddof: + count = np.nan + d = np.nan + else: + mask = count <= ddof + if mask.any(): + np.putmask(d, mask, np.nan) + np.putmask(count, mask, np.nan) + X = _ensure_numeric(values.sum(axis)) XX = _ensure_numeric((values ** 2).sum(axis)) - return np.fabs((XX - X ** 2 / count) / (count - ddof)) - + return np.fabs((XX - X ** 2 / count) / d) @bottleneck_switch() def nanmin(values, axis=None, skipna=True): diff --git a/pandas/tests/test_series.py b/pandas/tests/test_series.py index d31717ec8c165..00f1b826303c9 100644 --- a/pandas/tests/test_series.py +++ b/pandas/tests/test_series.py @@ -1832,6 +1832,14 @@ def test_var_std(self): expected = np.var(self.ts.values, ddof=4) assert_almost_equal(result, expected) + # 1 - element series with ddof=1 + s = self.ts.iloc[[0]] + result = s.var(ddof=1) + self.assert_(isnull(result)) + + result = s.std(ddof=1) + self.assert_(isnull(result)) + def test_skew(self): _skip_if_no_scipy()