|
1 | 1 | import numpy as np
|
2 | 2 | import pytest
|
3 | 3 |
|
4 |
| -from pandas import DataFrame, MultiIndex, Series, Timestamp, date_range, to_datetime |
| 4 | +from pandas import ( |
| 5 | + DataFrame, |
| 6 | + Index, |
| 7 | + MultiIndex, |
| 8 | + Series, |
| 9 | + Timestamp, |
| 10 | + date_range, |
| 11 | + to_datetime, |
| 12 | +) |
5 | 13 | import pandas._testing as tm
|
6 | 14 | from pandas.api.indexers import BaseIndexer
|
7 | 15 | from pandas.core.groupby.groupby import get_groupby
|
@@ -418,12 +426,23 @@ def test_groupby_rolling_empty_frame(self):
|
418 | 426 | # GH 36197
|
419 | 427 | expected = DataFrame({"s1": []})
|
420 | 428 | result = expected.groupby("s1").rolling(window=1).sum()
|
421 |
| - expected.index = MultiIndex.from_tuples([], names=["s1", None]) |
| 429 | + # GH-38057 from_tuples gives empty object dtype, we now get float/int levels |
| 430 | + # expected.index = MultiIndex.from_tuples([], names=["s1", None]) |
| 431 | + expected.index = MultiIndex.from_product( |
| 432 | + [Index([], dtype="float64"), Index([], dtype="int64")], names=["s1", None] |
| 433 | + ) |
422 | 434 | tm.assert_frame_equal(result, expected)
|
423 | 435 |
|
424 | 436 | expected = DataFrame({"s1": [], "s2": []})
|
425 | 437 | result = expected.groupby(["s1", "s2"]).rolling(window=1).sum()
|
426 |
| - expected.index = MultiIndex.from_tuples([], names=["s1", "s2", None]) |
| 438 | + expected.index = MultiIndex.from_product( |
| 439 | + [ |
| 440 | + Index([], dtype="float64"), |
| 441 | + Index([], dtype="float64"), |
| 442 | + Index([], dtype="int64"), |
| 443 | + ], |
| 444 | + names=["s1", "s2", None], |
| 445 | + ) |
427 | 446 | tm.assert_frame_equal(result, expected)
|
428 | 447 |
|
429 | 448 | def test_groupby_rolling_string_index(self):
|
@@ -567,6 +586,60 @@ def test_groupby_rolling_index_level_and_column_label(self):
|
567 | 586 | )
|
568 | 587 | tm.assert_frame_equal(result, expected)
|
569 | 588 |
|
| 589 | + def test_groupby_rolling_resulting_multiindex(self): |
| 590 | + # a few different cases checking the created MultiIndex of the result |
| 591 | + # https://github.com/pandas-dev/pandas/pull/38057 |
| 592 | + |
| 593 | + # grouping by 1 columns -> 2-level MI as result |
| 594 | + df = DataFrame({"a": np.arange(8.0), "b": [1, 2] * 4}) |
| 595 | + result = df.groupby("b").rolling(3).mean() |
| 596 | + expected_index = MultiIndex.from_tuples( |
| 597 | + [(1, 0), (1, 2), (1, 4), (1, 6), (2, 1), (2, 3), (2, 5), (2, 7)], |
| 598 | + names=["b", None], |
| 599 | + ) |
| 600 | + tm.assert_index_equal(result.index, expected_index) |
| 601 | + |
| 602 | + # grouping by 2 columns -> 3-level MI as result |
| 603 | + df = DataFrame({"a": np.arange(12.0), "b": [1, 2] * 6, "c": [1, 2, 3, 4] * 3}) |
| 604 | + result = df.groupby(["b", "c"]).rolling(2).sum() |
| 605 | + expected_index = MultiIndex.from_tuples( |
| 606 | + [ |
| 607 | + (1, 1, 0), |
| 608 | + (1, 1, 4), |
| 609 | + (1, 1, 8), |
| 610 | + (1, 3, 2), |
| 611 | + (1, 3, 6), |
| 612 | + (1, 3, 10), |
| 613 | + (2, 2, 1), |
| 614 | + (2, 2, 5), |
| 615 | + (2, 2, 9), |
| 616 | + (2, 4, 3), |
| 617 | + (2, 4, 7), |
| 618 | + (2, 4, 11), |
| 619 | + ], |
| 620 | + names=["b", "c", None], |
| 621 | + ) |
| 622 | + tm.assert_index_equal(result.index, expected_index) |
| 623 | + |
| 624 | + # grouping with 1 level on dataframe with 2-level MI -> 3-level MI as result |
| 625 | + df = DataFrame({"a": np.arange(8.0), "b": [1, 2] * 4, "c": [1, 2, 3, 4] * 2}) |
| 626 | + df = df.set_index("c", append=True) |
| 627 | + result = df.groupby("b").rolling(3).mean() |
| 628 | + expected_index = MultiIndex.from_tuples( |
| 629 | + [ |
| 630 | + (1, 0, 1), |
| 631 | + (1, 2, 3), |
| 632 | + (1, 4, 1), |
| 633 | + (1, 6, 3), |
| 634 | + (2, 1, 2), |
| 635 | + (2, 3, 4), |
| 636 | + (2, 5, 2), |
| 637 | + (2, 7, 4), |
| 638 | + ], |
| 639 | + names=["b", None, "c"], |
| 640 | + ) |
| 641 | + tm.assert_index_equal(result.index, expected_index) |
| 642 | + |
570 | 643 |
|
571 | 644 | class TestExpanding:
|
572 | 645 | def setup_method(self):
|
|
0 commit comments