From f694171b94b0fda1e099eff22be2f1214b49b9b4 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 23 Dec 2018 15:32:44 +0000 Subject: [PATCH 1/6] move .xs tests to test_xs.py --- .../tests/indexing/multiindex/test_getitem.py | 25 +----------------- pandas/tests/indexing/multiindex/test_xs.py | 26 ++++++++++++++++++- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/pandas/tests/indexing/multiindex/test_getitem.py b/pandas/tests/indexing/multiindex/test_getitem.py index 1013bb3e90149..b2e1714b2016b 100644 --- a/pandas/tests/indexing/multiindex/test_getitem.py +++ b/pandas/tests/indexing/multiindex/test_getitem.py @@ -4,7 +4,7 @@ from pandas.compat import lrange, range, u, zip import pandas as pd -from pandas import DataFrame, Index, MultiIndex, Series, date_range +from pandas import DataFrame, Index, MultiIndex, Series import pandas.core.common as com from pandas.util import testing as tm @@ -27,29 +27,6 @@ def test_series_getitem_multiindex(access_method, level1_value, expected): tm.assert_series_equal(result, expected) -def test_series_getitem_multiindex_xs(): - # GH6258 - dt = list(date_range('20130903', periods=3)) - idx = MultiIndex.from_product([list('AB'), dt]) - s = Series([1, 3, 4, 1, 3, 4], index=idx) - - result = s.xs('20130903', level=1) - expected = Series([1, 1], index=list('AB')) - tm.assert_series_equal(result, expected) - - -def test_series_getitem_multiindex_xs_by_label(): - # GH5684 - idx = MultiIndex.from_tuples([('a', 'one'), ('a', 'two'), ('b', 'one'), - ('b', 'two')]) - s = Series([1, 2, 3, 4], index=idx) - s.index.set_names(['L1', 'L2'], inplace=True) - result = s.xs('one', level='L2') - expected = Series([1, 3], index=['a', 'b']) - expected.index.set_names(['L1'], inplace=True) - tm.assert_series_equal(result, expected) - - @pytest.mark.parametrize('level0_value', ['D', 'A']) def test_getitem_duplicates_multiindex(level0_value): # GH 5725 the 'A' happens to be a valid Timestamp so the doesn't raise diff --git a/pandas/tests/indexing/multiindex/test_xs.py b/pandas/tests/indexing/multiindex/test_xs.py index 4a8e95b240e39..f776d26eec9dc 100644 --- a/pandas/tests/indexing/multiindex/test_xs.py +++ b/pandas/tests/indexing/multiindex/test_xs.py @@ -3,7 +3,7 @@ from pandas.compat import lrange, product as cart_product -from pandas import DataFrame, Index, MultiIndex, concat +from pandas import DataFrame, Index, MultiIndex, concat, Series, date_range import pandas.core.common as com from pandas.util import testing as tm @@ -211,3 +211,27 @@ def test_xs_level_series_slice_not_implemented( msg = r'\(2000, slice\(3, 4, None\)\)' with pytest.raises(TypeError, match=msg): s[2000, 3:4] + + +def test_series_getitem_multiindex_xs(): + # GH6258 + dt = list(date_range('20130903', periods=3)) + idx = MultiIndex.from_product([list('AB'), dt]) + s = Series([1, 3, 4, 1, 3, 4], index=idx) + expected = Series([1, 1], index=list('AB')) + + result = s.xs('20130903', level=1) + tm.assert_series_equal(result, expected) + + +def test_series_getitem_multiindex_xs_by_label(): + # GH5684 + idx = MultiIndex.from_tuples([('a', 'one'), ('a', 'two'), ('b', 'one'), + ('b', 'two')]) + s = Series([1, 2, 3, 4], index=idx) + s.index.set_names(['L1', 'L2'], inplace=True) + expected = Series([1, 3], index=['a', 'b']) + expected.index.set_names(['L1'], inplace=True) + + result = s.xs('one', level='L2') + tm.assert_series_equal(result, expected) From 44d14e2aa16c321f98ed8b494249d6639239e84f Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 23 Dec 2018 17:02:06 +0000 Subject: [PATCH 2/6] split test_series_getitem --- .../tests/indexing/multiindex/test_getitem.py | 56 ++++++++++++------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/pandas/tests/indexing/multiindex/test_getitem.py b/pandas/tests/indexing/multiindex/test_getitem.py index b2e1714b2016b..2af4b4c62c68a 100644 --- a/pandas/tests/indexing/multiindex/test_getitem.py +++ b/pandas/tests/indexing/multiindex/test_getitem.py @@ -135,36 +135,52 @@ def test_getitem_simple(multiindex_dataframe_random_data): df['foobar'] -@pytest.mark.filterwarnings("ignore:\\n.ix:DeprecationWarning") -def test_series_getitem(multiindex_year_month_day_dataframe_random_data): - ymd = multiindex_year_month_day_dataframe_random_data - s = ymd['A'] - - result = s[2000, 3] - - # TODO(wesm): unused? - # result2 = s.loc[2000, 3] - +@pytest.mark.parametrize('indexer', [ + lambda s: s[2000, 3], + lambda s: s.loc[2000, 3] +]) +def test_series_getitem( + multiindex_year_month_day_dataframe_random_data, indexer): + s = multiindex_year_month_day_dataframe_random_data['A'] expected = s.reindex(s.index[42:65]) expected.index = expected.index.droplevel(0).droplevel(0) + + result = indexer(s) tm.assert_series_equal(result, expected) - result = s[2000, 3, 10] - expected = s[49] + +@pytest.mark.parametrize('indexer', [ + lambda s: s[2000, 3, 10], + lambda s: s.loc[2000, 3, 10] +]) +def test_series_getitem_returns_scalar( + multiindex_year_month_day_dataframe_random_data, indexer): + s = multiindex_year_month_day_dataframe_random_data['A'] + expected = s.iloc[49] + + result = indexer(s) assert result == expected - # fancy + +@pytest.mark.filterwarnings("ignore:\\n.ix:DeprecationWarning") +@pytest.mark.parametrize('indexer', [ + lambda s: s.loc[[(2000, 3, 10), (2000, 3, 13)]], + lambda s: s.ix[[(2000, 3, 10), (2000, 3, 13)]] +]) +def test_series_getitem_fancy( + multiindex_year_month_day_dataframe_random_data, indexer): + s = multiindex_year_month_day_dataframe_random_data['A'] expected = s.reindex(s.index[49:51]) - result = s.loc[[(2000, 3, 10), (2000, 3, 13)]] - tm.assert_series_equal(result, expected) - result = s.ix[[(2000, 3, 10), (2000, 3, 13)]] + result = indexer(s) tm.assert_series_equal(result, expected) - # key error - msg = "356" - with pytest.raises(KeyError, match=msg): - s.__getitem__((2000, 3, 4)) + +def test_series_getitem_raises_key_error( + multiindex_year_month_day_dataframe_random_data): + s = multiindex_year_month_day_dataframe_random_data['A'] + with pytest.raises(KeyError, match="356"): + s[(2000, 3, 4)] def test_series_getitem_corner( From a5a518ed750ea4e074546f003154144210da7d00 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 24 Dec 2018 10:20:43 +0000 Subject: [PATCH 3/6] split test_series_getitem_corner --- .../tests/indexing/multiindex/test_getitem.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pandas/tests/indexing/multiindex/test_getitem.py b/pandas/tests/indexing/multiindex/test_getitem.py index 2af4b4c62c68a..539b888d9d617 100644 --- a/pandas/tests/indexing/multiindex/test_getitem.py +++ b/pandas/tests/indexing/multiindex/test_getitem.py @@ -183,18 +183,19 @@ def test_series_getitem_raises_key_error( s[(2000, 3, 4)] -def test_series_getitem_corner( +def test_series_getitem_corner_out_of_bound( multiindex_year_month_day_dataframe_random_data): - ymd = multiindex_year_month_day_dataframe_random_data - s = ymd['A'] - - # don't segfault, GH #495 - # out of bounds access + # see gh-495 + # don't segfault on out of bounds access + s = multiindex_year_month_day_dataframe_random_data['A'] msg = "index out of bounds" with pytest.raises(IndexError, match=msg): - s.__getitem__(len(ymd)) + s[len(s)] + - # generator +def test_series_getitem_corner_generator( + multiindex_year_month_day_dataframe_random_data): + s = multiindex_year_month_day_dataframe_random_data['A'] result = s[(x > 0 for x in s)] expected = s[s > 0] tm.assert_series_equal(result, expected) From 68bf8a5f0d5529a3d15e20a04488c53c3efaa2c4 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 24 Dec 2018 10:57:46 +0000 Subject: [PATCH 4/6] merge series indexing error tests --- .../tests/indexing/multiindex/test_getitem.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pandas/tests/indexing/multiindex/test_getitem.py b/pandas/tests/indexing/multiindex/test_getitem.py index 539b888d9d617..881e29bcf26e6 100644 --- a/pandas/tests/indexing/multiindex/test_getitem.py +++ b/pandas/tests/indexing/multiindex/test_getitem.py @@ -6,6 +6,7 @@ import pandas as pd from pandas import DataFrame, Index, MultiIndex, Series import pandas.core.common as com +from pandas.core.indexing import IndexingError from pandas.util import testing as tm @@ -176,21 +177,20 @@ def test_series_getitem_fancy( tm.assert_series_equal(result, expected) -def test_series_getitem_raises_key_error( - multiindex_year_month_day_dataframe_random_data): - s = multiindex_year_month_day_dataframe_random_data['A'] - with pytest.raises(KeyError, match="356"): - s[(2000, 3, 4)] - - -def test_series_getitem_corner_out_of_bound( - multiindex_year_month_day_dataframe_random_data): - # see gh-495 - # don't segfault on out of bounds access +@pytest.mark.parametrize('indexer,error,msg', [ + (lambda s: s.__getitem__((2000, 3, 4)), KeyError, '356'), + (lambda s: s[(2000, 3, 4)], KeyError, '356'), + (lambda s: s.loc[(2000, 3, 4)], IndexingError, 'Too many indexers'), + (lambda s: s.__getitem__(len(s)), IndexError, 'index out of bounds'), + (lambda s: s[len(s)], IndexError, 'index out of bounds'), + (lambda s: s.iloc[len(s)], IndexError, + 'single positional indexer is out-of-bounds') +]) +def test_series_getitem_indexing_errors( + multiindex_year_month_day_dataframe_random_data, indexer, error, msg): s = multiindex_year_month_day_dataframe_random_data['A'] - msg = "index out of bounds" - with pytest.raises(IndexError, match=msg): - s[len(s)] + with pytest.raises(error, match=msg): + indexer(s) def test_series_getitem_corner_generator( From dce2fcd83e4ceabed1970531c228c2ad7a4dc1f4 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 24 Dec 2018 11:07:23 +0000 Subject: [PATCH 5/6] split test_getitem_simple --- .../tests/indexing/multiindex/test_getitem.py | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/pandas/tests/indexing/multiindex/test_getitem.py b/pandas/tests/indexing/multiindex/test_getitem.py index 881e29bcf26e6..6354757de9bb5 100644 --- a/pandas/tests/indexing/multiindex/test_getitem.py +++ b/pandas/tests/indexing/multiindex/test_getitem.py @@ -123,17 +123,21 @@ def test_getitem_duplicates_multiindex_non_scalar_type_object(): def test_getitem_simple(multiindex_dataframe_random_data): - frame = multiindex_dataframe_random_data - df = frame.T + df = multiindex_dataframe_random_data.T + expected = df.values[:, 0] + result = df['foo', 'one'].values + tm.assert_almost_equal(result, expected) - col = df['foo', 'one'] - tm.assert_almost_equal(col.values, df.values[:, 0]) - msg = r"\('foo', 'four'\)" - with pytest.raises(KeyError, match=msg): - df[('foo', 'four')] - msg = "'foobar'" + +@pytest.mark.parametrize('indexer,msg', [ + (lambda df: df[('foo', 'four')], r"\('foo', 'four'\)"), + (lambda df: df['foobar'], "'foobar'") +]) +def test_getitem_simple_key_error( + multiindex_dataframe_random_data, indexer, msg): + df = multiindex_dataframe_random_data.T with pytest.raises(KeyError, match=msg): - df['foobar'] + indexer(df) @pytest.mark.parametrize('indexer', [ From 7e1b8deec7f41fcddfbeedebb24a67b3ffc90a9d Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 24 Dec 2018 11:10:37 +0000 Subject: [PATCH 6/6] isort imports --- pandas/tests/indexing/multiindex/test_xs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/indexing/multiindex/test_xs.py b/pandas/tests/indexing/multiindex/test_xs.py index f776d26eec9dc..fb6d763cfcf58 100644 --- a/pandas/tests/indexing/multiindex/test_xs.py +++ b/pandas/tests/indexing/multiindex/test_xs.py @@ -3,7 +3,7 @@ from pandas.compat import lrange, product as cart_product -from pandas import DataFrame, Index, MultiIndex, concat, Series, date_range +from pandas import DataFrame, Index, MultiIndex, Series, concat, date_range import pandas.core.common as com from pandas.util import testing as tm