From dceb8bc314f568cdb491db4e39dc328877c917ce Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Thu, 20 Dec 2018 19:26:41 +0000 Subject: [PATCH 1/8] parametrize base class tests individually --- pandas/tests/resample/test_base.py | 423 ++++++++++++++--------------- 1 file changed, 205 insertions(+), 218 deletions(-) diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index 74003151abfb2..f5395d230be5e 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -1,5 +1,3 @@ -# pylint: disable=E1101 - from datetime import datetime, timedelta import numpy as np @@ -28,234 +26,223 @@ def _create_index(*args, **kwargs): return _create_index -class Base(object): - """ - base class for resampling testing, calling - .create_series() generates a series of each index type - """ - - @pytest.mark.parametrize('freq', ['2D', '1H']) - def test_asfreq(self, series_and_frame, freq, create_index): - obj = series_and_frame - - result = obj.resample(freq).asfreq() - new_index = create_index(obj.index[0], obj.index[-1], freq=freq) - expected = obj.reindex(new_index) - assert_almost_equal(result, expected) - - def test_asfreq_fill_value(self, create_index): - # test for fill value during resampling, issue 3715 - - s = self.create_series() - - result = s.resample('1H').asfreq() - new_index = create_index(s.index[0], s.index[-1], freq='1H') - expected = s.reindex(new_index) - assert_series_equal(result, expected) - - frame = s.to_frame('value') - frame.iloc[1] = None - result = frame.resample('1H').asfreq(fill_value=4.0) - new_index = create_index(frame.index[0], - frame.index[-1], freq='1H') - expected = frame.reindex(new_index, fill_value=4.0) - assert_frame_equal(result, expected) - - def test_resample_interpolate(self): - # # 12925 - df = self.create_series().to_frame('value') - assert_frame_equal( - df.resample('1T').asfreq().interpolate(), - df.resample('1T').interpolate()) - - def test_raises_on_non_datetimelike_index(self): - # this is a non datetimelike index - xp = DataFrame() - pytest.raises(TypeError, lambda: xp.resample('A').mean()) - - @pytest.mark.parametrize('freq', ['M', 'D', 'H']) - def test_resample_empty_series(self, freq, resample_method): - # GH12771 & GH12868 - - if resample_method == 'ohlc': - pytest.skip('need to test for ohlc from GH13083') - - s = self.create_series()[:0] - result = getattr(s.resample(freq), resample_method)() - - expected = s.copy() - expected.index = s.index._shallow_copy(freq=freq) - assert_index_equal(result.index, expected.index) - assert result.index.freq == expected.index.freq - assert_series_equal(result, expected, check_dtype=False) - - @pytest.mark.parametrize('freq', ['M', 'D', 'H']) - def test_resample_empty_dataframe(self, freq, resample_method): - # GH13212 - index = self.create_series().index[:0] - f = DataFrame(index=index) - - # count retains dimensions too - result = getattr(f.resample(freq), resample_method)() - if resample_method != 'size': - expected = f.copy() - else: - # GH14962 - expected = Series([]) - - expected.index = f.index._shallow_copy(freq=freq) - assert_index_equal(result.index, expected.index) - assert result.index.freq == expected.index.freq - assert_almost_equal(result, expected, check_dtype=False) - - # test size for GH13212 (currently stays as df) - - @pytest.mark.parametrize("index", tm.all_timeseries_index_generator(0)) - @pytest.mark.parametrize( - "dtype", - [np.float, np.int, np.object, 'datetime64[ns]']) - def test_resample_empty_dtypes(self, index, dtype, resample_method): - - # Empty series were sometimes causing a segfault (for the functions - # with Cython bounds-checking disabled) or an IndexError. We just run - # them to ensure they no longer do. (GH #10228) - empty_series = Series([], index, dtype) - try: - getattr(empty_series.resample('d'), resample_method)() - except DataError: - # Ignore these since some combinations are invalid - # (ex: doing mean with dtype of np.object) - pass - - def test_resample_loffset_arg_type(self, create_index): - # GH 13218, 15002 - df = self.create_series().to_frame('value') - expected_means = [df.values[i:i + 2].mean() - for i in range(0, len(df.values), 2)] - expected_index = create_index(df.index[0], - periods=len(df.index) / 2, - freq='2D') - - # loffset coerces PeriodIndex to DateTimeIndex - if isinstance(expected_index, PeriodIndex): - expected_index = expected_index.to_timestamp() - - expected_index += timedelta(hours=2) - expected = DataFrame({'value': expected_means}, index=expected_index) - - for arg in ['mean', {'value': 'mean'}, ['mean']]: - - result_agg = df.resample('2D', loffset='2H').agg(arg) - - with tm.assert_produces_warning(FutureWarning, - check_stacklevel=False): - result_how = df.resample('2D', how=arg, loffset='2H') - - if isinstance(arg, list): - expected.columns = pd.MultiIndex.from_tuples([('value', - 'mean')]) - - # GH 13022, 7687 - TODO: fix resample w/ TimedeltaIndex - if isinstance(expected.index, TimedeltaIndex): - with pytest.raises(AssertionError): - assert_frame_equal(result_agg, expected) - assert_frame_equal(result_how, expected) - else: - assert_frame_equal(result_agg, expected) - assert_frame_equal(result_how, expected) - - def test_apply_to_empty_series(self): - # GH 14313 - series = self.create_series()[:0] - - for freq in ['M', 'D', 'H']: - result = series.resample(freq).apply(lambda x: 1) - expected = series.resample(freq).apply(np.sum) - - assert_series_equal(result, expected, check_dtype=False) - - def test_resampler_is_iterable(self): - # GH 15314 - series = self.create_series() - freq = 'H' - tg = TimeGrouper(freq, convention='start') - grouped = series.groupby(tg) - resampled = series.resample(freq) - for (rk, rv), (gk, gv) in zip(resampled, grouped): - assert rk == gk - assert_series_equal(rv, gv) - - def test_resample_quantile(self): - # GH 15023 - s = self.create_series() - q = 0.75 - freq = 'H' - result = s.resample(freq).quantile(q) - expected = s.resample(freq).agg(lambda x: x.quantile(q)) - tm.assert_series_equal(result, expected) - - -class TestDatetimeIndex(Base): - @pytest.fixture - def _index_factory(self): - return date_range - - @pytest.fixture - def _series_name(self): - return 'dti' +@pytest.mark.parametrize('freq', ['2D', '1H']) +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_asfreq(series_and_frame, freq, create_index): + obj = series_and_frame + + result = obj.resample(freq).asfreq() + new_index = create_index(obj.index[0], obj.index[-1], freq=freq) + expected = obj.reindex(new_index) + assert_almost_equal(result, expected) + + +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_asfreq_fill_value(series, create_index): + # test for fill value during resampling, issue 3715 + + s = series + + result = s.resample('1H').asfreq() + new_index = create_index(s.index[0], s.index[-1], freq='1H') + expected = s.reindex(new_index) + assert_series_equal(result, expected) + + frame = s.to_frame('value') + frame.iloc[1] = None + result = frame.resample('1H').asfreq(fill_value=4.0) + new_index = create_index(frame.index[0], + frame.index[-1], freq='1H') + expected = frame.reindex(new_index, fill_value=4.0) + assert_frame_equal(result, expected) + + +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_resample_interpolate(series): + # # 12925 + df = series.to_frame('value') + assert_frame_equal( + df.resample('1T').asfreq().interpolate(), + df.resample('1T').interpolate()) + + +def test_raises_on_non_datetimelike_index(): + # this is a non datetimelike index + xp = DataFrame() + pytest.raises(TypeError, lambda: xp.resample('A').mean()) + + +@pytest.mark.parametrize('freq', ['M', 'D', 'H']) +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_resample_empty_series(freq, series, resample_method): + # GH12771 & GH12868 + + if resample_method == 'ohlc': + pytest.skip('need to test for ohlc from GH13083') + + s = series[:0] + result = getattr(s.resample(freq), resample_method)() + + expected = s.copy() + expected.index = s.index._shallow_copy(freq=freq) + assert_index_equal(result.index, expected.index) + assert result.index.freq == expected.index.freq + assert_series_equal(result, expected, check_dtype=False) + + +@pytest.mark.parametrize('freq', ['M', 'D', 'H']) +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_resample_empty_dataframe(series, freq, resample_method): + # GH13212 + index = series.index[:0] + f = DataFrame(index=index) + + # count retains dimensions too + result = getattr(f.resample(freq), resample_method)() + if resample_method != 'size': + expected = f.copy() + else: + # GH14962 + expected = Series([]) + + expected.index = f.index._shallow_copy(freq=freq) + assert_index_equal(result.index, expected.index) + assert result.index.freq == expected.index.freq + assert_almost_equal(result, expected, check_dtype=False) + + # test size for GH13212 (currently stays as df) + + +@pytest.mark.parametrize("index", tm.all_timeseries_index_generator(0)) +@pytest.mark.parametrize( + "dtype", + [np.float, np.int, np.object, 'datetime64[ns]']) +def test_resample_empty_dtypes(index, dtype, resample_method): + + # Empty series were sometimes causing a segfault (for the functions + # with Cython bounds-checking disabled) or an IndexError. We just run + # them to ensure they no longer do. (GH #10228) + empty_series = Series([], index, dtype) + try: + getattr(empty_series.resample('d'), resample_method)() + except DataError: + # Ignore these since some combinations are invalid + # (ex: doing mean with dtype of np.object) + pass - def create_series(self): - i = date_range(datetime(2005, 1, 1), - datetime(2005, 1, 10), freq='D') - return Series(np.arange(len(i)), index=i, name='dti') +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_resample_loffset_arg_type(series, create_index): + # GH 13218, 15002 + df = series.to_frame('value') + expected_means = [df.values[i:i + 2].mean() + for i in range(0, len(df.values), 2)] + expected_index = create_index(df.index[0], + periods=len(df.index) / 2, + freq='2D') + # loffset coerces PeriodIndex to DateTimeIndex + if isinstance(expected_index, PeriodIndex): + expected_index = expected_index.to_timestamp() -class TestPeriodIndex(Base): - @pytest.fixture - def _index_factory(self): - return period_range + expected_index += timedelta(hours=2) + expected = DataFrame({'value': expected_means}, index=expected_index) - @pytest.fixture - def _series_name(self): - return 'pi' + for arg in ['mean', {'value': 'mean'}, ['mean']]: - def create_series(self): - # TODO: replace calls to .create_series() by injecting the series - # fixture - i = period_range(datetime(2005, 1, 1), - datetime(2005, 1, 10), freq='D') + result_agg = df.resample('2D', loffset='2H').agg(arg) - return Series(np.arange(len(i)), index=i, name='pi') + with tm.assert_produces_warning(FutureWarning, + check_stacklevel=False): + result_how = df.resample('2D', how=arg, loffset='2H') - @pytest.mark.skip() - def test_asfreq(self): - pass - - @pytest.mark.skip() - def test_asfreq_fill_value(self): - pass + if isinstance(arg, list): + expected.columns = pd.MultiIndex.from_tuples([('value', + 'mean')]) + # GH 13022, 7687 - TODO: fix resample w/ TimedeltaIndex + if isinstance(expected.index, TimedeltaIndex): + with pytest.raises(AssertionError): + assert_frame_equal(result_agg, expected) + assert_frame_equal(result_how, expected) + else: + assert_frame_equal(result_agg, expected) + assert_frame_equal(result_how, expected) -class TestTimedeltaIndex(Base): - @pytest.fixture - def _index_factory(self): - return timedelta_range - @pytest.fixture - def _index_start(self): - return '1 day' +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_apply_to_empty_series(series): + # GH 14313 + series = series[:0] - @pytest.fixture - def _index_end(self): - return '10 day' + for freq in ['M', 'D', 'H']: + result = series.resample(freq).apply(lambda x: 1) + expected = series.resample(freq).apply(np.sum) - @pytest.fixture - def _series_name(self): - return 'tdi' + assert_series_equal(result, expected, check_dtype=False) - def create_series(self): - i = timedelta_range('1 day', - '10 day', freq='D') - return Series(np.arange(len(i)), index=i, name='tdi') +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_resampler_is_iterable(series): + # GH 15314 + freq = 'H' + tg = TimeGrouper(freq, convention='start') + grouped = series.groupby(tg) + resampled = series.resample(freq) + for (rk, rv), (gk, gv) in zip(resampled, grouped): + assert rk == gk + assert_series_equal(rv, gv) + + +@pytest.mark.parametrize( + '_index_factory,_series_name,_index_start,_index_end', [ + (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), + (timedelta_range, 'tdi', '1 day', '10 day') + ]) +def test_resample_quantile(series): + # GH 15023 + s = series + q = 0.75 + freq = 'H' + result = s.resample(freq).quantile(q) + expected = s.resample(freq).agg(lambda x: x.quantile(q)) + tm.assert_series_equal(result, expected) From d8c71ab8c8103f1fe8b4ffd852f383b6fd604319 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Fri, 21 Dec 2018 15:06:19 +0000 Subject: [PATCH 2/8] reduce duplication --- pandas/tests/resample/test_base.py | 71 ++++++++++++------------------ 1 file changed, 28 insertions(+), 43 deletions(-) diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index f5395d230be5e..718c5bc84580e 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -17,6 +17,14 @@ assert_almost_equal, assert_frame_equal, assert_index_equal, assert_series_equal) +# tuples of '_index_factory,_series_name,_index_start,_index_end' +DATE_RANGE = (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)) +PERIOD_RANGE = ( + period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)) +TIMEDELTA_RANGE = (timedelta_range, 'tdi', '1 day', '10 day') + +ALL_TIMESERIES_INDEXES = [DATE_RANGE, PERIOD_RANGE, TIMEDELTA_RANGE] + @pytest.fixture def create_index(_index_factory): @@ -28,10 +36,9 @@ def _create_index(*args, **kwargs): @pytest.mark.parametrize('freq', ['2D', '1H']) @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + [DATE_RANGE, TIMEDELTA_RANGE] +) def test_asfreq(series_and_frame, freq, create_index): obj = series_and_frame @@ -42,10 +49,9 @@ def test_asfreq(series_and_frame, freq, create_index): @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + [DATE_RANGE, TIMEDELTA_RANGE] +) def test_asfreq_fill_value(series, create_index): # test for fill value during resampling, issue 3715 @@ -66,11 +72,8 @@ def test_asfreq_fill_value(series, create_index): @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) def test_resample_interpolate(series): # # 12925 df = series.to_frame('value') @@ -87,11 +90,8 @@ def test_raises_on_non_datetimelike_index(): @pytest.mark.parametrize('freq', ['M', 'D', 'H']) @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) def test_resample_empty_series(freq, series, resample_method): # GH12771 & GH12868 @@ -110,11 +110,8 @@ def test_resample_empty_series(freq, series, resample_method): @pytest.mark.parametrize('freq', ['M', 'D', 'H']) @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) def test_resample_empty_dataframe(series, freq, resample_method): # GH13212 index = series.index[:0] @@ -155,11 +152,8 @@ def test_resample_empty_dtypes(index, dtype, resample_method): @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) def test_resample_loffset_arg_type(series, create_index): # GH 13218, 15002 df = series.to_frame('value') @@ -199,11 +193,8 @@ def test_resample_loffset_arg_type(series, create_index): @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) def test_apply_to_empty_series(series): # GH 14313 series = series[:0] @@ -216,11 +207,8 @@ def test_apply_to_empty_series(series): @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) def test_resampler_is_iterable(series): # GH 15314 freq = 'H' @@ -233,11 +221,8 @@ def test_resampler_is_iterable(series): @pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', [ - (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (period_range, 'pi', datetime(2005, 1, 1), datetime(2005, 1, 10)), - (timedelta_range, 'tdi', '1 day', '10 day') - ]) + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) def test_resample_quantile(series): # GH 15023 s = series From d818b8479272582da4bbb1c515aba500d923ed8f Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sat, 22 Dec 2018 18:40:39 +0000 Subject: [PATCH 3/8] add pytest_generate_tests --- pandas/tests/resample/test_base.py | 43 +++++++++++------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index 718c5bc84580e..ba7cc17f35835 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -26,6 +26,14 @@ ALL_TIMESERIES_INDEXES = [DATE_RANGE, PERIOD_RANGE, TIMEDELTA_RANGE] +def pytest_generate_tests(metafunc): + # called once per each test function + if metafunc.function.__name__.endswith('_all_ts'): + metafunc.parametrize( + '_index_factory,_series_name,_index_start,_index_end', + ALL_TIMESERIES_INDEXES) + + @pytest.fixture def create_index(_index_factory): def _create_index(*args, **kwargs): @@ -71,10 +79,7 @@ def test_asfreq_fill_value(series, create_index): assert_frame_equal(result, expected) -@pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', - ALL_TIMESERIES_INDEXES) -def test_resample_interpolate(series): +def test_resample_interpolate_all_ts(series): # # 12925 df = series.to_frame('value') assert_frame_equal( @@ -89,10 +94,7 @@ def test_raises_on_non_datetimelike_index(): @pytest.mark.parametrize('freq', ['M', 'D', 'H']) -@pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', - ALL_TIMESERIES_INDEXES) -def test_resample_empty_series(freq, series, resample_method): +def test_resample_empty_series_all_ts(freq, series, resample_method): # GH12771 & GH12868 if resample_method == 'ohlc': @@ -109,10 +111,7 @@ def test_resample_empty_series(freq, series, resample_method): @pytest.mark.parametrize('freq', ['M', 'D', 'H']) -@pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', - ALL_TIMESERIES_INDEXES) -def test_resample_empty_dataframe(series, freq, resample_method): +def test_resample_empty_dataframe_all_ts(series, freq, resample_method): # GH13212 index = series.index[:0] f = DataFrame(index=index) @@ -151,10 +150,7 @@ def test_resample_empty_dtypes(index, dtype, resample_method): pass -@pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', - ALL_TIMESERIES_INDEXES) -def test_resample_loffset_arg_type(series, create_index): +def test_resample_loffset_arg_type_all_ts(series, create_index): # GH 13218, 15002 df = series.to_frame('value') expected_means = [df.values[i:i + 2].mean() @@ -192,10 +188,7 @@ def test_resample_loffset_arg_type(series, create_index): assert_frame_equal(result_how, expected) -@pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', - ALL_TIMESERIES_INDEXES) -def test_apply_to_empty_series(series): +def test_apply_to_empty_series_all_ts(series): # GH 14313 series = series[:0] @@ -206,10 +199,7 @@ def test_apply_to_empty_series(series): assert_series_equal(result, expected, check_dtype=False) -@pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', - ALL_TIMESERIES_INDEXES) -def test_resampler_is_iterable(series): +def test_resampler_is_iterable_all_ts(series): # GH 15314 freq = 'H' tg = TimeGrouper(freq, convention='start') @@ -220,10 +210,7 @@ def test_resampler_is_iterable(series): assert_series_equal(rv, gv) -@pytest.mark.parametrize( - '_index_factory,_series_name,_index_start,_index_end', - ALL_TIMESERIES_INDEXES) -def test_resample_quantile(series): +def test_resample_quantile_all_ts(series): # GH 15023 s = series q = 0.75 From 9b3209171714b033c21d2784d8e9448e0674ce54 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sat, 22 Dec 2018 19:03:57 +0000 Subject: [PATCH 4/8] use frame fixture --- pandas/tests/resample/conftest.py | 3 ++- pandas/tests/resample/test_base.py | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pandas/tests/resample/conftest.py b/pandas/tests/resample/conftest.py index d5b32891ea1df..0fb2f97356036 100644 --- a/pandas/tests/resample/conftest.py +++ b/pandas/tests/resample/conftest.py @@ -86,7 +86,8 @@ def series(index, _series_name, _static_values): @pytest.fixture -def frame(index, _static_values): +def frame(index, _series_name, _static_values): + # _series_name is intentionally unused return DataFrame({'value': _static_values}, index=index) diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index ba7cc17f35835..d14fa003ee0d5 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -79,9 +79,9 @@ def test_asfreq_fill_value(series, create_index): assert_frame_equal(result, expected) -def test_resample_interpolate_all_ts(series): +def test_resample_interpolate_all_ts(frame): # # 12925 - df = series.to_frame('value') + df = frame assert_frame_equal( df.resample('1T').asfreq().interpolate(), df.resample('1T').interpolate()) @@ -150,9 +150,9 @@ def test_resample_empty_dtypes(index, dtype, resample_method): pass -def test_resample_loffset_arg_type_all_ts(series, create_index): +def test_resample_loffset_arg_type_all_ts(frame, create_index): # GH 13218, 15002 - df = series.to_frame('value') + df = frame expected_means = [df.values[i:i + 2].mean() for i in range(0, len(df.values), 2)] expected_index = create_index(df.index[0], From c25b33cfbca26649b178152f634540af28369c53 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sat, 22 Dec 2018 19:12:22 +0000 Subject: [PATCH 5/8] create empty_series fixture --- pandas/tests/resample/conftest.py | 5 +++++ pandas/tests/resample/test_base.py | 13 ++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/pandas/tests/resample/conftest.py b/pandas/tests/resample/conftest.py index 0fb2f97356036..51f436a09dd2b 100644 --- a/pandas/tests/resample/conftest.py +++ b/pandas/tests/resample/conftest.py @@ -85,6 +85,11 @@ def series(index, _series_name, _static_values): return Series(_static_values, index=index, name=_series_name) +@pytest.fixture +def empty_series(series): + return series[:0] + + @pytest.fixture def frame(index, _series_name, _static_values): # _series_name is intentionally unused diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index d14fa003ee0d5..374080caf8398 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -94,13 +94,13 @@ def test_raises_on_non_datetimelike_index(): @pytest.mark.parametrize('freq', ['M', 'D', 'H']) -def test_resample_empty_series_all_ts(freq, series, resample_method): +def test_resample_empty_series_all_ts(freq, empty_series, resample_method): # GH12771 & GH12868 if resample_method == 'ohlc': pytest.skip('need to test for ohlc from GH13083') - s = series[:0] + s = empty_series result = getattr(s.resample(freq), resample_method)() expected = s.copy() @@ -188,13 +188,12 @@ def test_resample_loffset_arg_type_all_ts(frame, create_index): assert_frame_equal(result_how, expected) -def test_apply_to_empty_series_all_ts(series): +def test_apply_to_empty_series_all_ts(empty_series): # GH 14313 - series = series[:0] - + s = empty_series for freq in ['M', 'D', 'H']: - result = series.resample(freq).apply(lambda x: 1) - expected = series.resample(freq).apply(np.sum) + result = s.resample(freq).apply(lambda x: 1) + expected = s.resample(freq).apply(np.sum) assert_series_equal(result, expected, check_dtype=False) From 3a8d8b1aac4b10d4223a95a2a4620cf5b83c5c10 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sat, 22 Dec 2018 19:24:09 +0000 Subject: [PATCH 6/8] create empty_frame fixture --- pandas/tests/resample/conftest.py | 6 ++++++ pandas/tests/resample/test_base.py | 12 +++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/pandas/tests/resample/conftest.py b/pandas/tests/resample/conftest.py index 51f436a09dd2b..b84f88da85cc0 100644 --- a/pandas/tests/resample/conftest.py +++ b/pandas/tests/resample/conftest.py @@ -96,6 +96,12 @@ def frame(index, _series_name, _static_values): return DataFrame({'value': _static_values}, index=index) +@pytest.fixture +def empty_frame(series): + index = series.index[:0] + return DataFrame(index=index) + + @pytest.fixture(params=[Series, DataFrame]) def series_and_frame(request, series, frame): if request.param == Series: diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index 374080caf8398..894a5b27c0889 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -111,20 +111,18 @@ def test_resample_empty_series_all_ts(freq, empty_series, resample_method): @pytest.mark.parametrize('freq', ['M', 'D', 'H']) -def test_resample_empty_dataframe_all_ts(series, freq, resample_method): +def test_resample_empty_dataframe_all_ts(empty_frame, freq, resample_method): # GH13212 - index = series.index[:0] - f = DataFrame(index=index) - + df = empty_frame # count retains dimensions too - result = getattr(f.resample(freq), resample_method)() + result = getattr(df.resample(freq), resample_method)() if resample_method != 'size': - expected = f.copy() + expected = df.copy() else: # GH14962 expected = Series([]) - expected.index = f.index._shallow_copy(freq=freq) + expected.index = df.index._shallow_copy(freq=freq) assert_index_equal(result.index, expected.index) assert result.index.freq == expected.index.freq assert_almost_equal(result, expected, check_dtype=False) From 6da825212dadcb68cef264c551666f65debcc6ef Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 23 Dec 2018 18:24:03 +0000 Subject: [PATCH 7/8] add code comment --- pandas/tests/resample/test_base.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index 894a5b27c0889..6f320417fd960 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -17,6 +17,11 @@ assert_almost_equal, assert_frame_equal, assert_index_equal, assert_series_equal) +# a fixture value can be overridden by the test parameter value. Note that the +# value of the fixture can be overridden this way even if the test doesn’t use +# it directly (doesn’t mention it in the function prototype). +# see https://docs.pytest.org/en/latest/fixture.html#override-a-fixture-with-direct-test-parametrization # noqa +# in this module we override the fixture values defined in conftest.py # tuples of '_index_factory,_series_name,_index_start,_index_end' DATE_RANGE = (date_range, 'dti', datetime(2005, 1, 1), datetime(2005, 1, 10)) PERIOD_RANGE = ( From f7092c214621fcd4b51764263c0372841a649a98 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 23 Dec 2018 19:07:00 +0000 Subject: [PATCH 8/8] replace non-ASCII characters --- pandas/tests/resample/test_base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index 6f320417fd960..31199dc01b659 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -18,8 +18,8 @@ assert_series_equal) # a fixture value can be overridden by the test parameter value. Note that the -# value of the fixture can be overridden this way even if the test doesn’t use -# it directly (doesn’t mention it in the function prototype). +# value of the fixture can be overridden this way even if the test doesn't use +# it directly (doesn't mention it in the function prototype). # see https://docs.pytest.org/en/latest/fixture.html#override-a-fixture-with-direct-test-parametrization # noqa # in this module we override the fixture values defined in conftest.py # tuples of '_index_factory,_series_name,_index_start,_index_end'