12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import numpy as np
- import pytest
- from pandas import (
- Series,
- date_range,
- )
- import pandas._testing as tm
- class TestSeriesPctChange:
- def test_pct_change(self, datetime_series):
- rs = datetime_series.pct_change(fill_method=None)
- tm.assert_series_equal(rs, datetime_series / datetime_series.shift(1) - 1)
- rs = datetime_series.pct_change(2)
- filled = datetime_series.fillna(method="pad")
- tm.assert_series_equal(rs, filled / filled.shift(2) - 1)
- rs = datetime_series.pct_change(fill_method="bfill", limit=1)
- filled = datetime_series.fillna(method="bfill", limit=1)
- tm.assert_series_equal(rs, filled / filled.shift(1) - 1)
- rs = datetime_series.pct_change(freq="5D")
- filled = datetime_series.fillna(method="pad")
- tm.assert_series_equal(
- rs, (filled / filled.shift(freq="5D") - 1).reindex_like(filled)
- )
- def test_pct_change_with_duplicate_axis(self):
- # GH#28664
- common_idx = date_range("2019-11-14", periods=5, freq="D")
- result = Series(range(5), common_idx).pct_change(freq="B")
- # the reason that the expected should be like this is documented at PR 28681
- expected = Series([np.NaN, np.inf, np.NaN, np.NaN, 3.0], common_idx)
- tm.assert_series_equal(result, expected)
- def test_pct_change_shift_over_nas(self):
- s = Series([1.0, 1.5, np.nan, 2.5, 3.0])
- chg = s.pct_change()
- expected = Series([np.nan, 0.5, 0.0, 2.5 / 1.5 - 1, 0.2])
- tm.assert_series_equal(chg, expected)
- @pytest.mark.parametrize(
- "freq, periods, fill_method, limit",
- [
- ("5B", 5, None, None),
- ("3B", 3, None, None),
- ("3B", 3, "bfill", None),
- ("7B", 7, "pad", 1),
- ("7B", 7, "bfill", 3),
- ("14B", 14, None, None),
- ],
- )
- def test_pct_change_periods_freq(
- self, freq, periods, fill_method, limit, datetime_series
- ):
- # GH#7292
- rs_freq = datetime_series.pct_change(
- freq=freq, fill_method=fill_method, limit=limit
- )
- rs_periods = datetime_series.pct_change(
- periods, fill_method=fill_method, limit=limit
- )
- tm.assert_series_equal(rs_freq, rs_periods)
- empty_ts = Series(index=datetime_series.index, dtype=object)
- rs_freq = empty_ts.pct_change(freq=freq, fill_method=fill_method, limit=limit)
- rs_periods = empty_ts.pct_change(periods, fill_method=fill_method, limit=limit)
- tm.assert_series_equal(rs_freq, rs_periods)
- @pytest.mark.parametrize("fill_method", ["pad", "ffill", None])
- def test_pct_change_with_duplicated_indices(fill_method):
- # GH30463
- s = Series([np.nan, 1, 2, 3, 9, 18], index=["a", "b"] * 3)
- result = s.pct_change(fill_method=fill_method)
- expected = Series([np.nan, np.nan, 1.0, 0.5, 2.0, 1.0], index=["a", "b"] * 3)
- tm.assert_series_equal(result, expected)
|