|
21 | 21 | from pandas.tseries.period import period_range, PeriodIndex, Period
|
22 | 22 | from pandas.tseries.resample import (DatetimeIndex, TimeGrouper,
|
23 | 23 | DatetimeIndexResampler)
|
| 24 | +from pandas.tseries.frequencies import to_offset |
24 | 25 | from pandas.tseries.tdi import timedelta_range
|
25 | 26 | from pandas.util.testing import (assert_series_equal, assert_almost_equal,
|
26 | 27 | assert_frame_equal)
|
|
35 | 36 | resample_methods = downsample_methods + upsample_methods + series_methods
|
36 | 37 |
|
37 | 38 |
|
| 39 | +def _simple_ts(start, end, freq='D'): |
| 40 | + rng = date_range(start, end, freq=freq) |
| 41 | + return Series(np.random.randn(len(rng)), index=rng) |
| 42 | + |
| 43 | + |
| 44 | +def _simple_pts(start, end, freq='D'): |
| 45 | + rng = period_range(start, end, freq=freq) |
| 46 | + return Series(np.random.randn(len(rng)), index=rng) |
| 47 | + |
| 48 | + |
38 | 49 | class TestResampleAPI(tm.TestCase):
|
39 | 50 | _multiprocess_can_split_ = True
|
40 | 51 |
|
@@ -566,15 +577,63 @@ def test_agg_consistency(self):
|
566 | 577 | assert_frame_equal(result, expected)
|
567 | 578 |
|
568 | 579 |
|
569 |
| -class TestResample(tm.TestCase): |
| 580 | +class Base(object): |
| 581 | + """ |
| 582 | + base class for resampling testing, calling |
| 583 | + .create_series() generates a series of each index type |
| 584 | + """ |
| 585 | + def create_index(self, *args, **kwargs): |
| 586 | + """ return the _index_factory created using the args, kwargs """ |
| 587 | + factory = self._index_factory() |
| 588 | + return factory(*args, **kwargs) |
| 589 | + |
| 590 | + def test_asfreq_downsample(self): |
| 591 | + s = self.create_series() |
| 592 | + |
| 593 | + result = s.resample('2D').asfreq() |
| 594 | + expected = s.reindex(s.index.take(np.arange(0, len(s.index), 2))) |
| 595 | + expected.index.freq = to_offset('2D') |
| 596 | + assert_series_equal(result, expected) |
| 597 | + |
| 598 | + frame = s.to_frame('value') |
| 599 | + result = frame.resample('2D').asfreq() |
| 600 | + expected = frame.reindex( |
| 601 | + frame.index.take(np.arange(0, len(frame.index), 2))) |
| 602 | + expected.index.freq = to_offset('2D') |
| 603 | + assert_frame_equal(result, expected) |
| 604 | + |
| 605 | + def test_asfreq_upsample(self): |
| 606 | + s = self.create_series() |
| 607 | + |
| 608 | + result = s.resample('1H').asfreq() |
| 609 | + new_index = self.create_index(s.index[0], s.index[-1], freq='1H') |
| 610 | + expected = s.reindex(new_index) |
| 611 | + assert_series_equal(result, expected) |
| 612 | + |
| 613 | + frame = s.to_frame('value') |
| 614 | + result = frame.resample('1H').asfreq() |
| 615 | + new_index = self.create_index(frame.index[0], |
| 616 | + frame.index[-1], freq='1H') |
| 617 | + expected = frame.reindex(new_index) |
| 618 | + assert_frame_equal(result, expected) |
| 619 | + |
| 620 | + |
| 621 | +class TestDatetimeIndex(Base, tm.TestCase): |
570 | 622 | _multiprocess_can_split_ = True
|
| 623 | + _index_factory = lambda x: date_range |
571 | 624 |
|
572 | 625 | def setUp(self):
|
573 | 626 | dti = DatetimeIndex(start=datetime(2005, 1, 1),
|
574 | 627 | end=datetime(2005, 1, 10), freq='Min')
|
575 | 628 |
|
576 | 629 | self.series = Series(np.random.rand(len(dti)), dti)
|
577 | 630 |
|
| 631 | + def create_series(self): |
| 632 | + i = date_range(datetime(2005, 1, 1), |
| 633 | + datetime(2005, 1, 10), freq='D') |
| 634 | + |
| 635 | + return Series(np.arange(len(i)), index=i, name='dti') |
| 636 | + |
578 | 637 | def test_custom_grouper(self):
|
579 | 638 |
|
580 | 639 | dti = DatetimeIndex(freq='Min', start=datetime(2005, 1, 1),
|
@@ -1798,18 +1857,61 @@ def test_resmaple_dst_anchor(self):
|
1798 | 1857 | 'D Frequency')
|
1799 | 1858 |
|
1800 | 1859 |
|
1801 |
| -def _simple_ts(start, end, freq='D'): |
1802 |
| - rng = date_range(start, end, freq=freq) |
1803 |
| - return Series(np.random.randn(len(rng)), index=rng) |
| 1860 | +class TestPeriodIndex(Base, tm.TestCase): |
| 1861 | + _multiprocess_can_split_ = True |
| 1862 | + _index_factory = lambda x: period_range |
1804 | 1863 |
|
| 1864 | + def create_series(self): |
| 1865 | + i = period_range(datetime(2005, 1, 1), |
| 1866 | + datetime(2005, 1, 10), freq='D') |
1805 | 1867 |
|
1806 |
| -def _simple_pts(start, end, freq='D'): |
1807 |
| - rng = period_range(start, end, freq=freq) |
1808 |
| - return Series(np.random.randn(len(rng)), index=rng) |
| 1868 | + return Series(np.arange(len(i)), index=i, name='pi') |
1809 | 1869 |
|
| 1870 | + def test_asfreq_downsample(self): |
1810 | 1871 |
|
1811 |
| -class TestResamplePeriodIndex(tm.TestCase): |
1812 |
| - _multiprocess_can_split_ = True |
| 1872 | + # series |
| 1873 | + s = self.create_series() |
| 1874 | + expected = s.reindex(s.index.take(np.arange(0, len(s.index), 2))) |
| 1875 | + expected.index = expected.index.to_timestamp() |
| 1876 | + expected.index.freq = to_offset('2D') |
| 1877 | + |
| 1878 | + # this is a bug, this *should* return a PeriodIndex |
| 1879 | + # directly |
| 1880 | + # GH 12884 |
| 1881 | + result = s.resample('2D').asfreq() |
| 1882 | + assert_series_equal(result, expected) |
| 1883 | + |
| 1884 | + # frame |
| 1885 | + frame = s.to_frame('value') |
| 1886 | + expected = frame.reindex( |
| 1887 | + frame.index.take(np.arange(0, len(frame.index), 2))) |
| 1888 | + expected.index = expected.index.to_timestamp() |
| 1889 | + expected.index.freq = to_offset('2D') |
| 1890 | + result = frame.resample('2D').asfreq() |
| 1891 | + assert_frame_equal(result, expected) |
| 1892 | + |
| 1893 | + def test_asfreq_upsample(self): |
| 1894 | + |
| 1895 | + # this is a bug, this *should* return a PeriodIndex |
| 1896 | + # directly |
| 1897 | + # GH 12884 |
| 1898 | + s = self.create_series() |
| 1899 | + new_index = date_range(s.index[0].to_timestamp(how='start'), |
| 1900 | + (s.index[-1] + 1).to_timestamp(how='start'), |
| 1901 | + freq='1H', |
| 1902 | + closed='left') |
| 1903 | + expected = s.to_timestamp().reindex(new_index).to_period() |
| 1904 | + result = s.resample('1H').asfreq() |
| 1905 | + assert_series_equal(result, expected) |
| 1906 | + |
| 1907 | + frame = s.to_frame('value') |
| 1908 | + new_index = date_range(frame.index[0].to_timestamp(how='start'), |
| 1909 | + (frame.index[-1] + 1).to_timestamp(how='start'), |
| 1910 | + freq='1H', |
| 1911 | + closed='left') |
| 1912 | + expected = frame.to_timestamp().reindex(new_index).to_period() |
| 1913 | + result = frame.resample('1H').asfreq() |
| 1914 | + assert_frame_equal(result, expected) |
1813 | 1915 |
|
1814 | 1916 | def test_annual_upsample_D_s_f(self):
|
1815 | 1917 | self._check_annual_upsample_cases('D', 'start', 'ffill')
|
@@ -2336,6 +2438,29 @@ def test_evenly_divisible_with_no_extra_bins(self):
|
2336 | 2438 | assert_frame_equal(result, expected)
|
2337 | 2439 |
|
2338 | 2440 |
|
| 2441 | +class TestTimedeltaIndex(Base, tm.TestCase): |
| 2442 | + _multiprocess_can_split_ = True |
| 2443 | + _index_factory = lambda x: timedelta_range |
| 2444 | + |
| 2445 | + def create_series(self): |
| 2446 | + i = timedelta_range('1 day', |
| 2447 | + '10 day', freq='D') |
| 2448 | + |
| 2449 | + return Series(np.arange(len(i)), index=i, name='tdi') |
| 2450 | + |
| 2451 | + def test_asfreq_bug(self): |
| 2452 | + |
| 2453 | + import datetime as dt |
| 2454 | + df = DataFrame(data=[1, 3], |
| 2455 | + index=[dt.timedelta(), dt.timedelta(minutes=3)]) |
| 2456 | + result = df.resample('1T').asfreq() |
| 2457 | + expected = DataFrame(data=[1, np.nan, np.nan, 3], |
| 2458 | + index=timedelta_range('0 day', |
| 2459 | + periods=4, |
| 2460 | + freq='1T')) |
| 2461 | + assert_frame_equal(result, expected) |
| 2462 | + |
| 2463 | + |
2339 | 2464 | class TestTimeGrouper(tm.TestCase):
|
2340 | 2465 | def setUp(self):
|
2341 | 2466 | self.ts = Series(np.random.randn(1000),
|
|
0 commit comments