From 88b5694b9212ccb7378164479515a1e373e2ff6e Mon Sep 17 00:00:00 2001 From: sinhrks Date: Sat, 5 Mar 2016 22:36:40 +0900 Subject: [PATCH] BUG: SparseSeries.shape ignores fill_value --- doc/source/whatsnew/v0.18.1.txt | 9 ++++--- pandas/sparse/series.py | 4 +++ pandas/sparse/tests/test_sparse.py | 40 ++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/doc/source/whatsnew/v0.18.1.txt b/doc/source/whatsnew/v0.18.1.txt index 55750fe5700c6..9c54b19fe0f22 100644 --- a/doc/source/whatsnew/v0.18.1.txt +++ b/doc/source/whatsnew/v0.18.1.txt @@ -134,6 +134,10 @@ Bug Fixes + + + + - Bug in ``value_counts`` when ``normalize=True`` and ``dropna=True`` where nulls still contributed to the normalized count (:issue:`12558`) - Bug in ``Panel.fillna()`` ignoring ``inplace=True`` (:issue:`12633`) - Bug in ``Series.rename``, ``DataFrame.rename`` and ``DataFrame.rename_axis`` not treating ``Series`` as mappings to relabel (:issue:`12623`). @@ -147,14 +151,11 @@ Bug Fixes - - - - Bug in ``CategoricalIndex.get_loc`` returns different result from regular ``Index`` (:issue:`12531`) - +- Bug in ``SparseSeries.shape`` ignores ``fill_value`` (:issue:`10452`) diff --git a/pandas/sparse/series.py b/pandas/sparse/series.py index 25a6671594dab..71790c8a544a1 100644 --- a/pandas/sparse/series.py +++ b/pandas/sparse/series.py @@ -282,6 +282,10 @@ def as_sparse_array(self, kind=None, fill_value=None, copy=False): def __len__(self): return len(self.block) + @property + def shape(self): + return self._data.shape + def __unicode__(self): # currently, unicode is same as repr...fixes infinite loop series_rep = Series.__unicode__(self) diff --git a/pandas/sparse/tests/test_sparse.py b/pandas/sparse/tests/test_sparse.py index dc66e01ac3f78..3fba4c365c055 100644 --- a/pandas/sparse/tests/test_sparse.py +++ b/pandas/sparse/tests/test_sparse.py @@ -213,6 +213,11 @@ def test_dense_to_sparse(self): assert_sp_series_equal(iseries, self.iseries, check_names=False) self.assertEqual(iseries.name, self.bseries.name) + self.assertEqual(len(series), len(bseries)) + self.assertEqual(len(series), len(iseries)) + self.assertEqual(series.shape, bseries.shape) + self.assertEqual(series.shape, iseries.shape) + # non-NaN fill value series = self.zbseries.to_dense() zbseries = series.to_sparse(kind='block', fill_value=0) @@ -221,6 +226,11 @@ def test_dense_to_sparse(self): assert_sp_series_equal(ziseries, self.ziseries, check_names=False) self.assertEqual(ziseries.name, self.zbseries.name) + self.assertEqual(len(series), len(zbseries)) + self.assertEqual(len(series), len(ziseries)) + self.assertEqual(series.shape, zbseries.shape) + self.assertEqual(series.shape, ziseries.shape) + def test_to_dense_preserve_name(self): assert (self.bseries.name is not None) result = self.bseries.to_dense() @@ -271,12 +281,18 @@ def _check_const(sparse, name): sp.sp_values[:5] = 97 self.assertEqual(values[0], 97) + self.assertEqual(len(sp), 20) + self.assertEqual(sp.shape, (20, )) + # but can make it copy! sp = SparseSeries(values, sparse_index=self.bseries.sp_index, copy=True) sp.sp_values[:5] = 100 self.assertEqual(values[0], 97) + self.assertEqual(len(sp), 20) + self.assertEqual(sp.shape, (20, )) + def test_constructor_scalar(self): data = 5 sp = SparseSeries(data, np.arange(100)) @@ -286,6 +302,8 @@ def test_constructor_scalar(self): data = np.nan sp = SparseSeries(data, np.arange(100)) + self.assertEqual(len(sp), 100) + self.assertEqual(sp.shape, (100, )) def test_constructor_ndarray(self): pass @@ -294,11 +312,14 @@ def test_constructor_nonnan(self): arr = [0, 0, 0, nan, nan] sp_series = SparseSeries(arr, fill_value=0) assert_equal(sp_series.values.values, arr) + self.assertEqual(len(sp_series), 5) + self.assertEqual(sp_series.shape, (5, )) # GH 9272 def test_constructor_empty(self): sp = SparseSeries() self.assertEqual(len(sp.index), 0) + self.assertEqual(sp.shape, (0, )) def test_copy_astype(self): cop = self.bseries.astype(np.float64) @@ -328,6 +349,18 @@ def test_copy_astype(self): view.sp_values[:5] = 5 self.assertTrue((self.bseries.sp_values[:5] == 5).all()) + def test_shape(self): + # GH 10452 + self.assertEqual(self.bseries.shape, (20, )) + self.assertEqual(self.btseries.shape, (20, )) + self.assertEqual(self.iseries.shape, (20, )) + + self.assertEqual(self.bseries2.shape, (15, )) + self.assertEqual(self.iseries2.shape, (15, )) + + self.assertEqual(self.zbseries2.shape, (15, )) + self.assertEqual(self.ziseries2.shape, (15, )) + def test_astype(self): self.assertRaises(Exception, self.bseries.astype, np.int64) @@ -1090,6 +1123,13 @@ def test_dtypes(self): expected = Series({'float64': 4}) assert_series_equal(result, expected) + def test_shape(self): + # GH 10452 + self.assertEqual(self.frame.shape, (10, 4)) + self.assertEqual(self.iframe.shape, (10, 4)) + self.assertEqual(self.zframe.shape, (10, 4)) + self.assertEqual(self.fill_frame.shape, (10, 4)) + def test_str(self): df = DataFrame(np.random.randn(10000, 4)) df.ix[:9998] = np.nan