|
2 | 2 | import pytest
|
3 | 3 |
|
4 | 4 | import pandas as pd
|
5 |
| -from pandas import DataFrame, MultiIndex, Series |
| 5 | +from pandas import DataFrame, Index, MultiIndex, Series |
6 | 6 | import pandas._testing as tm
|
7 | 7 | from pandas.core.groupby.groupby import get_groupby
|
8 | 8 |
|
@@ -396,14 +396,25 @@ def test_groupby_rolling_index_changed(self, func):
|
396 | 396 |
|
397 | 397 | def test_groupby_rolling_empty_frame(self):
|
398 | 398 | # GH 36197
|
399 |
| - expected = pd.DataFrame({"s1": []}) |
| 399 | + expected = DataFrame({"s1": []}) |
400 | 400 | result = expected.groupby("s1").rolling(window=1).sum()
|
401 |
| - expected.index = pd.MultiIndex.from_tuples([], names=["s1", None]) |
| 401 | + # GH-38057 from_tuples gives empty object dtype, we now get float/int levels |
| 402 | + # expected.index = MultiIndex.from_tuples([], names=["s1", None]) |
| 403 | + expected.index = MultiIndex.from_product( |
| 404 | + [Index([], dtype="float64"), Index([], dtype="int64")], names=["s1", None] |
| 405 | + ) |
402 | 406 | tm.assert_frame_equal(result, expected)
|
403 | 407 |
|
404 |
| - expected = pd.DataFrame({"s1": [], "s2": []}) |
| 408 | + expected = DataFrame({"s1": [], "s2": []}) |
405 | 409 | result = expected.groupby(["s1", "s2"]).rolling(window=1).sum()
|
406 |
| - expected.index = pd.MultiIndex.from_tuples([], names=["s1", "s2", None]) |
| 410 | + expected.index = MultiIndex.from_product( |
| 411 | + [ |
| 412 | + Index([], dtype="float64"), |
| 413 | + Index([], dtype="float64"), |
| 414 | + Index([], dtype="int64"), |
| 415 | + ], |
| 416 | + names=["s1", "s2", None], |
| 417 | + ) |
407 | 418 | tm.assert_frame_equal(result, expected)
|
408 | 419 |
|
409 | 420 | def test_groupby_rolling_string_index(self):
|
@@ -479,3 +490,57 @@ def test_groupby_rolling_index_level_and_column_label(self):
|
479 | 490 | ),
|
480 | 491 | )
|
481 | 492 | tm.assert_frame_equal(result, expected)
|
| 493 | + |
| 494 | + def test_groupby_rolling_resulting_multiindex(self): |
| 495 | + # a few different cases checking the created MultiIndex of the result |
| 496 | + # https://github.com/pandas-dev/pandas/pull/38057 |
| 497 | + |
| 498 | + # grouping by 1 columns -> 2-level MI as result |
| 499 | + df = DataFrame({"a": np.arange(8.0), "b": [1, 2] * 4}) |
| 500 | + result = df.groupby("b").rolling(3).mean() |
| 501 | + expected_index = MultiIndex.from_tuples( |
| 502 | + [(1, 0), (1, 2), (1, 4), (1, 6), (2, 1), (2, 3), (2, 5), (2, 7)], |
| 503 | + names=["b", None], |
| 504 | + ) |
| 505 | + tm.assert_index_equal(result.index, expected_index) |
| 506 | + |
| 507 | + # grouping by 2 columns -> 3-level MI as result |
| 508 | + df = DataFrame({"a": np.arange(12.0), "b": [1, 2] * 6, "c": [1, 2, 3, 4] * 3}) |
| 509 | + result = df.groupby(["b", "c"]).rolling(2).sum() |
| 510 | + expected_index = MultiIndex.from_tuples( |
| 511 | + [ |
| 512 | + (1, 1, 0), |
| 513 | + (1, 1, 4), |
| 514 | + (1, 1, 8), |
| 515 | + (1, 3, 2), |
| 516 | + (1, 3, 6), |
| 517 | + (1, 3, 10), |
| 518 | + (2, 2, 1), |
| 519 | + (2, 2, 5), |
| 520 | + (2, 2, 9), |
| 521 | + (2, 4, 3), |
| 522 | + (2, 4, 7), |
| 523 | + (2, 4, 11), |
| 524 | + ], |
| 525 | + names=["b", "c", None], |
| 526 | + ) |
| 527 | + tm.assert_index_equal(result.index, expected_index) |
| 528 | + |
| 529 | + # grouping with 1 level on dataframe with 2-level MI -> 3-level MI as result |
| 530 | + df = DataFrame({"a": np.arange(8.0), "b": [1, 2] * 4, "c": [1, 2, 3, 4] * 2}) |
| 531 | + df = df.set_index("c", append=True) |
| 532 | + result = df.groupby("b").rolling(3).mean() |
| 533 | + expected_index = MultiIndex.from_tuples( |
| 534 | + [ |
| 535 | + (1, 0, 1), |
| 536 | + (1, 2, 3), |
| 537 | + (1, 4, 1), |
| 538 | + (1, 6, 3), |
| 539 | + (2, 1, 2), |
| 540 | + (2, 3, 4), |
| 541 | + (2, 5, 2), |
| 542 | + (2, 7, 4), |
| 543 | + ], |
| 544 | + names=["b", None, "c"], |
| 545 | + ) |
| 546 | + tm.assert_index_equal(result.index, expected_index) |
0 commit comments