test_cumulative.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. """
  2. Tests for Series cumulative operations.
  3. See also
  4. --------
  5. tests.frame.test_cumulative
  6. """
  7. import numpy as np
  8. import pytest
  9. import pandas as pd
  10. import pandas._testing as tm
  11. methods = {
  12. "cumsum": np.cumsum,
  13. "cumprod": np.cumprod,
  14. "cummin": np.minimum.accumulate,
  15. "cummax": np.maximum.accumulate,
  16. }
  17. class TestSeriesCumulativeOps:
  18. @pytest.mark.parametrize("func", [np.cumsum, np.cumprod])
  19. def test_datetime_series(self, datetime_series, func):
  20. tm.assert_numpy_array_equal(
  21. func(datetime_series).values,
  22. func(np.array(datetime_series)),
  23. check_dtype=True,
  24. )
  25. # with missing values
  26. ts = datetime_series.copy()
  27. ts[::2] = np.NaN
  28. result = func(ts)[1::2]
  29. expected = func(np.array(ts.dropna()))
  30. tm.assert_numpy_array_equal(result.values, expected, check_dtype=False)
  31. @pytest.mark.parametrize("method", ["cummin", "cummax"])
  32. def test_cummin_cummax(self, datetime_series, method):
  33. ufunc = methods[method]
  34. result = getattr(datetime_series, method)().values
  35. expected = ufunc(np.array(datetime_series))
  36. tm.assert_numpy_array_equal(result, expected)
  37. ts = datetime_series.copy()
  38. ts[::2] = np.NaN
  39. result = getattr(ts, method)()[1::2]
  40. expected = ufunc(ts.dropna())
  41. result.index = result.index._with_freq(None)
  42. tm.assert_series_equal(result, expected)
  43. @pytest.mark.parametrize(
  44. "ts",
  45. [
  46. pd.Timedelta(0),
  47. pd.Timestamp("1999-12-31"),
  48. pd.Timestamp("1999-12-31").tz_localize("US/Pacific"),
  49. ],
  50. )
  51. @pytest.mark.parametrize(
  52. "method, skipna, exp_tdi",
  53. [
  54. ["cummax", True, ["NaT", "2 days", "NaT", "2 days", "NaT", "3 days"]],
  55. ["cummin", True, ["NaT", "2 days", "NaT", "1 days", "NaT", "1 days"]],
  56. [
  57. "cummax",
  58. False,
  59. ["NaT", "NaT", "NaT", "NaT", "NaT", "NaT"],
  60. ],
  61. [
  62. "cummin",
  63. False,
  64. ["NaT", "NaT", "NaT", "NaT", "NaT", "NaT"],
  65. ],
  66. ],
  67. )
  68. def test_cummin_cummax_datetimelike(self, ts, method, skipna, exp_tdi):
  69. # with ts==pd.Timedelta(0), we are testing td64; with naive Timestamp
  70. # we are testing datetime64[ns]; with Timestamp[US/Pacific]
  71. # we are testing dt64tz
  72. tdi = pd.to_timedelta(["NaT", "2 days", "NaT", "1 days", "NaT", "3 days"])
  73. ser = pd.Series(tdi + ts)
  74. exp_tdi = pd.to_timedelta(exp_tdi)
  75. expected = pd.Series(exp_tdi + ts)
  76. result = getattr(ser, method)(skipna=skipna)
  77. tm.assert_series_equal(expected, result)
  78. @pytest.mark.parametrize(
  79. "func, exp",
  80. [
  81. ("cummin", pd.Period("2012-1-1", freq="D")),
  82. ("cummax", pd.Period("2012-1-2", freq="D")),
  83. ],
  84. )
  85. def test_cummin_cummax_period(self, func, exp):
  86. # GH#28385
  87. ser = pd.Series(
  88. [pd.Period("2012-1-1", freq="D"), pd.NaT, pd.Period("2012-1-2", freq="D")]
  89. )
  90. result = getattr(ser, func)(skipna=False)
  91. expected = pd.Series([pd.Period("2012-1-1", freq="D"), pd.NaT, pd.NaT])
  92. tm.assert_series_equal(result, expected)
  93. result = getattr(ser, func)(skipna=True)
  94. expected = pd.Series([pd.Period("2012-1-1", freq="D"), pd.NaT, exp])
  95. tm.assert_series_equal(result, expected)
  96. @pytest.mark.parametrize(
  97. "arg",
  98. [
  99. [False, False, False, True, True, False, False],
  100. [False, False, False, False, False, False, False],
  101. ],
  102. )
  103. @pytest.mark.parametrize(
  104. "func", [lambda x: x, lambda x: ~x], ids=["identity", "inverse"]
  105. )
  106. @pytest.mark.parametrize("method", methods.keys())
  107. def test_cummethods_bool(self, arg, func, method):
  108. # GH#6270
  109. # checking Series method vs the ufunc applied to the values
  110. ser = func(pd.Series(arg))
  111. ufunc = methods[method]
  112. exp_vals = ufunc(ser.values)
  113. expected = pd.Series(exp_vals)
  114. result = getattr(ser, method)()
  115. tm.assert_series_equal(result, expected)
  116. @pytest.mark.parametrize(
  117. "method, expected",
  118. [
  119. ["cumsum", pd.Series([0, 1, np.nan, 1], dtype=object)],
  120. ["cumprod", pd.Series([False, 0, np.nan, 0])],
  121. ["cummin", pd.Series([False, False, np.nan, False])],
  122. ["cummax", pd.Series([False, True, np.nan, True])],
  123. ],
  124. )
  125. def test_cummethods_bool_in_object_dtype(self, method, expected):
  126. ser = pd.Series([False, True, np.nan, False])
  127. result = getattr(ser, method)()
  128. tm.assert_series_equal(result, expected)
  129. def test_cumprod_timedelta(self):
  130. # GH#48111
  131. ser = pd.Series([pd.Timedelta(days=1), pd.Timedelta(days=3)])
  132. with pytest.raises(TypeError, match="cumprod not supported for Timedelta"):
  133. ser.cumprod()