Skip to content

Commit 09108fa

Browse files
kerncjreback
authored andcommitted
TST: Move some Series ctor tests to SharedWithSparse (#17050)
1 parent c0a84b5 commit 09108fa

File tree

5 files changed

+109
-67
lines changed

5 files changed

+109
-67
lines changed

Diff for: doc/source/whatsnew/v0.21.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ Groupby/Resample/Rolling
284284

285285
Sparse
286286
^^^^^^
287-
- Bug in ``SparseSeries`` raises ``AttributeError`` when a dictionary is passed in as data (:issue:`16777`)
287+
- Bug in ``SparseSeries`` raises ``AttributeError`` when a dictionary is passed in as data (:issue:`16905`)
288288

289289

290290
Reshaping

Diff for: pandas/tests/series/test_api.py

+82
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# coding=utf-8
22
# pylint: disable-msg=E1101,W0612
3+
from collections import OrderedDict
34

45
import pytest
56

@@ -20,6 +21,15 @@
2021

2122

2223
class SharedWithSparse(object):
24+
"""
25+
A collection of tests Series and SparseSeries can share.
26+
27+
In generic tests on this class, use ``self._assert_series_equal()``
28+
which is implemented in sub-classes.
29+
"""
30+
def _assert_series_equal(self, left, right):
31+
"""Dispatch to series class dependent assertion"""
32+
raise NotImplementedError
2333

2434
def test_scalarop_preserve_name(self):
2535
result = self.ts * 2
@@ -117,9 +127,81 @@ def test_to_sparse_pass_name(self):
117127
result = self.ts.to_sparse()
118128
assert result.name == self.ts.name
119129

130+
def test_constructor_dict(self):
131+
d = {'a': 0., 'b': 1., 'c': 2.}
132+
result = self.series_klass(d)
133+
expected = self.series_klass(d, index=sorted(d.keys()))
134+
self._assert_series_equal(result, expected)
135+
136+
result = self.series_klass(d, index=['b', 'c', 'd', 'a'])
137+
expected = self.series_klass([1, 2, np.nan, 0],
138+
index=['b', 'c', 'd', 'a'])
139+
self._assert_series_equal(result, expected)
140+
141+
def test_constructor_subclass_dict(self):
142+
data = tm.TestSubDict((x, 10.0 * x) for x in range(10))
143+
series = self.series_klass(data)
144+
expected = self.series_klass(dict(compat.iteritems(data)))
145+
self._assert_series_equal(series, expected)
146+
147+
def test_constructor_ordereddict(self):
148+
# GH3283
149+
data = OrderedDict(
150+
('col%s' % i, np.random.random()) for i in range(12))
151+
152+
series = self.series_klass(data)
153+
expected = self.series_klass(list(data.values()), list(data.keys()))
154+
self._assert_series_equal(series, expected)
155+
156+
# Test with subclass
157+
class A(OrderedDict):
158+
pass
159+
160+
series = self.series_klass(A(data))
161+
self._assert_series_equal(series, expected)
162+
163+
def test_constructor_dict_multiindex(self):
164+
d = {('a', 'a'): 0., ('b', 'a'): 1., ('b', 'c'): 2.}
165+
_d = sorted(d.items())
166+
result = self.series_klass(d)
167+
expected = self.series_klass(
168+
[x[1] for x in _d],
169+
index=pd.MultiIndex.from_tuples([x[0] for x in _d]))
170+
self._assert_series_equal(result, expected)
171+
172+
d['z'] = 111.
173+
_d.insert(0, ('z', d['z']))
174+
result = self.series_klass(d)
175+
expected = self.series_klass([x[1] for x in _d],
176+
index=pd.Index([x[0] for x in _d],
177+
tupleize_cols=False))
178+
result = result.reindex(index=expected.index)
179+
self._assert_series_equal(result, expected)
180+
181+
def test_constructor_dict_timedelta_index(self):
182+
# GH #12169 : Resample category data with timedelta index
183+
# construct Series from dict as data and TimedeltaIndex as index
184+
# will result NaN in result Series data
185+
expected = self.series_klass(
186+
data=['A', 'B', 'C'],
187+
index=pd.to_timedelta([0, 10, 20], unit='s')
188+
)
189+
190+
result = self.series_klass(
191+
data={pd.to_timedelta(0, unit='s'): 'A',
192+
pd.to_timedelta(10, unit='s'): 'B',
193+
pd.to_timedelta(20, unit='s'): 'C'},
194+
index=pd.to_timedelta([0, 10, 20], unit='s')
195+
)
196+
self._assert_series_equal(result, expected)
197+
120198

121199
class TestSeriesMisc(TestData, SharedWithSparse):
122200

201+
series_klass = Series
202+
# SharedWithSparse tests use generic, series_klass-agnostic assertion
203+
_assert_series_equal = staticmethod(tm.assert_series_equal)
204+
123205
def test_tab_completion(self):
124206
# GH 9910
125207
s = Series(list('abcd'))

Diff for: pandas/tests/series/test_constructors.py

+1-64
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
from pandas._libs import lib
2121
from pandas._libs.tslib import iNaT
2222

23-
from pandas.compat import lrange, range, zip, OrderedDict, long
24-
from pandas import compat
23+
from pandas.compat import lrange, range, zip, long
2524
from pandas.util.testing import assert_series_equal
2625
import pandas.util.testing as tm
2726

@@ -605,48 +604,6 @@ def test_constructor_dict(self):
605604
expected.iloc[1] = 1
606605
assert_series_equal(result, expected)
607606

608-
def test_constructor_dict_multiindex(self):
609-
check = lambda result, expected: tm.assert_series_equal(
610-
result, expected, check_dtype=True, check_series_type=True)
611-
d = {('a', 'a'): 0., ('b', 'a'): 1., ('b', 'c'): 2.}
612-
_d = sorted(d.items())
613-
ser = Series(d)
614-
expected = Series([x[1] for x in _d],
615-
index=MultiIndex.from_tuples([x[0] for x in _d]))
616-
check(ser, expected)
617-
618-
d['z'] = 111.
619-
_d.insert(0, ('z', d['z']))
620-
ser = Series(d)
621-
expected = Series([x[1] for x in _d], index=Index(
622-
[x[0] for x in _d], tupleize_cols=False))
623-
ser = ser.reindex(index=expected.index)
624-
check(ser, expected)
625-
626-
def test_constructor_dict_timedelta_index(self):
627-
# GH #12169 : Resample category data with timedelta index
628-
# construct Series from dict as data and TimedeltaIndex as index
629-
# will result NaN in result Series data
630-
expected = Series(
631-
data=['A', 'B', 'C'],
632-
index=pd.to_timedelta([0, 10, 20], unit='s')
633-
)
634-
635-
result = Series(
636-
data={pd.to_timedelta(0, unit='s'): 'A',
637-
pd.to_timedelta(10, unit='s'): 'B',
638-
pd.to_timedelta(20, unit='s'): 'C'},
639-
index=pd.to_timedelta([0, 10, 20], unit='s')
640-
)
641-
# this should work
642-
assert_series_equal(result, expected)
643-
644-
def test_constructor_subclass_dict(self):
645-
data = tm.TestSubDict((x, 10.0 * x) for x in range(10))
646-
series = Series(data)
647-
refseries = Series(dict(compat.iteritems(data)))
648-
assert_series_equal(refseries, series)
649-
650607
def test_constructor_dict_datetime64_index(self):
651608
# GH 9456
652609

@@ -670,26 +627,6 @@ def create_data(constructor):
670627
assert_series_equal(result_datetime, expected)
671628
assert_series_equal(result_Timestamp, expected)
672629

673-
def test_orderedDict_ctor(self):
674-
# GH3283
675-
import pandas
676-
import random
677-
data = OrderedDict([('col%s' % i, random.random()) for i in range(12)])
678-
s = pandas.Series(data)
679-
assert all(s.values == list(data.values()))
680-
681-
def test_orderedDict_subclass_ctor(self):
682-
# GH3283
683-
import pandas
684-
import random
685-
686-
class A(OrderedDict):
687-
pass
688-
689-
data = A([('col%s' % i, random.random()) for i in range(12)])
690-
s = pandas.Series(data)
691-
assert all(s.values == list(data.values()))
692-
693630
def test_constructor_list_of_tuples(self):
694631
data = [(1, 1), (2, 2), (2, 3)]
695632
s = Series(data)

Diff for: pandas/tests/sparse/test_frame.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1002,12 +1002,14 @@ def _check(frame, orig):
10021002

10031003
shifted = frame.shift(2, freq='B')
10041004
exp = orig.shift(2, freq='B')
1005-
exp = exp.to_sparse(frame.default_fill_value)
1005+
exp = exp.to_sparse(frame.default_fill_value,
1006+
kind=frame.default_kind)
10061007
tm.assert_frame_equal(shifted, exp)
10071008

10081009
shifted = frame.shift(2, freq=BDay())
10091010
exp = orig.shift(2, freq=BDay())
1010-
exp = exp.to_sparse(frame.default_fill_value)
1011+
exp = exp.to_sparse(frame.default_fill_value,
1012+
kind=frame.default_kind)
10111013
tm.assert_frame_equal(shifted, exp)
10121014

10131015
self._check_all(_check)

Diff for: pandas/tests/sparse/test_series.py

+21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# pylint: disable-msg=E1101,W0612
22

33
import operator
4+
from datetime import datetime
5+
46
import pytest
57

68
from numpy import nan
@@ -58,6 +60,10 @@ def _test_data2_zero():
5860

5961
class TestSparseSeries(SharedWithSparse):
6062

63+
series_klass = SparseSeries
64+
# SharedWithSparse tests use generic, series_klass-agnostic assertion
65+
_assert_series_equal = staticmethod(tm.assert_sp_series_equal)
66+
6167
def setup_method(self, method):
6268
arr, index = _test_data1()
6369

@@ -1379,3 +1385,18 @@ def test_numpy_func_call(self):
13791385
for func in funcs:
13801386
for series in ('bseries', 'zbseries'):
13811387
getattr(np, func)(getattr(self, series))
1388+
1389+
1390+
@pytest.mark.parametrize(
1391+
'datetime_type', (np.datetime64,
1392+
pd.Timestamp,
1393+
lambda x: datetime.strptime(x, '%Y-%m-%d')))
1394+
def test_constructor_dict_datetime64_index(datetime_type):
1395+
# GH 9456
1396+
dates = ['1984-02-19', '1988-11-06', '1989-12-03', '1990-03-15']
1397+
values = [42544017.198965244, 1234565, 40512335.181958228, -1]
1398+
1399+
result = SparseSeries(dict(zip(map(datetime_type, dates), values)))
1400+
expected = SparseSeries(values, map(pd.Timestamp, dates))
1401+
1402+
tm.assert_sp_series_equal(result, expected)

0 commit comments

Comments
 (0)