Skip to content

Commit 4dca3f8

Browse files
committed
BUG: bug in nanops.var with ddof=1 and 1 elements would sometimes return inf
rather than nan on some platforms (GH6136)
1 parent a2d5e53 commit 4dca3f8

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

doc/source/release.rst

+2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ Bug Fixes
177177
- Consistency with dtypes in setting an empty DataFrame (:issue:`6171`)
178178
- Bug in selecting on a multi-index ``HDFStore`` even in the prescence of under
179179
specificed column spec (:issue:`6169`)
180+
- Bug in ``nanops.var`` with ``ddof=1`` and 1 elements would sometimes return ``inf``
181+
rather than ``nan`` on some platforms (:issue:`6136`)
180182

181183
pandas 0.13.0
182184
-------------

pandas/core/nanops.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -302,14 +302,25 @@ def nanvar(values, axis=None, skipna=True, ddof=1):
302302
else:
303303
count = float(values.size - mask.sum())
304304

305+
d = count-ddof
305306
if skipna:
306307
values = values.copy()
307308
np.putmask(values, mask, 0)
308309

310+
# always return NaN, never inf
311+
if np.isscalar(count):
312+
if count <= ddof:
313+
count = np.nan
314+
d = np.nan
315+
else:
316+
mask = count <= ddof
317+
if mask.any():
318+
np.putmask(d, mask, np.nan)
319+
np.putmask(count, mask, np.nan)
320+
309321
X = _ensure_numeric(values.sum(axis))
310322
XX = _ensure_numeric((values ** 2).sum(axis))
311-
return np.fabs((XX - X ** 2 / count) / (count - ddof))
312-
323+
return np.fabs((XX - X ** 2 / count) / d)
313324

314325
@bottleneck_switch()
315326
def nanmin(values, axis=None, skipna=True):

pandas/tests/test_series.py

+8
Original file line numberDiff line numberDiff line change
@@ -1832,6 +1832,14 @@ def test_var_std(self):
18321832
expected = np.var(self.ts.values, ddof=4)
18331833
assert_almost_equal(result, expected)
18341834

1835+
# 1 - element series with ddof=1
1836+
s = self.ts.iloc[[0]]
1837+
result = s.var(ddof=1)
1838+
self.assert_(isnull(result))
1839+
1840+
result = s.std(ddof=1)
1841+
self.assert_(isnull(result))
1842+
18351843
def test_skew(self):
18361844
_skip_if_no_scipy()
18371845

0 commit comments

Comments
 (0)