From 75d93047f444b9a572211a8df38dda9633a9d58c Mon Sep 17 00:00:00 2001 From: thoo Date: Sat, 20 Oct 2018 20:02:50 -0400 Subject: [PATCH 1/8] Add tests in methods.py --- pandas/tests/extension/base/methods.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index dce91d5a9ca9c..41d71ae8ff279 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -105,6 +105,16 @@ def test_factorize_equivalence(self, data_for_grouping, na_sentinel): tm.assert_numpy_array_equal(l1, l2) self.assert_extension_array_equal(u1, u2) + def test_fillna_copy(self, data_for_fillna): + df = pd.DataFrame({"A": data_for_fillna}) + result = df.fillna(0, axis='columns') + + self.assert_frame_equal(df, result) + assert result._is_view + + def test_fillna_array_lenght(self, data_for_fillna): + assert len(self) == len(data_for_fillna) + def test_combine_le(self, data_repeated): # GH 20825 # Test that combine works when doing a <= (le) comparison From 4a82fd7429339246c2173539c788d7f6e545ddf5 Mon Sep 17 00:00:00 2001 From: thoo Date: Sun, 21 Oct 2018 00:20:44 -0400 Subject: [PATCH 2/8] Add more tests --- pandas/tests/extension/base/methods.py | 9 +++------ pandas/tests/extension/decimal/test_decimal.py | 5 +++++ pandas/tests/extension/json/test_json.py | 6 ++++++ pandas/tests/extension/test_categorical.py | 6 ++++++ pandas/tests/extension/test_integer.py | 5 +++++ pandas/tests/extension/test_interval.py | 6 ++++++ pandas/tests/extension/test_sparse.py | 6 ++++++ 7 files changed, 37 insertions(+), 6 deletions(-) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index 41d71ae8ff279..3777d3b287d83 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -107,13 +107,10 @@ def test_factorize_equivalence(self, data_for_grouping, na_sentinel): def test_fillna_copy(self, data_for_fillna): df = pd.DataFrame({"A": data_for_fillna}) - result = df.fillna(0, axis='columns') + filled_val = df.iloc[0,0] - self.assert_frame_equal(df, result) - assert result._is_view - - def test_fillna_array_lenght(self, data_for_fillna): - assert len(self) == len(data_for_fillna) + result = df.fillna(filled_val) + assert df.values.base is not result.values.base def test_combine_le(self, data_repeated): # GH 20825 diff --git a/pandas/tests/extension/decimal/test_decimal.py b/pandas/tests/extension/decimal/test_decimal.py index be1c61166e4b1..1aac51066128a 100644 --- a/pandas/tests/extension/decimal/test_decimal.py +++ b/pandas/tests/extension/decimal/test_decimal.py @@ -27,6 +27,11 @@ def data_missing(): return DecimalArray([decimal.Decimal('NaN'), decimal.Decimal(1)]) +@pytest.fixture +def data_for_fillna(): + return DecimalArray([decimal.Decimal(1), decimal.Decimal(1)]) + + @pytest.fixture def data_for_sorting(): return DecimalArray([decimal.Decimal('1'), diff --git a/pandas/tests/extension/json/test_json.py b/pandas/tests/extension/json/test_json.py index 15d99f6c5d2fc..cb0591f07adb7 100644 --- a/pandas/tests/extension/json/test_json.py +++ b/pandas/tests/extension/json/test_json.py @@ -41,6 +41,12 @@ def data_missing(): return JSONArray([{}, {'a': 10}]) +@pytest.fixture +def data_for_fillna(): + """Length 2 array with [Valid, Valid]""" + return JSONArray([{'a': 1}, {'a': 2}]) + + @pytest.fixture def data_for_sorting(): return JSONArray([{'b': 1}, {'c': 4}, {'a': 2, 'c': 3}]) diff --git a/pandas/tests/extension/test_categorical.py b/pandas/tests/extension/test_categorical.py index a4518798aa400..554c8b145a640 100644 --- a/pandas/tests/extension/test_categorical.py +++ b/pandas/tests/extension/test_categorical.py @@ -46,6 +46,12 @@ def data_missing(): return Categorical([np.nan, 'A']) +@pytest.fixture +def data_for_fillna(): + """Length 2 array with [Valid, Valid]""" + return Categorical(['A', 'A']) + + @pytest.fixture def data_for_sorting(): return Categorical(['A', 'B', 'C'], categories=['C', 'A', 'B'], diff --git a/pandas/tests/extension/test_integer.py b/pandas/tests/extension/test_integer.py index 668939e775148..1b11e96151825 100644 --- a/pandas/tests/extension/test_integer.py +++ b/pandas/tests/extension/test_integer.py @@ -47,6 +47,11 @@ def data_missing(dtype): return integer_array([np.nan, 1], dtype=dtype) +@pytest.fixture +def data_for_fillna(dtype): + return integer_array([1, 1], dtype=dtype) + + @pytest.fixture def data_for_sorting(dtype): return integer_array([1, 2, 0], dtype=dtype) diff --git a/pandas/tests/extension/test_interval.py b/pandas/tests/extension/test_interval.py index 183ebea927b10..14a49416b7a39 100644 --- a/pandas/tests/extension/test_interval.py +++ b/pandas/tests/extension/test_interval.py @@ -47,6 +47,12 @@ def data_missing(): return IntervalArray.from_tuples([None, (0, 1)]) +@pytest.fixture +def data_for_fillna(): + """Length 2 array with [Valid, Valid]""" + return IntervalArray.from_tuples([(1, 1), (1, 2)]) + + @pytest.fixture def data_for_sorting(): return IntervalArray.from_tuples([(1, 2), (2, 3), (0, 1)]) diff --git a/pandas/tests/extension/test_sparse.py b/pandas/tests/extension/test_sparse.py index 6946da6fdc36d..677fe25df7bcb 100644 --- a/pandas/tests/extension/test_sparse.py +++ b/pandas/tests/extension/test_sparse.py @@ -37,6 +37,12 @@ def data_missing(request): return SparseArray([np.nan, 1], fill_value=request.param) +@pytest.fixture(params=[0, np.nan]) +def data_for_fillna(request): + """Length 2 array with [Valid, Valid]""" + return SparseArray([1, 1], fill_value=request.param) + + @pytest.fixture(params=[0, np.nan]) def data_repeated(request): """Return different versions of data for count times""" From dad9d2755c22273c75fa8602281af7f7da4c7060 Mon Sep 17 00:00:00 2001 From: thoo Date: Sun, 21 Oct 2018 00:29:24 -0400 Subject: [PATCH 3/8] Flake8 error --- pandas/tests/extension/base/methods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index 3777d3b287d83..1d56b20aac02b 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -107,7 +107,7 @@ def test_factorize_equivalence(self, data_for_grouping, na_sentinel): def test_fillna_copy(self, data_for_fillna): df = pd.DataFrame({"A": data_for_fillna}) - filled_val = df.iloc[0,0] + filled_val = df.iloc[0, 0] result = df.fillna(filled_val) assert df.values.base is not result.values.base From 1884b539c45722a7e40a2064fcdcd165c8046939 Mon Sep 17 00:00:00 2001 From: thoo Date: Thu, 25 Oct 2018 00:10:32 -0400 Subject: [PATCH 4/8] remove data_for_fillna and add series tests --- pandas/tests/extension/base/methods.py | 23 +++++++++++++++++-- .../tests/extension/decimal/test_decimal.py | 5 ---- pandas/tests/extension/json/test_json.py | 6 ----- pandas/tests/extension/test_categorical.py | 6 ----- pandas/tests/extension/test_integer.py | 5 ---- pandas/tests/extension/test_interval.py | 6 ----- pandas/tests/extension/test_sparse.py | 6 ----- 7 files changed, 21 insertions(+), 36 deletions(-) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index 1d56b20aac02b..264d4af3426a9 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -105,13 +105,32 @@ def test_factorize_equivalence(self, data_for_grouping, na_sentinel): tm.assert_numpy_array_equal(l1, l2) self.assert_extension_array_equal(u1, u2) - def test_fillna_copy(self, data_for_fillna): - df = pd.DataFrame({"A": data_for_fillna}) + def test_fillna_copy_frame(self, data): + arr = data.take([1, 1]) + df = pd.DataFrame({"A": arr}) filled_val = df.iloc[0, 0] result = df.fillna(filled_val) assert df.values.base is not result.values.base + if isinstance(arr, pd.SparseArray): + assert df.A._values.to_dense() is arr.to_dense() + else: + assert df.A._values is arr + + def test_fillna_copy_series(self, data): + arr = data.take([1, 1]) + ser = pd.Series(arr) + filled_val = ser[0] + + result = ser.fillna(filled_val) + assert ser._values is not result._values + + if isinstance(arr, pd.SparseArray): + assert ser._values.to_dense() is arr.to_dense() + else: + assert ser._values is arr + def test_combine_le(self, data_repeated): # GH 20825 # Test that combine works when doing a <= (le) comparison diff --git a/pandas/tests/extension/decimal/test_decimal.py b/pandas/tests/extension/decimal/test_decimal.py index 1aac51066128a..be1c61166e4b1 100644 --- a/pandas/tests/extension/decimal/test_decimal.py +++ b/pandas/tests/extension/decimal/test_decimal.py @@ -27,11 +27,6 @@ def data_missing(): return DecimalArray([decimal.Decimal('NaN'), decimal.Decimal(1)]) -@pytest.fixture -def data_for_fillna(): - return DecimalArray([decimal.Decimal(1), decimal.Decimal(1)]) - - @pytest.fixture def data_for_sorting(): return DecimalArray([decimal.Decimal('1'), diff --git a/pandas/tests/extension/json/test_json.py b/pandas/tests/extension/json/test_json.py index cb0591f07adb7..15d99f6c5d2fc 100644 --- a/pandas/tests/extension/json/test_json.py +++ b/pandas/tests/extension/json/test_json.py @@ -41,12 +41,6 @@ def data_missing(): return JSONArray([{}, {'a': 10}]) -@pytest.fixture -def data_for_fillna(): - """Length 2 array with [Valid, Valid]""" - return JSONArray([{'a': 1}, {'a': 2}]) - - @pytest.fixture def data_for_sorting(): return JSONArray([{'b': 1}, {'c': 4}, {'a': 2, 'c': 3}]) diff --git a/pandas/tests/extension/test_categorical.py b/pandas/tests/extension/test_categorical.py index 554c8b145a640..a4518798aa400 100644 --- a/pandas/tests/extension/test_categorical.py +++ b/pandas/tests/extension/test_categorical.py @@ -46,12 +46,6 @@ def data_missing(): return Categorical([np.nan, 'A']) -@pytest.fixture -def data_for_fillna(): - """Length 2 array with [Valid, Valid]""" - return Categorical(['A', 'A']) - - @pytest.fixture def data_for_sorting(): return Categorical(['A', 'B', 'C'], categories=['C', 'A', 'B'], diff --git a/pandas/tests/extension/test_integer.py b/pandas/tests/extension/test_integer.py index 1b11e96151825..668939e775148 100644 --- a/pandas/tests/extension/test_integer.py +++ b/pandas/tests/extension/test_integer.py @@ -47,11 +47,6 @@ def data_missing(dtype): return integer_array([np.nan, 1], dtype=dtype) -@pytest.fixture -def data_for_fillna(dtype): - return integer_array([1, 1], dtype=dtype) - - @pytest.fixture def data_for_sorting(dtype): return integer_array([1, 2, 0], dtype=dtype) diff --git a/pandas/tests/extension/test_interval.py b/pandas/tests/extension/test_interval.py index 14a49416b7a39..183ebea927b10 100644 --- a/pandas/tests/extension/test_interval.py +++ b/pandas/tests/extension/test_interval.py @@ -47,12 +47,6 @@ def data_missing(): return IntervalArray.from_tuples([None, (0, 1)]) -@pytest.fixture -def data_for_fillna(): - """Length 2 array with [Valid, Valid]""" - return IntervalArray.from_tuples([(1, 1), (1, 2)]) - - @pytest.fixture def data_for_sorting(): return IntervalArray.from_tuples([(1, 2), (2, 3), (0, 1)]) diff --git a/pandas/tests/extension/test_sparse.py b/pandas/tests/extension/test_sparse.py index 677fe25df7bcb..6946da6fdc36d 100644 --- a/pandas/tests/extension/test_sparse.py +++ b/pandas/tests/extension/test_sparse.py @@ -37,12 +37,6 @@ def data_missing(request): return SparseArray([np.nan, 1], fill_value=request.param) -@pytest.fixture(params=[0, np.nan]) -def data_for_fillna(request): - """Length 2 array with [Valid, Valid]""" - return SparseArray([1, 1], fill_value=request.param) - - @pytest.fixture(params=[0, np.nan]) def data_repeated(request): """Return different versions of data for count times""" From 7ab945858a888878c60ea85bb56772bfd21223dd Mon Sep 17 00:00:00 2001 From: thoo Date: Thu, 25 Oct 2018 14:03:34 -0400 Subject: [PATCH 5/8] "Switch to data_missing|fix json/decimal test er" --- pandas/tests/extension/base/methods.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index 264d4af3426a9..95f87a4f34a3b 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -105,11 +105,11 @@ def test_factorize_equivalence(self, data_for_grouping, na_sentinel): tm.assert_numpy_array_equal(l1, l2) self.assert_extension_array_equal(u1, u2) - def test_fillna_copy_frame(self, data): - arr = data.take([1, 1]) + def test_fillna_copy_frame(self, data_missing): + arr = data_missing.take([1, 1]) df = pd.DataFrame({"A": arr}) - filled_val = df.iloc[0, 0] + filled_val = df.iloc[0, 0] result = df.fillna(filled_val) assert df.values.base is not result.values.base @@ -118,11 +118,11 @@ def test_fillna_copy_frame(self, data): else: assert df.A._values is arr - def test_fillna_copy_series(self, data): - arr = data.take([1, 1]) + def test_fillna_copy_series(self, data_missing): + arr = data_missing.take([1, 1]) ser = pd.Series(arr) - filled_val = ser[0] + filled_val = ser[0] result = ser.fillna(filled_val) assert ser._values is not result._values From 0a9fe11aef3322b47575eec4975678c1defc9b5a Mon Sep 17 00:00:00 2001 From: thoo Date: Thu, 25 Oct 2018 16:24:59 -0400 Subject: [PATCH 6/8] Add fillna mismatched array length tests. --- pandas/tests/extension/base/methods.py | 5 +++++ pandas/tests/extension/test_categorical.py | 4 ++++ pandas/tests/extension/test_interval.py | 4 ++++ pandas/tests/extension/test_sparse.py | 4 ++++ 4 files changed, 17 insertions(+) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index 95f87a4f34a3b..c49474c96a013 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -131,6 +131,11 @@ def test_fillna_copy_series(self, data_missing): else: assert ser._values is arr + def test_fillna_length_mismatch(self, data_missing): + with (tm.assert_raises_regex(ValueError, + "Length of 'value' does not match.")): + data_missing.fillna(data_missing.take([1])) + def test_combine_le(self, data_repeated): # GH 20825 # Test that combine works when doing a <= (le) comparison diff --git a/pandas/tests/extension/test_categorical.py b/pandas/tests/extension/test_categorical.py index a4518798aa400..3a05bb79e4bc0 100644 --- a/pandas/tests/extension/test_categorical.py +++ b/pandas/tests/extension/test_categorical.py @@ -191,6 +191,10 @@ def test_combine_add(self, data_repeated): expected = pd.Series([a + val for a in list(orig_data1)]) self.assert_series_equal(result, expected) + @pytest.mark.skip(reason="Not Applicable") + def test_fillna_length_mismatch(self, data_missing): + pass + class TestCasting(base.BaseCastingTests): pass diff --git a/pandas/tests/extension/test_interval.py b/pandas/tests/extension/test_interval.py index 183ebea927b10..4abb9c94d2388 100644 --- a/pandas/tests/extension/test_interval.py +++ b/pandas/tests/extension/test_interval.py @@ -108,6 +108,10 @@ class TestMethods(BaseInterval, base.BaseMethodsTests): def test_combine_add(self, data_repeated): pass + @pytest.mark.skip(reason="Not Applicable") + def test_fillna_length_mismatch(self, data_missing): + pass + class TestMissing(BaseInterval, base.BaseMissingTests): # Index.fillna only accepts scalar `value`, so we have to skip all diff --git a/pandas/tests/extension/test_sparse.py b/pandas/tests/extension/test_sparse.py index 6946da6fdc36d..1e3cb4d46e4ce 100644 --- a/pandas/tests/extension/test_sparse.py +++ b/pandas/tests/extension/test_sparse.py @@ -231,6 +231,10 @@ def test_combine_le(self, data_repeated): ], fill_value=False)) self.assert_series_equal(result, expected) + @pytest.mark.skip(reason="Not Applicable") + def test_fillna_length_mismatch(self, data_missing): + pass + class TestCasting(BaseSparseTests, base.BaseCastingTests): pass From c859b4db80495c45f49a89f92395857caabb5103 Mon Sep 17 00:00:00 2001 From: thoo Date: Thu, 25 Oct 2018 21:18:57 -0400 Subject: [PATCH 7/8] overwrite tests for sparse array --- pandas/tests/extension/base/methods.py | 14 ++++---------- pandas/tests/extension/test_sparse.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index c49474c96a013..95aaecba292a6 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -111,12 +111,9 @@ def test_fillna_copy_frame(self, data_missing): filled_val = df.iloc[0, 0] result = df.fillna(filled_val) - assert df.values.base is not result.values.base - if isinstance(arr, pd.SparseArray): - assert df.A._values.to_dense() is arr.to_dense() - else: - assert df.A._values is arr + assert df.values.base is not result.values.base + assert df.A._values is arr def test_fillna_copy_series(self, data_missing): arr = data_missing.take([1, 1]) @@ -124,12 +121,9 @@ def test_fillna_copy_series(self, data_missing): filled_val = ser[0] result = ser.fillna(filled_val) - assert ser._values is not result._values - if isinstance(arr, pd.SparseArray): - assert ser._values.to_dense() is arr.to_dense() - else: - assert ser._values is arr + assert ser._values is not result._values + assert ser._values is arr def test_fillna_length_mismatch(self, data_missing): with (tm.assert_raises_regex(ValueError, diff --git a/pandas/tests/extension/test_sparse.py b/pandas/tests/extension/test_sparse.py index 1e3cb4d46e4ce..1cb88723ead2e 100644 --- a/pandas/tests/extension/test_sparse.py +++ b/pandas/tests/extension/test_sparse.py @@ -231,6 +231,26 @@ def test_combine_le(self, data_repeated): ], fill_value=False)) self.assert_series_equal(result, expected) + def test_fillna_copy_frame(self, data_missing): + arr = data_missing.take([1, 1]) + df = pd.DataFrame({"A": arr}) + + filled_val = df.iloc[0, 0] + result = df.fillna(filled_val) + + assert df.values.base is not result.values.base + assert df.A._values.to_dense() is arr.to_dense() + + def test_fillna_copy_series(self, data_missing): + arr = data_missing.take([1, 1]) + ser = pd.Series(arr) + + filled_val = ser[0] + result = ser.fillna(filled_val) + + assert ser._values is not result._values + assert ser._values.to_dense() is arr.to_dense() + @pytest.mark.skip(reason="Not Applicable") def test_fillna_length_mismatch(self, data_missing): pass From 9c5578724b7ef872b5e1aaf791fa87d530b8ed61 Mon Sep 17 00:00:00 2001 From: thoo Date: Tue, 30 Oct 2018 01:08:15 -0400 Subject: [PATCH 8/8] update as recommended --- pandas/tests/extension/base/methods.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index 95aaecba292a6..f3074f04b0fcd 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -112,8 +112,7 @@ def test_fillna_copy_frame(self, data_missing): filled_val = df.iloc[0, 0] result = df.fillna(filled_val) - assert df.values.base is not result.values.base - assert df.A._values is arr + assert df.A.values is not result.A.values def test_fillna_copy_series(self, data_missing): arr = data_missing.take([1, 1])