Skip to content

Commit 1c64d7d

Browse files
minggliharisbal
authored and
harisbal
committed
[pandas-dev#7292] BUG: asfreq / pct_change strange behavior (pandas-dev#19410)
1 parent 69f1bdc commit 1c64d7d

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

doc/source/whatsnew/v0.23.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ Datetimelike
420420
- Bug in ``.astype()`` to non-ns timedelta units would hold the incorrect dtype (:issue:`19176`, :issue:`19223`, :issue:`12425`)
421421
- Bug in subtracting :class:`Series` from ``NaT`` incorrectly returning ``NaT`` (:issue:`19158`)
422422
- Bug in :func:`Series.truncate` which raises ``TypeError`` with a monotonic ``PeriodIndex`` (:issue:`17717`)
423+
- Bug in :func:`~DataFrame.pct_change` using ``periods`` and ``freq`` returned different length outputs (:issue:`7292`)
423424

424425
Timezones
425426
^^^^^^^^^

pandas/core/generic.py

+1
Original file line numberDiff line numberDiff line change
@@ -7315,6 +7315,7 @@ def pct_change(self, periods=1, fill_method='pad', limit=None, freq=None,
73157315

73167316
rs = (data.div(data.shift(periods=periods, freq=freq, axis=axis,
73177317
**kwargs)) - 1)
7318+
rs = rs.reindex_like(data)
73187319
if freq is None:
73197320
mask = isna(com._values_from_object(self))
73207321
np.putmask(rs.values, mask, np.nan)

pandas/tests/frame/test_timeseries.py

+35-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ def test_pct_change(self):
108108

109109
rs = self.tsframe.pct_change(freq='5D')
110110
filled = self.tsframe.fillna(method='pad')
111-
assert_frame_equal(rs, filled / filled.shift(freq='5D') - 1)
111+
assert_frame_equal(rs,
112+
(filled / filled.shift(freq='5D') - 1)
113+
.reindex_like(filled))
112114

113115
def test_pct_change_shift_over_nas(self):
114116
s = Series([1., 1.5, np.nan, 2.5, 3.])
@@ -120,6 +122,38 @@ def test_pct_change_shift_over_nas(self):
120122
edf = DataFrame({'a': expected, 'b': expected})
121123
assert_frame_equal(chg, edf)
122124

125+
def test_pct_change_periods_freq(self):
126+
# GH 7292
127+
rs_freq = self.tsframe.pct_change(freq='5B')
128+
rs_periods = self.tsframe.pct_change(5)
129+
assert_frame_equal(rs_freq, rs_periods)
130+
131+
rs_freq = self.tsframe.pct_change(freq='3B', fill_method=None)
132+
rs_periods = self.tsframe.pct_change(3, fill_method=None)
133+
assert_frame_equal(rs_freq, rs_periods)
134+
135+
rs_freq = self.tsframe.pct_change(freq='3B', fill_method='bfill')
136+
rs_periods = self.tsframe.pct_change(3, fill_method='bfill')
137+
assert_frame_equal(rs_freq, rs_periods)
138+
139+
rs_freq = self.tsframe.pct_change(freq='7B',
140+
fill_method='pad',
141+
limit=1)
142+
rs_periods = self.tsframe.pct_change(7, fill_method='pad', limit=1)
143+
assert_frame_equal(rs_freq, rs_periods)
144+
145+
rs_freq = self.tsframe.pct_change(freq='7B',
146+
fill_method='bfill',
147+
limit=3)
148+
rs_periods = self.tsframe.pct_change(7, fill_method='bfill', limit=3)
149+
assert_frame_equal(rs_freq, rs_periods)
150+
151+
empty_ts = DataFrame(index=self.tsframe.index,
152+
columns=self.tsframe.columns)
153+
rs_freq = empty_ts.pct_change(freq='14B')
154+
rs_periods = empty_ts.pct_change(14)
155+
assert_frame_equal(rs_freq, rs_periods)
156+
123157
def test_frame_ctor_datetime64_column(self):
124158
rng = date_range('1/1/2000 00:00:00', '1/1/2000 1:59:50', freq='10s')
125159
dates = np.asarray(rng)

pandas/tests/series/test_timeseries.py

+30-1
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,9 @@ def test_pct_change(self):
344344

345345
rs = self.ts.pct_change(freq='5D')
346346
filled = self.ts.fillna(method='pad')
347-
assert_series_equal(rs, filled / filled.shift(freq='5D') - 1)
347+
assert_series_equal(rs,
348+
(filled / filled.shift(freq='5D') - 1)
349+
.reindex_like(filled))
348350

349351
def test_pct_change_shift_over_nas(self):
350352
s = Series([1., 1.5, np.nan, 2.5, 3.])
@@ -353,6 +355,33 @@ def test_pct_change_shift_over_nas(self):
353355
expected = Series([np.nan, 0.5, np.nan, 2.5 / 1.5 - 1, .2])
354356
assert_series_equal(chg, expected)
355357

358+
def test_pct_change_periods_freq(self):
359+
# GH 7292
360+
rs_freq = self.ts.pct_change(freq='5B')
361+
rs_periods = self.ts.pct_change(5)
362+
assert_series_equal(rs_freq, rs_periods)
363+
364+
rs_freq = self.ts.pct_change(freq='3B', fill_method=None)
365+
rs_periods = self.ts.pct_change(3, fill_method=None)
366+
assert_series_equal(rs_freq, rs_periods)
367+
368+
rs_freq = self.ts.pct_change(freq='3B', fill_method='bfill')
369+
rs_periods = self.ts.pct_change(3, fill_method='bfill')
370+
assert_series_equal(rs_freq, rs_periods)
371+
372+
rs_freq = self.ts.pct_change(freq='7B', fill_method='pad', limit=1)
373+
rs_periods = self.ts.pct_change(7, fill_method='pad', limit=1)
374+
assert_series_equal(rs_freq, rs_periods)
375+
376+
rs_freq = self.ts.pct_change(freq='7B', fill_method='bfill', limit=3)
377+
rs_periods = self.ts.pct_change(7, fill_method='bfill', limit=3)
378+
assert_series_equal(rs_freq, rs_periods)
379+
380+
empty_ts = Series(index=self.ts.index)
381+
rs_freq = empty_ts.pct_change(freq='14B')
382+
rs_periods = empty_ts.pct_change(14)
383+
assert_series_equal(rs_freq, rs_periods)
384+
356385
def test_autocorr(self):
357386
# Just run the function
358387
corr1 = self.ts.autocorr()

0 commit comments

Comments
 (0)