From 8a536bedfca3b341e781ebf876f8ea410ee8d2dd Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Wed, 25 Mar 2020 13:47:53 -0700 Subject: [PATCH 1/4] REF: series.__getitem__ tests --- pandas/tests/series/indexing/test_getitem.py | 41 ++++++++++++++++++++ pandas/tests/series/test_period.py | 12 ------ pandas/tests/series/test_timeseries.py | 12 ------ 3 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 pandas/tests/series/indexing/test_getitem.py diff --git a/pandas/tests/series/indexing/test_getitem.py b/pandas/tests/series/indexing/test_getitem.py new file mode 100644 index 0000000000000..4465e65e599a2 --- /dev/null +++ b/pandas/tests/series/indexing/test_getitem.py @@ -0,0 +1,41 @@ +""" +Series.__getitem__ test classes are organized by the type of key passed. +""" + +import numpy as np + +import pandas as pd +from pandas import Series, period_range +import pandas._testing as tm + + +class TestSeriesGetitemScalars: + pass + + +class TestSeriesGetitemSlices: + def test_getitem_slice_2d(self, datetime_series): + + # This is currently failing because the test was relying on + # the DeprecationWarning coming through Index.__getitem__. + # We want to implement a warning specifically for Series.__getitem__ + # at which point this will become a Deprecation/FutureWarning + with tm.assert_produces_warning(None): + # GH#30588 multi-dimensional indexing deprecated + result = datetime_series[:, np.newaxis] + expected = datetime_series.values[:, np.newaxis] + tm.assert_almost_equal(result, expected) + + +class TestGetitemListLike: + def test_getitem_intlist_intindex_periodvalues(self): + ser = Series(period_range("2000-01-01", periods=10, freq="D")) + + result = ser[[2, 4]] + exp = pd.Series( + [pd.Period("2000-01-03", freq="D"), pd.Period("2000-01-05", freq="D")], + index=[2, 4], + dtype="Period[D]", + ) + tm.assert_series_equal(result, exp) + assert result.dtype == "Period[D]" diff --git a/pandas/tests/series/test_period.py b/pandas/tests/series/test_period.py index f41245c2872a7..a1c910366e84d 100644 --- a/pandas/tests/series/test_period.py +++ b/pandas/tests/series/test_period.py @@ -20,18 +20,6 @@ def test_auto_conversion(self): ) assert series.dtype == "Period[D]" - def test_getitem(self): - assert self.series[1] == pd.Period("2000-01-02", freq="D") - - result = self.series[[2, 4]] - exp = pd.Series( - [pd.Period("2000-01-03", freq="D"), pd.Period("2000-01-05", freq="D")], - index=[2, 4], - dtype="Period[D]", - ) - tm.assert_series_equal(result, exp) - assert result.dtype == "Period[D]" - def test_isna(self): # GH 13737 s = Series([pd.Period("2011-01", freq="M"), pd.Period("NaT", freq="M")]) diff --git a/pandas/tests/series/test_timeseries.py b/pandas/tests/series/test_timeseries.py index 6ca67b6cc8429..3c3108835416a 100644 --- a/pandas/tests/series/test_timeseries.py +++ b/pandas/tests/series/test_timeseries.py @@ -7,18 +7,6 @@ class TestTimeSeries: - def test_mpl_compat_hack(self, datetime_series): - - # This is currently failing because the test was relying on - # the DeprecationWarning coming through Index.__getitem__. - # We want to implement a warning specifically for Series.__getitem__ - # at which point this will become a Deprecation/FutureWarning - with tm.assert_produces_warning(None): - # GH#30588 multi-dimensional indexing deprecated - result = datetime_series[:, np.newaxis] - expected = datetime_series.values[:, np.newaxis] - tm.assert_almost_equal(result, expected) - def test_timeseries_coercion(self): idx = tm.makeDateIndex(10000) ser = Series(np.random.randn(len(idx)), idx.astype(object)) From 9cfebed45da6499346e2deef6208ad7fe785e839 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Wed, 25 Mar 2020 15:37:37 -0700 Subject: [PATCH 2/4] Remove duplicate test --- pandas/tests/series/indexing/test_getitem.py | 7 +++++-- pandas/tests/series/indexing/test_indexing.py | 10 ---------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/pandas/tests/series/indexing/test_getitem.py b/pandas/tests/series/indexing/test_getitem.py index 4465e65e599a2..8c7e428e5d388 100644 --- a/pandas/tests/series/indexing/test_getitem.py +++ b/pandas/tests/series/indexing/test_getitem.py @@ -15,19 +15,22 @@ class TestSeriesGetitemScalars: class TestSeriesGetitemSlices: def test_getitem_slice_2d(self, datetime_series): + # GH#30588 multi-dimensional indexing deprecated # This is currently failing because the test was relying on # the DeprecationWarning coming through Index.__getitem__. # We want to implement a warning specifically for Series.__getitem__ # at which point this will become a Deprecation/FutureWarning with tm.assert_produces_warning(None): - # GH#30588 multi-dimensional indexing deprecated + # GH#30867 Don't want to support this long-term, but + # for now ensure that the warning from Index + # doesn't comes through via Series.__getitem__. result = datetime_series[:, np.newaxis] expected = datetime_series.values[:, np.newaxis] tm.assert_almost_equal(result, expected) -class TestGetitemListLike: +class TestSeriesGetitemListLike: def test_getitem_intlist_intindex_periodvalues(self): ser = Series(period_range("2000-01-01", periods=10, freq="D")) diff --git a/pandas/tests/series/indexing/test_indexing.py b/pandas/tests/series/indexing/test_indexing.py index 5b3786e1a0d3c..919659a5de662 100644 --- a/pandas/tests/series/indexing/test_indexing.py +++ b/pandas/tests/series/indexing/test_indexing.py @@ -915,16 +915,6 @@ def test_uint_drop(any_int_dtype): tm.assert_series_equal(series, expected) -def test_getitem_2d_no_warning(): - # https://github.com/pandas-dev/pandas/issues/30867 - # Don't want to support this long-term, but - # for now ensure that the warning from Index - # doesn't comes through via Series.__getitem__. - series = pd.Series([1, 2, 3], index=[1, 2, 3]) - with tm.assert_produces_warning(None): - series[:, None] - - def test_getitem_unrecognized_scalar(): # GH#32684 a scalar key that is not recognized by lib.is_scalar From 95e157b951399049daee62d41e82aaf1260c2753 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Tue, 31 Mar 2020 12:35:31 -0700 Subject: [PATCH 3/4] REF: collect tests --- pandas/tests/frame/methods/test_duplicated.py | 14 ++++- pandas/tests/series/indexing/test_datetime.py | 26 --------- pandas/tests/series/indexing/test_getitem.py | 54 ++++++++++++++++++- pandas/tests/series/indexing/test_indexing.py | 9 ---- pandas/tests/series/test_timezones.py | 26 +-------- 5 files changed, 66 insertions(+), 63 deletions(-) diff --git a/pandas/tests/frame/methods/test_duplicated.py b/pandas/tests/frame/methods/test_duplicated.py index 34751b565a24b..82fd6d88b82b9 100644 --- a/pandas/tests/frame/methods/test_duplicated.py +++ b/pandas/tests/frame/methods/test_duplicated.py @@ -3,7 +3,7 @@ import numpy as np import pytest -from pandas import DataFrame, Series +from pandas import DataFrame, Series, date_range import pandas._testing as tm @@ -95,3 +95,15 @@ def test_duplicated_on_empty_frame(): result = df[dupes] expected = df.copy() tm.assert_frame_equal(result, expected) + + +def test_frame_datetime64_duplicated(): + dates = date_range("2010-07-01", end="2010-08-05") + + tst = DataFrame({"symbol": "AAA", "date": dates}) + result = tst.duplicated(["date", "symbol"]) + assert (-result).all() + + tst = DataFrame({"date": dates}) + result = tst.duplicated() + assert (-result).all() diff --git a/pandas/tests/series/indexing/test_datetime.py b/pandas/tests/series/indexing/test_datetime.py index b5d04fd499c08..3bb6013944042 100644 --- a/pandas/tests/series/indexing/test_datetime.py +++ b/pandas/tests/series/indexing/test_datetime.py @@ -130,18 +130,6 @@ def test_slicing_datetimes(): tm.assert_frame_equal(result, expected) -def test_frame_datetime64_duplicated(): - dates = date_range("2010-07-01", end="2010-08-05") - - tst = DataFrame({"symbol": "AAA", "date": dates}) - result = tst.duplicated(["date", "symbol"]) - assert (-result).all() - - tst = DataFrame({"date": dates}) - result = tst.duplicated() - assert (-result).all() - - def test_getitem_setitem_datetime_tz_pytz(): from pytz import timezone as tz @@ -353,20 +341,6 @@ def test_getitem_setitem_periodindex(): tm.assert_series_equal(result, ts) -# FutureWarning from NumPy. -@pytest.mark.filterwarnings("ignore:Using a non-tuple:FutureWarning") -def test_getitem_median_slice_bug(): - index = date_range("20090415", "20090519", freq="2B") - s = Series(np.random.randn(13), index=index) - - indexer = [slice(6, 7, None)] - with tm.assert_produces_warning(FutureWarning): - # GH#31299 - result = s[indexer] - expected = s[indexer[0]] - tm.assert_series_equal(result, expected) - - def test_datetime_indexing(): index = date_range("1/1/2000", "1/7/2000") diff --git a/pandas/tests/series/indexing/test_getitem.py b/pandas/tests/series/indexing/test_getitem.py index 8c7e428e5d388..fa0289d2fc478 100644 --- a/pandas/tests/series/indexing/test_getitem.py +++ b/pandas/tests/series/indexing/test_getitem.py @@ -1,16 +1,44 @@ """ Series.__getitem__ test classes are organized by the type of key passed. """ +from datetime import datetime import numpy as np +import pytest + +from pandas._libs.tslibs import conversion, timezones import pandas as pd -from pandas import Series, period_range +from pandas import Series, Timestamp, date_range, period_range import pandas._testing as tm class TestSeriesGetitemScalars: - pass + + # ------------------------------------------------------------------ + # Series with DatetimeIndex + + @pytest.mark.parametrize("tzstr", ["Europe/Berlin", "dateutil/Europe/Berlin"]) + def test_getitem_pydatetime_tz(self, tzstr): + tz = timezones.maybe_get_tz(tzstr) + + index = date_range( + start="2012-12-24 16:00", end="2012-12-24 18:00", freq="H", tz=tzstr + ) + ts = Series(index=index, data=index.hour) + time_pandas = Timestamp("2012-12-24 17:00", tz=tzstr) + + dt = datetime(2012, 12, 24, 17, 0) + time_datetime = conversion.localize_pydatetime(dt, tz) + assert ts[time_pandas] == ts[time_datetime] + + @pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"]) + def test_string_index_alias_tz_aware(self, tz): + rng = date_range("1/1/2000", periods=10, tz=tz) + ser = Series(np.random.randn(len(rng)), index=rng) + + result = ser["1/3/2000"] + tm.assert_almost_equal(result, ser[2]) class TestSeriesGetitemSlices: @@ -29,6 +57,19 @@ def test_getitem_slice_2d(self, datetime_series): expected = datetime_series.values[:, np.newaxis] tm.assert_almost_equal(result, expected) + # FutureWarning from NumPy. + @pytest.mark.filterwarnings("ignore:Using a non-tuple:FutureWarning") + def test_getitem_median_slice_bug(self): + index = date_range("20090415", "20090519", freq="2B") + s = Series(np.random.randn(13), index=index) + + indexer = [slice(6, 7, None)] + with tm.assert_produces_warning(FutureWarning): + # GH#31299 + result = s[indexer] + expected = s[indexer[0]] + tm.assert_series_equal(result, expected) + class TestSeriesGetitemListLike: def test_getitem_intlist_intindex_periodvalues(self): @@ -42,3 +83,12 @@ def test_getitem_intlist_intindex_periodvalues(self): ) tm.assert_series_equal(result, exp) assert result.dtype == "Period[D]" + + +def test_getitem_generator(string_series): + gen = (x > 0 for x in string_series) + result = string_series[gen] + result2 = string_series[iter(string_series > 0)] + expected = string_series[string_series > 0] + tm.assert_series_equal(result, expected) + tm.assert_series_equal(result2, expected) diff --git a/pandas/tests/series/indexing/test_indexing.py b/pandas/tests/series/indexing/test_indexing.py index 3a3e8a93e22b5..522ed4df96ad2 100644 --- a/pandas/tests/series/indexing/test_indexing.py +++ b/pandas/tests/series/indexing/test_indexing.py @@ -119,15 +119,6 @@ def test_getitem_fancy(string_series, object_series): assert object_series[2] == slice2[1] -def test_getitem_generator(string_series): - gen = (x > 0 for x in string_series) - result = string_series[gen] - result2 = string_series[iter(string_series > 0)] - expected = string_series[string_series > 0] - tm.assert_series_equal(result, expected) - tm.assert_series_equal(result2, expected) - - def test_type_promotion(): # GH12599 s = pd.Series(dtype=object) diff --git a/pandas/tests/series/test_timezones.py b/pandas/tests/series/test_timezones.py index dfff1d581fe44..05792dc4f00d2 100644 --- a/pandas/tests/series/test_timezones.py +++ b/pandas/tests/series/test_timezones.py @@ -7,9 +7,7 @@ import numpy as np import pytest -from pandas._libs.tslibs import conversion, timezones - -from pandas import Series, Timestamp +from pandas import Series import pandas._testing as tm from pandas.core.indexes.datetimes import date_range @@ -29,28 +27,6 @@ def test_dateutil_tzoffset_support(self): # it works! #2443 repr(series.index[0]) - @pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"]) - def test_string_index_alias_tz_aware(self, tz): - rng = date_range("1/1/2000", periods=10, tz=tz) - ser = Series(np.random.randn(len(rng)), index=rng) - - result = ser["1/3/2000"] - tm.assert_almost_equal(result, ser[2]) - - @pytest.mark.parametrize("tzstr", ["Europe/Berlin", "dateutil/Europe/Berlin"]) - def test_getitem_pydatetime_tz(self, tzstr): - tz = timezones.maybe_get_tz(tzstr) - - index = date_range( - start="2012-12-24 16:00", end="2012-12-24 18:00", freq="H", tz=tzstr - ) - ts = Series(index=index, data=index.hour) - time_pandas = Timestamp("2012-12-24 17:00", tz=tzstr) - - dt = datetime(2012, 12, 24, 17, 0) - time_datetime = conversion.localize_pydatetime(dt, tz) - assert ts[time_pandas] == ts[time_datetime] - @pytest.mark.parametrize("copy", [True, False]) @pytest.mark.parametrize( "method, tz", [["tz_localize", None], ["tz_convert", "Europe/Berlin"]] From 150c000e468f15c2fa5c9c45bb5948a28450da59 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Tue, 31 Mar 2020 16:28:35 -0700 Subject: [PATCH 4/4] collect --- pandas/tests/series/indexing/test_getitem.py | 6 ++++++ pandas/tests/series/indexing/test_numeric.py | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/tests/series/indexing/test_getitem.py b/pandas/tests/series/indexing/test_getitem.py index fa0289d2fc478..a49bd6d59d01b 100644 --- a/pandas/tests/series/indexing/test_getitem.py +++ b/pandas/tests/series/indexing/test_getitem.py @@ -15,6 +15,12 @@ class TestSeriesGetitemScalars: + # TODO: better name/GH ref? + def test_getitem_regression(self): + ser = Series(range(5), index=list(range(5))) + result = ser[list(range(5))] + tm.assert_series_equal(result, ser) + # ------------------------------------------------------------------ # Series with DatetimeIndex diff --git a/pandas/tests/series/indexing/test_numeric.py b/pandas/tests/series/indexing/test_numeric.py index 5a648cc588957..b5bef46e95ec2 100644 --- a/pandas/tests/series/indexing/test_numeric.py +++ b/pandas/tests/series/indexing/test_numeric.py @@ -40,12 +40,6 @@ def test_getitem_negative_out_of_bounds(): s[-11] = "foo" -def test_getitem_regression(): - s = Series(range(5), index=list(range(5))) - result = s[list(range(5))] - tm.assert_series_equal(result, s) - - def test_getitem_setitem_slice_bug(): s = Series(range(10), index=list(range(10))) result = s[-12:]