Skip to content

Commit d38d142

Browse files
committed
TST: more test_period reorg
1 parent 9ba1008 commit d38d142

File tree

6 files changed

+1285
-1261
lines changed

6 files changed

+1285
-1261
lines changed

pandas/tests/indexes/period/test_construction.py

+12-13
Original file line numberDiff line numberDiff line change
@@ -410,22 +410,9 @@ def test_constructor(self):
410410
self.assertTrue((i1 == i2).all())
411411
self.assertEqual(i1.freq, i2.freq)
412412

413-
try:
414-
PeriodIndex(start=start, end=end_intv)
415-
raise AssertionError('Cannot allow mixed freq for start and end')
416-
except ValueError:
417-
pass
418-
419413
end_intv = Period('2005-05-01', 'B')
420414
i1 = PeriodIndex(start=start, end=end_intv)
421415

422-
try:
423-
PeriodIndex(start=start)
424-
raise AssertionError(
425-
'Must specify periods if missing start or end')
426-
except ValueError:
427-
pass
428-
429416
# infer freq from first element
430417
i2 = PeriodIndex([end_intv, Period('2005-05-05', 'B')])
431418
self.assertEqual(len(i2), 2)
@@ -441,6 +428,18 @@ def test_constructor(self):
441428
vals = np.array(vals)
442429
self.assertRaises(ValueError, PeriodIndex, vals)
443430

431+
def test_constructor_error(self):
432+
start = Period('02-Apr-2005', 'B')
433+
end_intv = Period('2006-12-31', ('w', 1))
434+
435+
msg = 'Start and end must have same freq'
436+
with tm.assertRaisesRegexp(ValueError, msg):
437+
PeriodIndex(start=start, end=end_intv)
438+
439+
msg = 'Must specify 2 of start, end, periods'
440+
with tm.assertRaisesRegexp(ValueError, msg):
441+
PeriodIndex(start=start)
442+
444443
def test_recreate_from_data(self):
445444
for o in ['M', 'Q', 'A', 'D', 'B', 'T', 'S', 'L', 'U', 'N', 'H']:
446445
org = PeriodIndex(start='2001/04/01', freq=o, periods=1)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
from datetime import datetime
2+
3+
import numpy as np
4+
import pandas as pd
5+
from pandas.util import testing as tm
6+
from pandas.compat import lrange
7+
from pandas import (PeriodIndex, Series, DatetimeIndex,
8+
period_range, Period, tslib, _np_version_under1p9)
9+
10+
11+
class TestGetItem(tm.TestCase):
12+
13+
def setUp(self):
14+
pass
15+
16+
def test_getitem(self):
17+
idx1 = pd.period_range('2011-01-01', '2011-01-31', freq='D',
18+
name='idx')
19+
20+
for idx in [idx1]:
21+
result = idx[0]
22+
self.assertEqual(result, pd.Period('2011-01-01', freq='D'))
23+
24+
result = idx[-1]
25+
self.assertEqual(result, pd.Period('2011-01-31', freq='D'))
26+
27+
result = idx[0:5]
28+
expected = pd.period_range('2011-01-01', '2011-01-05', freq='D',
29+
name='idx')
30+
self.assert_index_equal(result, expected)
31+
self.assertEqual(result.freq, expected.freq)
32+
self.assertEqual(result.freq, 'D')
33+
34+
result = idx[0:10:2]
35+
expected = pd.PeriodIndex(['2011-01-01', '2011-01-03',
36+
'2011-01-05',
37+
'2011-01-07', '2011-01-09'],
38+
freq='D', name='idx')
39+
self.assert_index_equal(result, expected)
40+
self.assertEqual(result.freq, expected.freq)
41+
self.assertEqual(result.freq, 'D')
42+
43+
result = idx[-20:-5:3]
44+
expected = pd.PeriodIndex(['2011-01-12', '2011-01-15',
45+
'2011-01-18',
46+
'2011-01-21', '2011-01-24'],
47+
freq='D', name='idx')
48+
self.assert_index_equal(result, expected)
49+
self.assertEqual(result.freq, expected.freq)
50+
self.assertEqual(result.freq, 'D')
51+
52+
result = idx[4::-1]
53+
expected = PeriodIndex(['2011-01-05', '2011-01-04', '2011-01-03',
54+
'2011-01-02', '2011-01-01'],
55+
freq='D', name='idx')
56+
self.assert_index_equal(result, expected)
57+
self.assertEqual(result.freq, expected.freq)
58+
self.assertEqual(result.freq, 'D')
59+
60+
def test_getitem_index(self):
61+
idx = period_range('2007-01', periods=10, freq='M', name='x')
62+
63+
result = idx[[1, 3, 5]]
64+
exp = pd.PeriodIndex(['2007-02', '2007-04', '2007-06'],
65+
freq='M', name='x')
66+
tm.assert_index_equal(result, exp)
67+
68+
result = idx[[True, True, False, False, False,
69+
True, True, False, False, False]]
70+
exp = pd.PeriodIndex(['2007-01', '2007-02', '2007-06', '2007-07'],
71+
freq='M', name='x')
72+
tm.assert_index_equal(result, exp)
73+
74+
def test_getitem_partial(self):
75+
rng = period_range('2007-01', periods=50, freq='M')
76+
ts = Series(np.random.randn(len(rng)), rng)
77+
78+
self.assertRaises(KeyError, ts.__getitem__, '2006')
79+
80+
result = ts['2008']
81+
self.assertTrue((result.index.year == 2008).all())
82+
83+
result = ts['2008':'2009']
84+
self.assertEqual(len(result), 24)
85+
86+
result = ts['2008-1':'2009-12']
87+
self.assertEqual(len(result), 24)
88+
89+
result = ts['2008Q1':'2009Q4']
90+
self.assertEqual(len(result), 24)
91+
92+
result = ts[:'2009']
93+
self.assertEqual(len(result), 36)
94+
95+
result = ts['2009':]
96+
self.assertEqual(len(result), 50 - 24)
97+
98+
exp = result
99+
result = ts[24:]
100+
tm.assert_series_equal(exp, result)
101+
102+
ts = ts[10:].append(ts[10:])
103+
self.assertRaisesRegexp(KeyError,
104+
"left slice bound for non-unique "
105+
"label: '2008'",
106+
ts.__getitem__, slice('2008', '2009'))
107+
108+
def test_getitem_datetime(self):
109+
rng = period_range(start='2012-01-01', periods=10, freq='W-MON')
110+
ts = Series(lrange(len(rng)), index=rng)
111+
112+
dt1 = datetime(2011, 10, 2)
113+
dt4 = datetime(2012, 4, 20)
114+
115+
rs = ts[dt1:dt4]
116+
tm.assert_series_equal(rs, ts)
117+
118+
def test_getitem_nat(self):
119+
idx = pd.PeriodIndex(['2011-01', 'NaT', '2011-02'], freq='M')
120+
self.assertEqual(idx[0], pd.Period('2011-01', freq='M'))
121+
self.assertIs(idx[1], tslib.NaT)
122+
123+
s = pd.Series([0, 1, 2], index=idx)
124+
self.assertEqual(s[pd.NaT], 1)
125+
126+
s = pd.Series(idx, index=idx)
127+
self.assertEqual(s[pd.Period('2011-01', freq='M')],
128+
pd.Period('2011-01', freq='M'))
129+
self.assertIs(s[pd.NaT], tslib.NaT)
130+
131+
def test_getitem_list_periods(self):
132+
# GH 7710
133+
rng = period_range(start='2012-01-01', periods=10, freq='D')
134+
ts = Series(lrange(len(rng)), index=rng)
135+
exp = ts.iloc[[1]]
136+
tm.assert_series_equal(ts[[Period('2012-01-02', freq='D')]], exp)
137+
138+
def test_getitem_seconds(self):
139+
# GH 6716
140+
didx = DatetimeIndex(start='2013/01/01 09:00:00', freq='S',
141+
periods=4000)
142+
pidx = PeriodIndex(start='2013/01/01 09:00:00', freq='S', periods=4000)
143+
144+
for idx in [didx, pidx]:
145+
# getitem against index should raise ValueError
146+
values = ['2014', '2013/02', '2013/01/02', '2013/02/01 9H',
147+
'2013/02/01 09:00']
148+
for v in values:
149+
if _np_version_under1p9:
150+
with tm.assertRaises(ValueError):
151+
idx[v]
152+
else:
153+
# GH7116
154+
# these show deprecations as we are trying
155+
# to slice with non-integer indexers
156+
# with tm.assertRaises(IndexError):
157+
# idx[v]
158+
continue
159+
160+
s = Series(np.random.rand(len(idx)), index=idx)
161+
tm.assert_series_equal(s['2013/01/01 10:00'], s[3600:3660])
162+
tm.assert_series_equal(s['2013/01/01 9H'], s[:3600])
163+
for d in ['2013/01/01', '2013/01', '2013']:
164+
tm.assert_series_equal(s[d], s)
165+
166+
def test_getitem_day(self):
167+
# GH 6716
168+
# Confirm DatetimeIndex and PeriodIndex works identically
169+
didx = DatetimeIndex(start='2013/01/01', freq='D', periods=400)
170+
pidx = PeriodIndex(start='2013/01/01', freq='D', periods=400)
171+
172+
for idx in [didx, pidx]:
173+
# getitem against index should raise ValueError
174+
values = ['2014', '2013/02', '2013/01/02', '2013/02/01 9H',
175+
'2013/02/01 09:00']
176+
for v in values:
177+
178+
if _np_version_under1p9:
179+
with tm.assertRaises(ValueError):
180+
idx[v]
181+
else:
182+
# GH7116
183+
# these show deprecations as we are trying
184+
# to slice with non-integer indexers
185+
# with tm.assertRaises(IndexError):
186+
# idx[v]
187+
continue
188+
189+
s = Series(np.random.rand(len(idx)), index=idx)
190+
tm.assert_series_equal(s['2013/01'], s[0:31])
191+
tm.assert_series_equal(s['2013/02'], s[31:59])
192+
tm.assert_series_equal(s['2014'], s[365:])
193+
194+
invalid = ['2013/02/01 9H', '2013/02/01 09:00']
195+
for v in invalid:
196+
with tm.assertRaises(KeyError):
197+
s[v]
198+
199+
200+
class TestIndexing(tm.TestCase):
201+
202+
def test_get_loc_msg(self):
203+
idx = period_range('2000-1-1', freq='A', periods=10)
204+
bad_period = Period('2012', 'A')
205+
self.assertRaises(KeyError, idx.get_loc, bad_period)
206+
207+
try:
208+
idx.get_loc(bad_period)
209+
except KeyError as inst:
210+
self.assertEqual(inst.args[0], bad_period)
211+
212+
def test_get_loc_nat(self):
213+
didx = DatetimeIndex(['2011-01-01', 'NaT', '2011-01-03'])
214+
pidx = PeriodIndex(['2011-01-01', 'NaT', '2011-01-03'], freq='M')
215+
216+
# check DatetimeIndex compat
217+
for idx in [didx, pidx]:
218+
self.assertEqual(idx.get_loc(pd.NaT), 1)
219+
self.assertEqual(idx.get_loc(None), 1)
220+
self.assertEqual(idx.get_loc(float('nan')), 1)
221+
self.assertEqual(idx.get_loc(np.nan), 1)
222+
223+
def test_take(self):
224+
# GH 10295
225+
idx1 = pd.period_range('2011-01-01', '2011-01-31', freq='D',
226+
name='idx')
227+
228+
for idx in [idx1]:
229+
result = idx.take([0])
230+
self.assertEqual(result, pd.Period('2011-01-01', freq='D'))
231+
232+
result = idx.take([5])
233+
self.assertEqual(result, pd.Period('2011-01-06', freq='D'))
234+
235+
result = idx.take([0, 1, 2])
236+
expected = pd.period_range('2011-01-01', '2011-01-03', freq='D',
237+
name='idx')
238+
self.assert_index_equal(result, expected)
239+
self.assertEqual(result.freq, 'D')
240+
self.assertEqual(result.freq, expected.freq)
241+
242+
result = idx.take([0, 2, 4])
243+
expected = pd.PeriodIndex(['2011-01-01', '2011-01-03',
244+
'2011-01-05'], freq='D', name='idx')
245+
self.assert_index_equal(result, expected)
246+
self.assertEqual(result.freq, expected.freq)
247+
self.assertEqual(result.freq, 'D')
248+
249+
result = idx.take([7, 4, 1])
250+
expected = pd.PeriodIndex(['2011-01-08', '2011-01-05',
251+
'2011-01-02'],
252+
freq='D', name='idx')
253+
self.assert_index_equal(result, expected)
254+
self.assertEqual(result.freq, expected.freq)
255+
self.assertEqual(result.freq, 'D')
256+
257+
result = idx.take([3, 2, 5])
258+
expected = PeriodIndex(['2011-01-04', '2011-01-03', '2011-01-06'],
259+
freq='D', name='idx')
260+
self.assert_index_equal(result, expected)
261+
self.assertEqual(result.freq, expected.freq)
262+
self.assertEqual(result.freq, 'D')
263+
264+
result = idx.take([-3, 2, 5])
265+
expected = PeriodIndex(['2011-01-29', '2011-01-03', '2011-01-06'],
266+
freq='D', name='idx')
267+
self.assert_index_equal(result, expected)
268+
self.assertEqual(result.freq, expected.freq)
269+
self.assertEqual(result.freq, 'D')
270+
271+
def test_take_misc(self):
272+
index = PeriodIndex(start='1/1/10', end='12/31/12', freq='D',
273+
name='idx')
274+
expected = PeriodIndex([datetime(2010, 1, 6), datetime(2010, 1, 7),
275+
datetime(2010, 1, 9), datetime(2010, 1, 13)],
276+
freq='D', name='idx')
277+
278+
taken1 = index.take([5, 6, 8, 12])
279+
taken2 = index[[5, 6, 8, 12]]
280+
281+
for taken in [taken1, taken2]:
282+
tm.assert_index_equal(taken, expected)
283+
tm.assertIsInstance(taken, PeriodIndex)
284+
self.assertEqual(taken.freq, index.freq)
285+
self.assertEqual(taken.name, expected.name)
286+
287+
def test_take_fill_value(self):
288+
# GH 12631
289+
idx = pd.PeriodIndex(['2011-01-01', '2011-02-01', '2011-03-01'],
290+
name='xxx', freq='D')
291+
result = idx.take(np.array([1, 0, -1]))
292+
expected = pd.PeriodIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
293+
name='xxx', freq='D')
294+
tm.assert_index_equal(result, expected)
295+
296+
# fill_value
297+
result = idx.take(np.array([1, 0, -1]), fill_value=True)
298+
expected = pd.PeriodIndex(['2011-02-01', '2011-01-01', 'NaT'],
299+
name='xxx', freq='D')
300+
tm.assert_index_equal(result, expected)
301+
302+
# allow_fill=False
303+
result = idx.take(np.array([1, 0, -1]), allow_fill=False,
304+
fill_value=True)
305+
expected = pd.PeriodIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
306+
name='xxx', freq='D')
307+
tm.assert_index_equal(result, expected)
308+
309+
msg = ('When allow_fill=True and fill_value is not None, '
310+
'all indices must be >= -1')
311+
with tm.assertRaisesRegexp(ValueError, msg):
312+
idx.take(np.array([1, 0, -2]), fill_value=True)
313+
with tm.assertRaisesRegexp(ValueError, msg):
314+
idx.take(np.array([1, 0, -5]), fill_value=True)
315+
316+
with tm.assertRaises(IndexError):
317+
idx.take(np.array([1, -5]))

0 commit comments

Comments
 (0)