diff --git a/pandas/core/window.py b/pandas/core/window.py index 31874a96f8111..ec20d5c006f1b 100644 --- a/pandas/core/window.py +++ b/pandas/core/window.py @@ -124,6 +124,24 @@ def _dir_additions(self): def _get_window(self, other=None): return self.window + def _prep_window(self, **kwargs): + """ provide validation for our window type, return the window """ + window = self._get_window() + + if isinstance(window, (list, tuple, np.ndarray)): + return com._asarray_tuplesafe(window).astype(float) + elif com.is_integer(window): + try: + import scipy.signal as sig + except ImportError: + raise ImportError('Please install scipy to generate window ' + 'weight') + # the below may pop from kwargs + win_type = _validate_win_type(self.win_type, kwargs) + return sig.get_window(win_type, window).astype(float) + + raise ValueError('Invalid window %s' % str(window)) + @property def _window_type(self): return self.__class__.__name__ @@ -317,24 +335,6 @@ class Window(_Window): * ``slepian`` (needs width). """ - def _prep_window(self, **kwargs): - """ provide validation for our window type, return the window """ - window = self._get_window() - - if isinstance(window, (list, tuple, np.ndarray)): - return com._asarray_tuplesafe(window).astype(float) - elif com.is_integer(window): - try: - import scipy.signal as sig - except ImportError: - raise ImportError('Please install scipy to generate window ' - 'weight') - # the below may pop from kwargs - win_type = _validate_win_type(self.win_type, kwargs) - return sig.get_window(win_type, window).astype(float) - - raise ValueError('Invalid window %s' % str(window)) - def _apply_window(self, mean=True, how=None, **kwargs): """ Applies a moving window of type ``window_type`` on the data. @@ -437,8 +437,7 @@ def _apply(self, func, window=None, center=None, check_minp=None, how=None, """ if center is None: center = self.center - if window is None: - window = self._get_window() + window = self._prep_window(**kwargs) if check_minp is None: check_minp = _use_window @@ -1354,7 +1353,9 @@ def _get_center_of_mass(com, span, halflife, alpha): def _offset(window, center): - if not com.is_integer(window): + if com.is_float(window) and int(window) == window: + window = int(window) + elif not com.is_integer(window): window = len(window) offset = (window - 1) / 2. if center else 0 try: diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index fb0e2ad2ca34e..2fff725378e07 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -3,7 +3,7 @@ import sys import warnings -from nose.tools import assert_raises +from nose.tools import assert_raises, raises from datetime import datetime from numpy.random import randn from numpy.testing.decorators import slow @@ -225,6 +225,14 @@ def b(x): result = r.aggregate([a, b]) assert_frame_equal(result, expected) + @raises(ValueError) + def test_window_rolling_float(self): + pd.DataFrame(np.arange(10)).rolling(2.).median() + + @raises(ValueError) + def test_window_rolling_center_float(self): + pd.DataFrame(np.arange(10)).rolling(2., center=True).median() + def test_preserve_metadata(self): # GH 10565 s = Series(np.arange(100), name='foo')