|
3 | 3 | import numpy as np
|
4 | 4 | import pytest
|
5 | 5 |
|
| 6 | +from pandas._libs import lib |
| 7 | + |
6 | 8 | import pandas as pd
|
7 | 9 | from pandas import (
|
8 | 10 | DataFrame,
|
@@ -771,3 +773,85 @@ def test_end_and_end_day_origin(
|
771 | 773 | )
|
772 | 774 |
|
773 | 775 | tm.assert_series_equal(res, expected)
|
| 776 | + |
| 777 | + |
| 778 | +@pytest.mark.parametrize( |
| 779 | + "method, numeric_only, expected_data", |
| 780 | + [ |
| 781 | + ("sum", True, {"num": [25]}), |
| 782 | + ("sum", False, {"cat": ["cat_1cat_2"], "num": [25]}), |
| 783 | + ("sum", lib.no_default, {"num": [25]}), |
| 784 | + ("prod", True, {"num": [100]}), |
| 785 | + ("prod", False, {"num": [100]}), |
| 786 | + ("prod", lib.no_default, {"num": [100]}), |
| 787 | + ("min", True, {"num": [5]}), |
| 788 | + ("min", False, {"cat": ["cat_1"], "num": [5]}), |
| 789 | + ("min", lib.no_default, {"cat": ["cat_1"], "num": [5]}), |
| 790 | + ("max", True, {"num": [20]}), |
| 791 | + ("max", False, {"cat": ["cat_2"], "num": [20]}), |
| 792 | + ("max", lib.no_default, {"cat": ["cat_2"], "num": [20]}), |
| 793 | + ("first", True, {"num": [5]}), |
| 794 | + ("first", False, {"cat": ["cat_1"], "num": [5]}), |
| 795 | + ("first", lib.no_default, {"cat": ["cat_1"], "num": [5]}), |
| 796 | + ("last", True, {"num": [20]}), |
| 797 | + ("last", False, {"cat": ["cat_2"], "num": [20]}), |
| 798 | + ("last", lib.no_default, {"cat": ["cat_2"], "num": [20]}), |
| 799 | + ], |
| 800 | +) |
| 801 | +def test_frame_downsample_method(method, numeric_only, expected_data): |
| 802 | + # GH#46442 test if `numeric_only` behave as expected for DataFrameGroupBy |
| 803 | + |
| 804 | + index = date_range("2018-01-01", periods=2, freq="D") |
| 805 | + expected_index = date_range("2018-12-31", periods=1, freq="Y") |
| 806 | + df = DataFrame({"cat": ["cat_1", "cat_2"], "num": [5, 20]}, index=index) |
| 807 | + resampled = df.resample("Y") |
| 808 | + |
| 809 | + func = getattr(resampled, method) |
| 810 | + result = func(numeric_only=numeric_only) |
| 811 | + |
| 812 | + expected = DataFrame(expected_data, index=expected_index) |
| 813 | + tm.assert_frame_equal(result, expected) |
| 814 | + |
| 815 | + |
| 816 | +@pytest.mark.parametrize( |
| 817 | + "method, numeric_only, expected_data", |
| 818 | + [ |
| 819 | + ("sum", True, ()), |
| 820 | + ("sum", False, ["cat_1cat_2"]), |
| 821 | + ("sum", lib.no_default, ["cat_1cat_2"]), |
| 822 | + ("prod", True, ()), |
| 823 | + ("prod", False, ()), |
| 824 | + ("prod", lib.no_default, ()), |
| 825 | + ("min", True, ()), |
| 826 | + ("min", False, ["cat_1"]), |
| 827 | + ("min", lib.no_default, ["cat_1"]), |
| 828 | + ("max", True, ()), |
| 829 | + ("max", False, ["cat_2"]), |
| 830 | + ("max", lib.no_default, ["cat_2"]), |
| 831 | + ("first", True, ()), |
| 832 | + ("first", False, ["cat_1"]), |
| 833 | + ("first", lib.no_default, ["cat_1"]), |
| 834 | + ("last", True, ()), |
| 835 | + ("last", False, ["cat_2"]), |
| 836 | + ("last", lib.no_default, ["cat_2"]), |
| 837 | + ], |
| 838 | +) |
| 839 | +def test_series_downsample_method(method, numeric_only, expected_data): |
| 840 | + # GH#46442 test if `numeric_only` behave as expected for SeriesGroupBy |
| 841 | + |
| 842 | + index = date_range("2018-01-01", periods=2, freq="D") |
| 843 | + expected_index = date_range("2018-12-31", periods=1, freq="Y") |
| 844 | + df = Series(["cat_1", "cat_2"], index=index) |
| 845 | + resampled = df.resample("Y") |
| 846 | + |
| 847 | + func = getattr(resampled, method) |
| 848 | + if numeric_only and numeric_only is not lib.no_default: |
| 849 | + with pytest.raises(NotImplementedError, match="not implement numeric_only"): |
| 850 | + func(numeric_only=numeric_only) |
| 851 | + elif method == "prod": |
| 852 | + with pytest.raises(TypeError, match="can't multiply sequence by non-int"): |
| 853 | + func(numeric_only=numeric_only) |
| 854 | + else: |
| 855 | + result = func(numeric_only=numeric_only) |
| 856 | + expected = Series(expected_data, index=expected_index) |
| 857 | + tm.assert_series_equal(result, expected) |
0 commit comments