-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
ENH: Raise useful error when iterating a Window #20996
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ENH: Raise useful error when iterating a Window #20996
Conversation
Until Issue pandas-dev#11704 is completed, raise a NotImplementedError to provide a more clear error message when attempting to iterate over a Rolling or Expanding window.
Codecov Report
@@ Coverage Diff @@
## master #20996 +/- ##
==========================================
+ Coverage 91.82% 91.82% +<.01%
==========================================
Files 153 153
Lines 49488 49507 +19
==========================================
+ Hits 45443 45462 +19
Misses 4045 4045
Continue to review full report at Codecov.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the submission - can you add a test to go with this?
pandas/core/window.py
Outdated
@@ -181,6 +181,10 @@ def __unicode__(self): | |||
return "{klass} [{attrs}]".format(klass=self._window_type, | |||
attrs=','.join(attrs)) | |||
|
|||
def __iter__(self): | |||
url = 'https://github.com/pandas-dev/pandas/issues/11704' | |||
raise NotImplementedError('See issue #11704 %s' % (url,)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you use .format
here instead? Alternately could get away with just referencing the issue number
We'll want a test and a note in the whatsnew. |
@TomAugspurger @WillAyd Would the test be to confirm that a |
Hello @selik! Thanks for updating the PR. Cheers ! There are no PEP8 issues in this Pull Request. 🍻 Comment last updated on May 12, 2018 at 16:13 Hours UTC |
I added tests for both rolling and expanding in the new functional pytest style. I wasn't sure from the contribution guide whether to continue with the class-organized style of the existing tests or to use the new style. https://pandas.pydata.org/pandas-docs/stable/contributing.html#transitioning-to-pytest One issue with the functional pytest style is that parameterizing on fixtures is awkward. pytest-dev/pytest#349 |
doc/source/whatsnew/v0.23.0.txt
Outdated
@@ -966,6 +966,7 @@ Other API Changes | |||
- Constructing a Series from a list of length 1 no longer broadcasts this list when a longer index is specified (:issue:`19714`, :issue:`20391`). | |||
- :func:`DataFrame.to_dict` with ``orient='index'`` no longer casts int columns to float for a DataFrame with only int and float columns (:issue:`18580`) | |||
- A user-defined-function that is passed to :func:`Series.rolling().aggregate() <pandas.core.window.Rolling.aggregate>`, :func:`DataFrame.rolling().aggregate() <pandas.core.window.Rolling.aggregate>`, or its expanding cousins, will now *always* be passed a ``Series``, rather than a ``np.array``; ``.apply()`` only has the ``raw`` keyword, see :ref:`here <whatsnew_0230.enhancements.window_raw>`. This is consistent with the signatures of ``.aggregate()`` across pandas (:issue:`20584`) | |||
- Window types, such as Rolling and Expanding, raise `NotImplementedError` upon iteration. This will ideally be replaced by mimicking the (key, group) iteration of GroupBy (:issue:`11704`). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use double backticks around literals like NotImplementedError. Could also simply by just saying "Rolling and Expanding types will now raise a ``NotImplementedError`` upon iteration (:issue:`11704`)"
You may be right on how that eventually gets implemented but I wouldn't mention it here because who knows what change it could be subject to
pandas/tests/test_window.py
Outdated
@@ -46,6 +46,27 @@ def win_types_special(request): | |||
return request.param | |||
|
|||
|
|||
# Issue 11704: Iteration over a Window | |||
|
|||
@pytest.fixture |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The fixtures here are a little overkill. Just parametrize a "klass" of pd.Series
and pd.DataFrame
(both can be constructed from the values provided).
pandas/tests/test_window.py
Outdated
return pd.DataFrame({'a': [1, 2, 3, 4], 'b': [10, 20, 30, 40]}) | ||
|
||
@pytest.mark.parametrize('which', [series(), frame()]) | ||
def test_rolling_iterator(which): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move this to TestRolling
and call it test_iterator_raises
pandas/tests/test_window.py
Outdated
iter(which.rolling(2)) | ||
|
||
@pytest.mark.parametrize('which', [series(), frame()]) | ||
def test_expanding_iterator(which): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move this to TestExpanding
and call it test_iterator_raises
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor edits (apply to both test cases) otherwise lgtm
pandas/tests/test_window.py
Outdated
@@ -533,6 +512,14 @@ def test_multi_index_names(self): | |||
tm.assert_index_equal(result.columns, df.columns) | |||
assert result.index.names == [None, '1', '2'] | |||
|
|||
@pytest.mark.parametrize('cls', [pd.Series, pd.DataFrame]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you use "klass" instead of "cls"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I strongly prefer cls
in this case. Certain misspellings have a distasteful cultural undertone for me. Also, cls
is an equally popular standard in other Python projects, if not more popular.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"klass" is most used in pandas so we should stick with that as the standard for now (thought admittedly not 100%). If you feel so inclined you can definitely bring up the conversation to standard as an issue or on the mailing list and get feedback.
Would be easier to change in one sweep that having each contributor implement their own standard
grep "parametrize.*klass" -r pandas/tests/ | wc -l
38
grep "parametrize.*box" -r pandas/tests/ | wc -l
12
grep "parametrize.*cls" -r pandas/tests/ | wc -l
10
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I'll make that change separately.
pandas/tests/test_window.py
Outdated
@@ -533,6 +512,14 @@ def test_multi_index_names(self): | |||
tm.assert_index_equal(result.columns, df.columns) | |||
assert result.index.names == [None, '1', '2'] | |||
|
|||
@pytest.mark.parametrize('cls', [pd.Series, pd.DataFrame]) | |||
def test_iter_raises(cls): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing "self" as first argument
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm - thanks!
Thanks! |
* ENH: Raise useful error when iterating a Window Until Issue pandas-dev#11704 is completed, raise a NotImplementedError to provide a more clear error message when attempting to iterate over a Rolling or Expanding window.
* ENH: Raise useful error when iterating a Window Until Issue pandas-dev#11704 is completed, raise a NotImplementedError to provide a more clear error message when attempting to iterate over a Rolling or Expanding window.
Until Issue #11704 is completed, raise a NotImplementedError to provide
a more clear error message when attempting to iterate over a Rolling
or Expanding window.