From 3134cb245c76509cedfc4b38dd2cff72dfbf493d Mon Sep 17 00:00:00 2001 From: jreback Date: Thu, 14 Feb 2013 15:01:30 -0500 Subject: [PATCH 1/2] BUG: fix sparse_frame printing (bug introduced in dtypes) MockBlockManager didn't support blocks method --- pandas/sparse/frame.py | 9 +++++++++ pandas/sparse/tests/test_sparse.py | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/pandas/sparse/frame.py b/pandas/sparse/frame.py index cfbe5ea2ee0ed..036d424673711 100644 --- a/pandas/sparse/frame.py +++ b/pandas/sparse/frame.py @@ -42,6 +42,11 @@ def shape(self): def axes(self): return [self.sp_frame.columns, self.sp_frame.index] + @property + def blocks(self): + """ return our series in the column order """ + s = self.sp_frame._series + return [ self.iget(i) for i in self.sp_frame.columns ] class SparseDataFrame(DataFrame): """ @@ -235,6 +240,10 @@ def to_dense(self): data = dict((k, v.to_dense()) for k, v in self.iteritems()) return DataFrame(data, index=self.index) + def get_dtype_counts(self): + from collections import Counter + return Series(Counter([ v.dtype.name for k, v in self.iteritems() ])) + def astype(self, dtype): raise NotImplementedError diff --git a/pandas/sparse/tests/test_sparse.py b/pandas/sparse/tests/test_sparse.py index 1202649afed84..fcb3f2a5cf928 100644 --- a/pandas/sparse/tests/test_sparse.py +++ b/pandas/sparse/tests/test_sparse.py @@ -821,6 +821,22 @@ def test_constructor_convert_index_once(self): sdf = SparseDataFrame(columns=range(4), index=arr) self.assertTrue(sdf[0].index is sdf[1].index) + def test_dtypes(self): + df = DataFrame(np.random.randn(10000, 4)) + df.ix[:9998] = np.nan + sdf = df.to_sparse() + + result = sdf.get_dtype_counts() + expected = Series({ 'float64' : 4 }) + assert_series_equal(result, expected) + + def test_str(self): + df = DataFrame(np.random.randn(10000, 4)) + df.ix[:9998] = np.nan + sdf = df.to_sparse() + + str(sdf) + def test_array_interface(self): res = np.sqrt(self.frame) dres = np.sqrt(self.frame.to_dense()) From cb6dba0959903ada7a2eda79c71aa2eeac275788 Mon Sep 17 00:00:00 2001 From: jreback Date: Thu, 14 Feb 2013 15:12:01 -0500 Subject: [PATCH 2/2] TST: added tests for GH #2837 --- pandas/sparse/frame.py | 7 +++++-- pandas/sparse/tests/test_sparse.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/pandas/sparse/frame.py b/pandas/sparse/frame.py index 036d424673711..bf978c322dbd2 100644 --- a/pandas/sparse/frame.py +++ b/pandas/sparse/frame.py @@ -241,8 +241,11 @@ def to_dense(self): return DataFrame(data, index=self.index) def get_dtype_counts(self): - from collections import Counter - return Series(Counter([ v.dtype.name for k, v in self.iteritems() ])) + from collections import defaultdict + d = defaultdict(int) + for k, v in self.iteritems(): + d[v.dtype.name] += 1 + return Series(d) def astype(self, dtype): raise NotImplementedError diff --git a/pandas/sparse/tests/test_sparse.py b/pandas/sparse/tests/test_sparse.py index fcb3f2a5cf928..af9112b8297be 100644 --- a/pandas/sparse/tests/test_sparse.py +++ b/pandas/sparse/tests/test_sparse.py @@ -821,6 +821,23 @@ def test_constructor_convert_index_once(self): sdf = SparseDataFrame(columns=range(4), index=arr) self.assertTrue(sdf[0].index is sdf[1].index) + def test_constructor_from_series(self): + + # GH 2873 + x = Series(np.random.randn(10000), name='a') + x = x.to_sparse(fill_value=0) + self.assert_(isinstance(x,SparseSeries)) + df = SparseDataFrame(x) + self.assert_(isinstance(df,SparseDataFrame)) + + x = Series(np.random.randn(10000), name ='a') + y = Series(np.random.randn(10000), name ='b') + x.ix[:9998] = 0 + x = x.to_sparse(fill_value=0) + + # currently fails + #df1 = SparseDataFrame([x, y]) + def test_dtypes(self): df = DataFrame(np.random.randn(10000, 4)) df.ix[:9998] = np.nan