Skip to content

Commit d3ca427

Browse files
committed
handle non-NA fill_value case in SparseSeries.shift. complete test line coverage
1 parent 3b4ee70 commit d3ca427

File tree

2 files changed

+55
-13
lines changed

2 files changed

+55
-13
lines changed

pandas/core/sparse.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
import operator
1212

13-
from pandas.core.common import (_pickle_array, _unpickle_array, _mut_exclusive,
14-
_ensure_index)
13+
from pandas.core.common import (isnull, _pickle_array, _unpickle_array,
14+
_mut_exclusive, _ensure_index)
1515
from pandas.core.index import Index
1616
from pandas.core.series import Series, TimeSeries
1717
from pandas.core.frame import DataFrame, extract_index, try_sort
@@ -543,6 +543,13 @@ def shift(self, periods, offset=None, timeRule=None):
543543
"""
544544
Analogous to Series.shift
545545
"""
546+
# no special handling of fill values yet
547+
if not isnull(self.fill_value):
548+
dense_shifted = self.to_dense().shift(periods, offset=offset,
549+
timeRule=timeRule)
550+
return dense_shifted.to_sparse(fill_value=self.fill_value,
551+
kind=self.kind)
552+
546553
if periods == 0:
547554
return self.copy()
548555

@@ -827,7 +834,7 @@ def shift(self, periods, offset=None, timeRule=None):
827834
new_index = self.index.shift(periods, offset)
828835
for col, s in self.iteritems():
829836
new_series[col] = SparseSeries(s.sp_values, index=new_index,
830-
sp_index=s.sp_index,
837+
sparse_index=s.sp_index,
831838
fill_value=s.fill_value)
832839

833840
return SparseDataFrame(new_series, index=new_index,

pandas/core/tests/test_sparse.py

+45-10
Original file line numberDiff line numberDiff line change
@@ -552,28 +552,27 @@ def test_fill_value_corner(self):
552552
self.assert_(np.isnan(result.fill_value))
553553

554554
def test_shift(self):
555-
def _dense_compare(s, f):
556-
result = f(s)
557-
self.assert_(isinstance(result, SparseSeries))
558-
dense_result = f(s.to_dense())
559-
assert_series_equal(result.to_dense(), dense_result)
560-
561555
series = SparseSeries([nan, 1., 2., 3., nan, nan],
562556
index=np.arange(6))
563557

558+
shifted = series.shift(0)
559+
self.assert_(shifted is not series)
560+
assert_sp_series_equal(shifted, series)
561+
564562
f = lambda s: s.shift(1)
565-
_dense_compare(series, f)
563+
_dense_series_compare(series, f)
566564

567565
f = lambda s: s.shift(-2)
568-
_dense_compare(series, f)
566+
_dense_series_compare(series, f)
569567

570568
series = SparseSeries([nan, 1., 2., 3., nan, nan],
571569
index=DateRange('1/1/2000', periods=6))
572570
f = lambda s: s.shift(2, timeRule='WEEKDAY')
573-
_dense_compare(series, f)
571+
_dense_series_compare(series, f)
574572

575573
f = lambda s: s.shift(2, offset=datetools.bday)
576-
_dense_compare(series, f)
574+
_dense_series_compare(series, f)
575+
577576

578577
class TestSparseTimeSeries(TestCase):
579578
pass
@@ -880,12 +879,48 @@ def _check(frame):
880879
assert_sp_frame_equal(frame, untransposed)
881880
self._check_all(_check)
882881

882+
def test_shift(self):
883+
def _check(frame):
884+
shifted = frame.shift(0)
885+
self.assert_(shifted is not frame)
886+
assert_sp_frame_equal(shifted, frame)
887+
888+
f = lambda s: s.shift(1)
889+
_dense_frame_compare(frame, f)
890+
891+
f = lambda s: s.shift(-2)
892+
_dense_frame_compare(frame, f)
893+
894+
f = lambda s: s.shift(2, timeRule='WEEKDAY')
895+
_dense_frame_compare(frame, f)
896+
897+
f = lambda s: s.shift(2, offset=datetools.bday)
898+
_dense_frame_compare(frame, f)
899+
900+
self._check_all(_check)
901+
902+
def test_count(self):
903+
result = self.frame.count()
904+
dense_result = self.frame.to_dense().count()
905+
assert_series_equal(result, dense_result)
906+
883907
def _check_all(self, check_func):
884908
check_func(self.frame)
885909
check_func(self.iframe)
886910
check_func(self.zframe)
887911
check_func(self.fill_frame)
888912

913+
def _dense_series_compare(s, f):
914+
result = f(s)
915+
assert(isinstance(result, SparseSeries))
916+
dense_result = f(s.to_dense())
917+
assert_series_equal(result.to_dense(), dense_result)
918+
919+
def _dense_frame_compare(frame, f):
920+
result = f(frame)
921+
assert(isinstance(frame, SparseDataFrame))
922+
dense_result = f(frame.to_dense())
923+
assert_frame_equal(result.to_dense(), dense_result)
889924

890925
def panel_data1():
891926
index = DateRange('1/1/2011', periods=8)

0 commit comments

Comments
 (0)