132 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
Tests for Series cumulative operations.
 | 
						|
 | 
						|
See also
 | 
						|
--------
 | 
						|
tests.frame.test_cumulative
 | 
						|
"""
 | 
						|
 | 
						|
import numpy as np
 | 
						|
import pytest
 | 
						|
 | 
						|
import pandas as pd
 | 
						|
import pandas._testing as tm
 | 
						|
 | 
						|
methods = {
 | 
						|
    "cumsum": np.cumsum,
 | 
						|
    "cumprod": np.cumprod,
 | 
						|
    "cummin": np.minimum.accumulate,
 | 
						|
    "cummax": np.maximum.accumulate,
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
class TestSeriesCumulativeOps:
 | 
						|
    @pytest.mark.parametrize("func", [np.cumsum, np.cumprod])
 | 
						|
    def test_datetime_series(self, datetime_series, func):
 | 
						|
        tm.assert_numpy_array_equal(
 | 
						|
            func(datetime_series).values,
 | 
						|
            func(np.array(datetime_series)),
 | 
						|
            check_dtype=True,
 | 
						|
        )
 | 
						|
 | 
						|
        # with missing values
 | 
						|
        ts = datetime_series.copy()
 | 
						|
        ts[::2] = np.NaN
 | 
						|
 | 
						|
        result = func(ts)[1::2]
 | 
						|
        expected = func(np.array(ts.dropna()))
 | 
						|
 | 
						|
        tm.assert_numpy_array_equal(result.values, expected, check_dtype=False)
 | 
						|
 | 
						|
    @pytest.mark.parametrize("method", ["cummin", "cummax"])
 | 
						|
    def test_cummin_cummax(self, datetime_series, method):
 | 
						|
        ufunc = methods[method]
 | 
						|
 | 
						|
        result = getattr(datetime_series, method)().values
 | 
						|
        expected = ufunc(np.array(datetime_series))
 | 
						|
 | 
						|
        tm.assert_numpy_array_equal(result, expected)
 | 
						|
        ts = datetime_series.copy()
 | 
						|
        ts[::2] = np.NaN
 | 
						|
        result = getattr(ts, method)()[1::2]
 | 
						|
        expected = ufunc(ts.dropna())
 | 
						|
 | 
						|
        result.index = result.index._with_freq(None)
 | 
						|
        tm.assert_series_equal(result, expected)
 | 
						|
 | 
						|
    @pytest.mark.parametrize(
 | 
						|
        "ts",
 | 
						|
        [
 | 
						|
            pd.Timedelta(0),
 | 
						|
            pd.Timestamp("1999-12-31"),
 | 
						|
            pd.Timestamp("1999-12-31").tz_localize("US/Pacific"),
 | 
						|
        ],
 | 
						|
    )
 | 
						|
    @pytest.mark.parametrize(
 | 
						|
        "method, skipna, exp_tdi",
 | 
						|
        [
 | 
						|
            ["cummax", True, ["NaT", "2 days", "NaT", "2 days", "NaT", "3 days"]],
 | 
						|
            ["cummin", True, ["NaT", "2 days", "NaT", "1 days", "NaT", "1 days"]],
 | 
						|
            [
 | 
						|
                "cummax",
 | 
						|
                False,
 | 
						|
                ["NaT", "2 days", "2 days", "2 days", "2 days", "3 days"],
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                "cummin",
 | 
						|
                False,
 | 
						|
                ["NaT", "2 days", "2 days", "1 days", "1 days", "1 days"],
 | 
						|
            ],
 | 
						|
        ],
 | 
						|
    )
 | 
						|
    def test_cummin_cummax_datetimelike(self, ts, method, skipna, exp_tdi):
 | 
						|
        # with ts==pd.Timedelta(0), we are testing td64; with naive Timestamp
 | 
						|
        #  we are testing datetime64[ns]; with Timestamp[US/Pacific]
 | 
						|
        #  we are testing dt64tz
 | 
						|
        tdi = pd.to_timedelta(["NaT", "2 days", "NaT", "1 days", "NaT", "3 days"])
 | 
						|
        ser = pd.Series(tdi + ts)
 | 
						|
 | 
						|
        exp_tdi = pd.to_timedelta(exp_tdi)
 | 
						|
        expected = pd.Series(exp_tdi + ts)
 | 
						|
        result = getattr(ser, method)(skipna=skipna)
 | 
						|
        tm.assert_series_equal(expected, result)
 | 
						|
 | 
						|
    @pytest.mark.parametrize(
 | 
						|
        "arg",
 | 
						|
        [
 | 
						|
            [False, False, False, True, True, False, False],
 | 
						|
            [False, False, False, False, False, False, False],
 | 
						|
        ],
 | 
						|
    )
 | 
						|
    @pytest.mark.parametrize(
 | 
						|
        "func", [lambda x: x, lambda x: ~x], ids=["identity", "inverse"]
 | 
						|
    )
 | 
						|
    @pytest.mark.parametrize("method", methods.keys())
 | 
						|
    def test_cummethods_bool(self, arg, func, method):
 | 
						|
        # GH#6270
 | 
						|
        # checking Series method vs the ufunc applied to the values
 | 
						|
 | 
						|
        ser = func(pd.Series(arg))
 | 
						|
        ufunc = methods[method]
 | 
						|
 | 
						|
        exp_vals = ufunc(ser.values)
 | 
						|
        expected = pd.Series(exp_vals)
 | 
						|
 | 
						|
        result = getattr(ser, method)()
 | 
						|
 | 
						|
        tm.assert_series_equal(result, expected)
 | 
						|
 | 
						|
    @pytest.mark.parametrize(
 | 
						|
        "method, expected",
 | 
						|
        [
 | 
						|
            ["cumsum", pd.Series([0, 1, np.nan, 1], dtype=object)],
 | 
						|
            ["cumprod", pd.Series([False, 0, np.nan, 0])],
 | 
						|
            ["cummin", pd.Series([False, False, np.nan, False])],
 | 
						|
            ["cummax", pd.Series([False, True, np.nan, True])],
 | 
						|
        ],
 | 
						|
    )
 | 
						|
    def test_cummethods_bool_in_object_dtype(self, method, expected):
 | 
						|
        ser = pd.Series([False, True, np.nan, False])
 | 
						|
        result = getattr(ser, method)()
 | 
						|
        tm.assert_series_equal(result, expected)
 |