PageRenderTime 53ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/pandas/tests/test_index.py

http://github.com/wesm/pandas
Python | 1423 lines | 984 code | 338 blank | 101 comment | 9 complexity | 6b314bd5e559aceded8efaced25c3376 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. # pylint: disable=E1101,E1103,W0232
  2. from datetime import datetime, timedelta
  3. import operator
  4. import pickle
  5. import unittest
  6. import nose
  7. import numpy as np
  8. from pandas.core.index import Index, Int64Index, Factor, MultiIndex
  9. from pandas.util.testing import assert_almost_equal
  10. from pandas.util import py3compat
  11. import pandas.util.testing as tm
  12. import pandas._tseries as tseries
  13. class TestIndex(unittest.TestCase):
  14. def setUp(self):
  15. self.strIndex = tm.makeStringIndex(100)
  16. self.dateIndex = tm.makeDateIndex(100)
  17. self.intIndex = tm.makeIntIndex(100)
  18. self.empty = Index([])
  19. self.tuples = Index(zip(['foo', 'bar', 'baz'], [1, 2, 3]))
  20. def test_hash_error(self):
  21. self.assertRaises(TypeError, hash, self.strIndex)
  22. def test_new_axis(self):
  23. new_index = self.dateIndex[None, :]
  24. self.assert_(new_index.ndim == 2)
  25. self.assert_(type(new_index) == np.ndarray)
  26. def test_deepcopy(self):
  27. from copy import deepcopy
  28. copy = deepcopy(self.strIndex)
  29. self.assert_(copy is self.strIndex)
  30. def test_duplicates(self):
  31. idx = Index([0, 0, 0])
  32. self.assert_(not idx._verify_integrity())
  33. self.assertRaises(Exception, getattr, idx, 'indexMap')
  34. def test_sort(self):
  35. self.assertRaises(Exception, self.strIndex.sort)
  36. def test_mutability(self):
  37. self.assertRaises(Exception, self.strIndex.__setitem__, 5, 0)
  38. self.assertRaises(Exception, self.strIndex.__setitem__, slice(1,5), 0)
  39. def test_constructor(self):
  40. # regular instance creation
  41. tm.assert_contains_all(self.strIndex, self.strIndex)
  42. tm.assert_contains_all(self.dateIndex, self.dateIndex)
  43. # casting
  44. arr = np.array(self.strIndex)
  45. index = arr.view(Index)
  46. tm.assert_contains_all(arr, index)
  47. self.assert_(np.array_equal(self.strIndex, index))
  48. # what to do here?
  49. # arr = np.array(5.)
  50. # self.assertRaises(Exception, arr.view, Index)
  51. def test_constructor_corner(self):
  52. # corner case
  53. self.assertRaises(Exception, Index, 0)
  54. def test_astype(self):
  55. casted = self.intIndex.astype('i8')
  56. # it works!
  57. casted.get_loc(5)
  58. # pass on name
  59. self.intIndex.name = 'foobar'
  60. casted = self.intIndex.astype('i8')
  61. self.assertEqual(casted.name, 'foobar')
  62. def test_compat(self):
  63. self.strIndex.tolist()
  64. def test_equals(self):
  65. # same
  66. self.assert_(Index(['a', 'b', 'c']).equals(Index(['a', 'b', 'c'])))
  67. # different length
  68. self.assertFalse(Index(['a', 'b', 'c']).equals(Index(['a', 'b'])))
  69. # same length, different values
  70. self.assertFalse(Index(['a', 'b', 'c']).equals(Index(['a', 'b', 'd'])))
  71. # Must also be an Index
  72. self.assertFalse(Index(['a', 'b', 'c']).equals(['a', 'b', 'c']))
  73. def test_asof(self):
  74. d = self.dateIndex[0]
  75. self.assert_(self.dateIndex.asof(d) is d)
  76. self.assert_(np.isnan(self.dateIndex.asof(d - timedelta(1))))
  77. d = self.dateIndex[-1]
  78. self.assert_(self.dateIndex.asof(d + timedelta(1)) is d)
  79. def test_argsort(self):
  80. result = self.strIndex.argsort()
  81. expected = np.array(self.strIndex).argsort()
  82. self.assert_(np.array_equal(result, expected))
  83. def test_comparators(self):
  84. index = self.dateIndex
  85. element = index[len(index) // 2]
  86. arr = np.array(index)
  87. def _check(op):
  88. arr_result = op(arr, element)
  89. index_result = op(index, element)
  90. self.assert_(isinstance(index_result, np.ndarray))
  91. self.assert_(not isinstance(index_result, Index))
  92. self.assert_(np.array_equal(arr_result, index_result))
  93. _check(operator.eq)
  94. _check(operator.ne)
  95. _check(operator.gt)
  96. _check(operator.lt)
  97. _check(operator.ge)
  98. _check(operator.le)
  99. def test_booleanindex(self):
  100. boolIdx = np.repeat(True, len(self.strIndex)).astype(bool)
  101. boolIdx[5:30:2] = False
  102. subIndex = self.strIndex[boolIdx]
  103. tm.assert_dict_equal(tseries.map_indices_object(subIndex),
  104. subIndex.indexMap)
  105. subIndex = self.strIndex[list(boolIdx)]
  106. tm.assert_dict_equal(tseries.map_indices_object(subIndex),
  107. subIndex.indexMap)
  108. def test_fancy(self):
  109. sl = self.strIndex[[1,2,3]]
  110. for i in sl:
  111. self.assertEqual(i, sl[sl.indexMap[i]])
  112. def test_getitem(self):
  113. arr = np.array(self.dateIndex)
  114. self.assertEquals(self.dateIndex[5], arr[5])
  115. def test_shift(self):
  116. shifted = self.dateIndex.shift(0, timedelta(1))
  117. self.assert_(shifted is self.dateIndex)
  118. shifted = self.dateIndex.shift(5, timedelta(1))
  119. self.assert_(np.array_equal(shifted, self.dateIndex + timedelta(5)))
  120. def test_intersection(self):
  121. first = self.strIndex[:20]
  122. second = self.strIndex[:10]
  123. intersect = first.intersection(second)
  124. self.assert_(tm.equalContents(intersect, second))
  125. # Corner cases
  126. inter = first.intersection(first)
  127. self.assert_(inter is first)
  128. # non-iterable input
  129. self.assertRaises(Exception, first.intersection, 0.5)
  130. def test_union(self):
  131. first = self.strIndex[5:20]
  132. second = self.strIndex[:10]
  133. everything = self.strIndex[:20]
  134. union = first.union(second)
  135. self.assert_(tm.equalContents(union, everything))
  136. # Corner cases
  137. union = first.union(first)
  138. self.assert_(union is first)
  139. union = first.union([])
  140. self.assert_(union is first)
  141. # non-iterable input
  142. self.assertRaises(Exception, first.union, 0.5)
  143. # preserve names
  144. first.name = 'A'
  145. second.name = 'A'
  146. union = first.union(second)
  147. self.assert_(union.name == 'A')
  148. second.name = 'B'
  149. union = first.union(second)
  150. self.assert_(union.name is None)
  151. def test_add(self):
  152. firstCat = self.strIndex + self.dateIndex
  153. secondCat = self.strIndex + self.strIndex
  154. self.assert_(tm.equalContents(np.append(self.strIndex,
  155. self.dateIndex), firstCat))
  156. self.assert_(tm.equalContents(secondCat, self.strIndex))
  157. tm.assert_contains_all(self.strIndex, firstCat.indexMap)
  158. tm.assert_contains_all(self.strIndex, secondCat.indexMap)
  159. tm.assert_contains_all(self.dateIndex, firstCat.indexMap)
  160. # this is valid too
  161. shifted = self.dateIndex + timedelta(1)
  162. def test_append_multiple(self):
  163. index = Index(['a', 'b', 'c', 'd', 'e', 'f'])
  164. foos = [index[:2], index[2:4], index[4:]]
  165. result = foos[0].append(foos[1:])
  166. self.assert_(result.equals(index))
  167. # empty
  168. result = index.append([])
  169. self.assert_(result.equals(index))
  170. def test_add_string(self):
  171. # from bug report
  172. index = Index(['a', 'b', 'c'])
  173. index2 = index + 'foo'
  174. self.assert_('a' not in index2.indexMap)
  175. self.assert_('afoo' in index2.indexMap)
  176. def test_diff(self):
  177. first = self.strIndex[5:20]
  178. second = self.strIndex[:10]
  179. answer = self.strIndex[10:20]
  180. result = first - second
  181. self.assert_(tm.equalContents(result, answer))
  182. diff = first.diff(first)
  183. self.assert_(len(diff) == 0)
  184. # non-iterable input
  185. self.assertRaises(Exception, first.diff, 0.5)
  186. def test_pickle(self):
  187. def testit(index):
  188. pickled = pickle.dumps(index)
  189. unpickled = pickle.loads(pickled)
  190. self.assert_(isinstance(unpickled, Index))
  191. self.assert_(np.array_equal(unpickled, index))
  192. self.assertEquals(unpickled.name, index.name)
  193. tm.assert_dict_equal(unpickled.indexMap, index.indexMap)
  194. testit(self.strIndex)
  195. self.strIndex.name = 'foo'
  196. testit(self.strIndex)
  197. testit(self.dateIndex)
  198. # def test_always_get_null_index(self):
  199. # empty = Index([])
  200. # self.assert_(empty is NULL_INDEX)
  201. # self.assert_(self.dateIndex[15:15] is NULL_INDEX)
  202. def test_is_all_dates(self):
  203. self.assert_(self.dateIndex.is_all_dates)
  204. self.assert_(not self.strIndex.is_all_dates)
  205. self.assert_(not self.intIndex.is_all_dates)
  206. def test_summary(self):
  207. self._check_method_works(Index.summary)
  208. def test_format(self):
  209. self._check_method_works(Index.format)
  210. index = Index([datetime.now()])
  211. formatted = index.format()
  212. expected = [str(index[0])]
  213. self.assertEquals(formatted, expected)
  214. self.strIndex[:0].format()
  215. def test_format_with_name_time_info(self):
  216. # bug I fixed 12/20/2011
  217. inc = timedelta(hours=4)
  218. dates = Index([dt + inc for dt in self.dateIndex], name='something')
  219. formatted = dates.format(name=True)
  220. self.assert_(formatted[0] == 'something')
  221. def test_take(self):
  222. indexer = [4, 3, 0, 2]
  223. result = self.dateIndex.take(indexer)
  224. expected = self.dateIndex[indexer]
  225. self.assert_(result.equals(expected))
  226. def _check_method_works(self, method):
  227. method(self.empty)
  228. method(self.dateIndex)
  229. method(self.strIndex)
  230. method(self.intIndex)
  231. method(self.tuples)
  232. def test_get_indexer(self):
  233. idx1 = Index([1, 2, 3, 4, 5])
  234. idx2 = Index([2, 4, 6])
  235. r1 = idx1.get_indexer(idx2)
  236. assert_almost_equal(r1, [1, 3, -1])
  237. r1 = idx2.get_indexer(idx1, method='pad')
  238. assert_almost_equal(r1, [-1, 0, 0, 1, 1])
  239. rffill1 = idx2.get_indexer(idx1, method='ffill')
  240. assert_almost_equal(r1, rffill1)
  241. r1 = idx2.get_indexer(idx1, method='backfill')
  242. assert_almost_equal(r1, [0, 0, 1, 1, 2])
  243. rbfill1 = idx2.get_indexer(idx1, method='bfill')
  244. assert_almost_equal(r1, rbfill1)
  245. def test_slice_locs(self):
  246. idx = Index([0, 1, 2, 5, 6, 7, 9, 10])
  247. n = len(idx)
  248. self.assertEquals(idx.slice_locs(start=2), (2, n))
  249. self.assertEquals(idx.slice_locs(start=3), (3, n))
  250. self.assertEquals(idx.slice_locs(3, 8), (3, 6))
  251. self.assertEquals(idx.slice_locs(5, 10), (3, n))
  252. self.assertEquals(idx.slice_locs(end=8), (0, 6))
  253. self.assertEquals(idx.slice_locs(end=9), (0, 7))
  254. idx2 = idx[::-1]
  255. self.assertRaises(KeyError, idx2.slice_locs, 8, 2)
  256. self.assertRaises(KeyError, idx2.slice_locs, 7, 3)
  257. def test_drop(self):
  258. n = len(self.strIndex)
  259. dropped = self.strIndex.drop(self.strIndex[range(5, 10)])
  260. expected = self.strIndex[range(5) + range(10, n)]
  261. self.assert_(dropped.equals(expected))
  262. self.assertRaises(ValueError, self.strIndex.drop, ['foo', 'bar'])
  263. def test_tuple_union_bug(self):
  264. import pandas
  265. import numpy as np
  266. aidx1 = np.array([(1, 'A'),(2, 'A'),(1, 'B'),(2, 'B')], dtype=[('num',
  267. int),('let', 'a1')])
  268. aidx2 = np.array([(1, 'A'),(2, 'A'),(1, 'B'),(2, 'B'),(1,'C'),(2,
  269. 'C')], dtype=[('num', int),('let', 'a1')])
  270. idx1 = pandas.Index(aidx1)
  271. idx2 = pandas.Index(aidx2)
  272. # intersection broken?
  273. int_idx = idx1.intersection(idx2)
  274. # needs to be 1d like idx1 and idx2
  275. expected = idx1[:4] # pandas.Index(sorted(set(idx1) & set(idx2)))
  276. self.assert_(int_idx.ndim == 1)
  277. self.assert_(int_idx.equals(expected))
  278. # union broken
  279. union_idx = idx1.union(idx2)
  280. expected = pandas.Index(sorted(set(idx1) | set(idx2)))
  281. self.assert_(union_idx.ndim == 1)
  282. self.assert_(union_idx.equals(expected))
  283. def test_is_monotonic_incomparable(self):
  284. index = Index([5, datetime.now(), 7])
  285. self.assert_(not index.is_monotonic)
  286. def test_get_set_value(self):
  287. values = np.random.randn(100)
  288. date = self.dateIndex[67]
  289. assert_almost_equal(self.dateIndex.get_value(values, date),
  290. values[67])
  291. self.dateIndex.set_value(values, date, 10)
  292. self.assertEquals(values[67], 10)
  293. def test_isin(self):
  294. values = ['foo', 'bar']
  295. idx = Index(['qux', 'baz', 'foo', 'bar'])
  296. result = idx.isin(values)
  297. expected = np.array([False, False, True, True])
  298. self.assert_(np.array_equal(result, expected))
  299. # empty, return dtype bool
  300. idx = Index([])
  301. result = idx.isin(values)
  302. self.assert_(len(result) == 0)
  303. self.assert_(result.dtype == np.bool_)
  304. class TestInt64Index(unittest.TestCase):
  305. def setUp(self):
  306. self.index = Int64Index(np.arange(0, 20, 2))
  307. def test_constructor(self):
  308. # pass list, coerce fine
  309. index = Int64Index([-5, 0, 1, 2])
  310. expected = np.array([-5, 0, 1, 2], dtype=np.int64)
  311. self.assert_(np.array_equal(index, expected))
  312. # from iterable
  313. index = Int64Index(iter([-5, 0, 1, 2]))
  314. self.assert_(np.array_equal(index, expected))
  315. # scalar raise Exception
  316. self.assertRaises(ValueError, Int64Index, 5)
  317. def test_constructor_corner(self):
  318. arr = np.array([1, 2, 3, 4], dtype=object)
  319. index = Int64Index(arr)
  320. self.assert_(index.values.dtype == np.int64)
  321. self.assert_(index.equals(arr))
  322. # preventing casting
  323. arr = np.array([1, '2', 3, '4'], dtype=object)
  324. self.assertRaises(TypeError, Int64Index, arr)
  325. def test_coerce_list(self):
  326. # coerce things
  327. arr = Index([1, 2, 3, 4])
  328. self.assert_(type(arr) == Int64Index)
  329. # but not if explicit dtype passed
  330. arr = Index([1, 2, 3, 4], dtype=object)
  331. self.assert_(type(arr) == Index)
  332. def test_dtype(self):
  333. self.assert_(self.index.dtype == np.int64)
  334. def test_is_monotonic(self):
  335. self.assert_(self.index.is_monotonic)
  336. index = Int64Index([4, 3, 2, 1])
  337. self.assert_(not index.is_monotonic)
  338. def test_equals(self):
  339. same_values = Index(self.index, dtype=object)
  340. self.assert_(self.index.equals(same_values))
  341. self.assert_(same_values.equals(self.index))
  342. def test_get_indexer(self):
  343. target = Int64Index(np.arange(10))
  344. indexer = self.index.get_indexer(target)
  345. expected = np.array([0, -1, 1, -1, 2, -1, 3, -1, 4, -1])
  346. self.assert_(np.array_equal(indexer, expected))
  347. def test_get_indexer_pad(self):
  348. target = Int64Index(np.arange(10))
  349. indexer = self.index.get_indexer(target, method='pad')
  350. expected = np.array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4])
  351. self.assert_(np.array_equal(indexer, expected))
  352. def test_get_indexer_backfill(self):
  353. target = Int64Index(np.arange(10))
  354. indexer = self.index.get_indexer(target, method='backfill')
  355. expected = np.array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5])
  356. self.assert_(np.array_equal(indexer, expected))
  357. def test_join_outer(self):
  358. other = Int64Index([7, 12, 25, 1, 2, 5])
  359. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  360. # not monotonic
  361. # guarantee of sortedness
  362. res, lidx, ridx = self.index.join(other, how='outer',
  363. return_indexers=True)
  364. noidx_res = self.index.join(other, how='outer')
  365. self.assert_(res.equals(noidx_res))
  366. eres = Int64Index([0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 25])
  367. elidx = np.array([0, -1, 1, 2, -1, 3, -1, 4, 5, 6, 7, 8, 9, -1],
  368. dtype='i4')
  369. eridx = np.array([-1, 3, 4, -1, 5, -1, 0, -1, -1, 1, -1, -1, -1, 2],
  370. dtype='i4')
  371. self.assert_(isinstance(res, Int64Index))
  372. self.assert_(res.equals(eres))
  373. self.assert_(np.array_equal(lidx, elidx))
  374. self.assert_(np.array_equal(ridx, eridx))
  375. # monotonic
  376. res, lidx, ridx = self.index.join(other_mono, how='outer',
  377. return_indexers=True)
  378. noidx_res = self.index.join(other_mono, how='outer')
  379. self.assert_(res.equals(noidx_res))
  380. eridx = np.array([-1, 0, 1, -1, 2, -1, 3, -1, -1, 4, -1, -1, -1, 5],
  381. dtype='i4')
  382. self.assert_(isinstance(res, Int64Index))
  383. self.assert_(res.equals(eres))
  384. self.assert_(np.array_equal(lidx, elidx))
  385. self.assert_(np.array_equal(ridx, eridx))
  386. def test_join_inner(self):
  387. other = Int64Index([7, 12, 25, 1, 2, 5])
  388. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  389. # not monotonic
  390. res, lidx, ridx = self.index.join(other, how='inner',
  391. return_indexers=True)
  392. # no guarantee of sortedness, so sort for comparison purposes
  393. ind = res.argsort()
  394. res = res.take(ind)
  395. lidx = lidx.take(ind)
  396. ridx = ridx.take(ind)
  397. eres = Int64Index([2, 12])
  398. elidx = np.array([1, 6])
  399. eridx = np.array([4, 1])
  400. self.assert_(isinstance(res, Int64Index))
  401. self.assert_(res.equals(eres))
  402. self.assert_(np.array_equal(lidx, elidx))
  403. self.assert_(np.array_equal(ridx, eridx))
  404. # monotonic
  405. res, lidx, ridx = self.index.join(other_mono, how='inner',
  406. return_indexers=True)
  407. res2 = self.index.intersection(other_mono)
  408. self.assert_(res.equals(res2))
  409. eridx = np.array([1, 4])
  410. self.assert_(isinstance(res, Int64Index))
  411. self.assert_(res.equals(eres))
  412. self.assert_(np.array_equal(lidx, elidx))
  413. self.assert_(np.array_equal(ridx, eridx))
  414. def test_join_left(self):
  415. other = Int64Index([7, 12, 25, 1, 2, 5])
  416. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  417. # not monotonic
  418. res, lidx, ridx = self.index.join(other, how='left',
  419. return_indexers=True)
  420. eres = self.index
  421. eridx = np.array([-1, 4, -1, -1, -1, -1, 1, -1, -1, -1],
  422. dtype='i4')
  423. self.assert_(isinstance(res, Int64Index))
  424. self.assert_(res.equals(eres))
  425. self.assert_(lidx is None)
  426. self.assert_(np.array_equal(ridx, eridx))
  427. # monotonic
  428. res, lidx, ridx = self.index.join(other_mono, how='left',
  429. return_indexers=True)
  430. eridx = np.array([-1, 1, -1, -1, -1, -1, 4, -1, -1, -1],
  431. dtype='i4')
  432. self.assert_(isinstance(res, Int64Index))
  433. self.assert_(res.equals(eres))
  434. self.assert_(lidx is None)
  435. self.assert_(np.array_equal(ridx, eridx))
  436. def test_join_right(self):
  437. other = Int64Index([7, 12, 25, 1, 2, 5])
  438. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  439. # not monotonic
  440. res, lidx, ridx = self.index.join(other, how='right',
  441. return_indexers=True)
  442. eres = other
  443. elidx = np.array([-1, 6, -1, -1, 1, -1],
  444. dtype='i4')
  445. self.assert_(isinstance(other, Int64Index))
  446. self.assert_(res.equals(eres))
  447. self.assert_(np.array_equal(lidx, elidx))
  448. self.assert_(ridx is None)
  449. # monotonic
  450. res, lidx, ridx = self.index.join(other_mono, how='right',
  451. return_indexers=True)
  452. eres = other_mono
  453. elidx = np.array([-1, 1, -1, -1, 6, -1],
  454. dtype='i4')
  455. self.assert_(isinstance(other, Int64Index))
  456. self.assert_(res.equals(eres))
  457. self.assert_(np.array_equal(lidx, elidx))
  458. self.assert_(ridx is None)
  459. def test_join_non_int_index(self):
  460. other = Index([3, 6, 7, 8, 10], dtype=object)
  461. outer = self.index.join(other, how='outer')
  462. outer2 = other.join(self.index, how='outer')
  463. expected = Index([0, 2, 3, 4, 6, 7, 8, 10, 12, 14,
  464. 16, 18], dtype=object)
  465. self.assert_(outer.equals(outer2))
  466. self.assert_(outer.equals(expected))
  467. inner = self.index.join(other, how='inner')
  468. inner2 = other.join(self.index, how='inner')
  469. expected = Index([6, 8, 10], dtype=object)
  470. self.assert_(inner.equals(inner2))
  471. self.assert_(inner.equals(expected))
  472. left = self.index.join(other, how='left')
  473. self.assert_(left.equals(self.index))
  474. left2 = other.join(self.index, how='left')
  475. self.assert_(left2.equals(other))
  476. right = self.index.join(other, how='right')
  477. self.assert_(right.equals(other))
  478. right2 = other.join(self.index, how='right')
  479. self.assert_(right2.equals(self.index))
  480. def test_intersection(self):
  481. other = Index([1, 2, 3, 4, 5])
  482. result = self.index.intersection(other)
  483. expected = np.sort(np.intersect1d(self.index.values, other.values))
  484. self.assert_(np.array_equal(result, expected))
  485. result = other.intersection(self.index)
  486. expected = np.sort(np.asarray(np.intersect1d(self.index.values,
  487. other.values)))
  488. self.assert_(np.array_equal(result, expected))
  489. def test_union_noncomparable(self):
  490. from datetime import datetime, timedelta
  491. # corner case, non-Int64Index
  492. now = datetime.now()
  493. other = Index([now + timedelta(i) for i in xrange(4)])
  494. result = self.index.union(other)
  495. expected = np.concatenate((self.index, other))
  496. self.assert_(np.array_equal(result, expected))
  497. result = other.union(self.index)
  498. expected = np.concatenate((other, self.index))
  499. self.assert_(np.array_equal(result, expected))
  500. def test_cant_or_shouldnt_cast(self):
  501. # can't
  502. data = ['foo', 'bar', 'baz']
  503. self.assertRaises(TypeError, Int64Index, data)
  504. # shouldn't
  505. data = ['0', '1', '2']
  506. self.assertRaises(TypeError, Int64Index, data)
  507. def test_view_Index(self):
  508. self.index.view(Index)
  509. def test_prevent_casting(self):
  510. result = self.index.astype('O')
  511. self.assert_(result.dtype == np.object_)
  512. def test_take_preserve_name(self):
  513. index = Int64Index([1,2,3,4], name='foo')
  514. taken = index.take([3,0,1])
  515. self.assertEqual(index.name, taken.name)
  516. def test_int_name_format(self):
  517. from pandas import Series, DataFrame
  518. index = Index(['a', 'b', 'c'], name=0)
  519. s = Series(range(3), index)
  520. df = DataFrame(range(3), index=index)
  521. repr(s)
  522. repr(df)
  523. class TestMultiIndex(unittest.TestCase):
  524. def setUp(self):
  525. major_axis = Index(['foo', 'bar', 'baz', 'qux'])
  526. minor_axis = Index(['one', 'two'])
  527. major_labels = np.array([0, 0, 1, 2, 3, 3])
  528. minor_labels = np.array([0, 1, 0, 1, 0, 1])
  529. self.index = MultiIndex(levels=[major_axis, minor_axis],
  530. labels=[major_labels, minor_labels],
  531. names=['first', 'second'])
  532. def test_constructor_single_level(self):
  533. single_level = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux']],
  534. labels=[[0, 1, 2, 3]],
  535. names=['first'])
  536. self.assert_(isinstance(single_level, Index))
  537. self.assert_(not isinstance(single_level, MultiIndex))
  538. self.assert_(single_level.name == 'first')
  539. single_level = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux']],
  540. labels=[[0, 1, 2, 3]])
  541. self.assert_(single_level.name is None)
  542. def test_constructor_no_levels(self):
  543. self.assertRaises(Exception, MultiIndex, levels=[], labels=[])
  544. def test_duplicate_names(self):
  545. self.index.names = ['foo', 'foo']
  546. self.assertRaises(Exception, self.index._get_level_number, 'foo')
  547. def test_get_level_number_integer(self):
  548. self.index.names = [1, 0]
  549. self.assertEqual(self.index._get_level_number(1), 0)
  550. self.assertEqual(self.index._get_level_number(0), 1)
  551. self.assertRaises(Exception, self.index._get_level_number, 2)
  552. self.assertRaises(Exception, self.index._get_level_number, 'fourth')
  553. def test_from_arrays(self):
  554. arrays = []
  555. for lev, lab in zip(self.index.levels, self.index.labels):
  556. arrays.append(np.asarray(lev).take(lab))
  557. result = MultiIndex.from_arrays(arrays)
  558. self.assertEquals(list(result), list(self.index))
  559. def test_append(self):
  560. result = self.index[:3].append(self.index[3:])
  561. self.assert_(result.equals(self.index))
  562. foos = [self.index[:1], self.index[1:3], self.index[3:]]
  563. result = foos[0].append(foos[1:])
  564. self.assert_(result.equals(self.index))
  565. # empty
  566. result = self.index.append([])
  567. self.assert_(result.equals(self.index))
  568. def test_get_level_values(self):
  569. result = self.index.get_level_values(0)
  570. expected = ['foo', 'foo', 'bar', 'baz', 'qux', 'qux']
  571. self.assert_(np.array_equal(result, expected))
  572. result = self.index.get_level_values('first')
  573. expected = self.index.get_level_values(0)
  574. self.assert_(np.array_equal(result, expected))
  575. def test_reorder_levels(self):
  576. # this blows up
  577. self.assertRaises(Exception, self.index.reorder_levels,
  578. [2, 1, 0])
  579. def test_nlevels(self):
  580. self.assertEquals(self.index.nlevels, 2)
  581. def test_iter(self):
  582. result = list(self.index)
  583. expected = [('foo', 'one'), ('foo', 'two'), ('bar', 'one'),
  584. ('baz', 'two'), ('qux', 'one'), ('qux', 'two')]
  585. self.assert_(result == expected)
  586. def test_pickle(self):
  587. pickled = pickle.dumps(self.index)
  588. unpickled = pickle.loads(pickled)
  589. self.assert_(self.index.equals(unpickled))
  590. def test_legacy_pickle(self):
  591. if py3compat.PY3:
  592. raise nose.SkipTest
  593. import os
  594. def curpath():
  595. pth, _ = os.path.split(os.path.abspath(__file__))
  596. return pth
  597. ppath = os.path.join(curpath(), 'data/multiindex_v1.pickle')
  598. obj = pickle.load(open(ppath, 'r'))
  599. self.assert_(obj._is_legacy_format)
  600. obj2 = MultiIndex.from_tuples(obj.values)
  601. self.assert_(obj.equals(obj2))
  602. res = obj.get_indexer(obj2[::-1])
  603. exp = obj.get_indexer(obj[::-1])
  604. exp2 = obj2.get_indexer(obj2[::-1])
  605. assert_almost_equal(res, exp)
  606. assert_almost_equal(exp, exp2)
  607. def test_contains(self):
  608. self.assert_(('foo', 'two') in self.index)
  609. self.assert_(('bar', 'two') not in self.index)
  610. self.assert_(None not in self.index)
  611. def test_is_all_dates(self):
  612. self.assert_(not self.index.is_all_dates)
  613. def test_getitem(self):
  614. # scalar
  615. self.assertEquals(self.index[2], ('bar', 'one'))
  616. # slice
  617. result = self.index[2:5]
  618. expected = self.index[[2,3,4]]
  619. self.assert_(result.equals(expected))
  620. # boolean
  621. result = self.index[[True, False, True, False, True, True]]
  622. result2 = self.index[np.array([True, False, True, False, True, True])]
  623. expected = self.index[[0, 2, 4, 5]]
  624. self.assert_(result.equals(expected))
  625. self.assert_(result2.equals(expected))
  626. def test_getitem_group_select(self):
  627. sorted_idx, _ = self.index.sortlevel(0)
  628. self.assertEquals(sorted_idx.get_loc('baz'), slice(3, 4))
  629. self.assertEquals(sorted_idx.get_loc('foo'), slice(0, 2))
  630. def test_get_loc(self):
  631. self.assert_(self.index.get_loc(('foo', 'two')) == 1)
  632. self.assert_(self.index.get_loc(('baz', 'two')) == 3)
  633. self.assertRaises(KeyError, self.index.get_loc, ('bar', 'two'))
  634. self.assertRaises(KeyError, self.index.get_loc, 'quux')
  635. # 3 levels
  636. index = MultiIndex(levels=[Index(range(4)),
  637. Index(range(4)),
  638. Index(range(4))],
  639. labels=[np.array([0, 0, 1, 2, 2, 2, 3, 3]),
  640. np.array([0, 1, 0, 0, 0, 1, 0, 1]),
  641. np.array([1, 0, 1, 1, 0, 0, 1, 0])])
  642. self.assertRaises(KeyError, index.get_loc, (1, 1))
  643. self.assert_(index.get_loc((2, 0)) == slice(3, 5))
  644. def test_get_loc_duplicates(self):
  645. index = Index([2, 2, 2, 2])
  646. self.assertRaises(Exception, index.get_loc, 2)
  647. def test_get_loc_level(self):
  648. index = MultiIndex(levels=[Index(range(4)),
  649. Index(range(4)),
  650. Index(range(4))],
  651. labels=[np.array([0, 0, 1, 2, 2, 2, 3, 3]),
  652. np.array([0, 1, 0, 0, 0, 1, 0, 1]),
  653. np.array([1, 0, 1, 1, 0, 0, 1, 0])])
  654. loc, new_index = index.get_loc_level((0, 1))
  655. expected = slice(1, 2)
  656. exp_index = index[expected].droplevel(0).droplevel(0)
  657. self.assertEqual(loc, expected)
  658. self.assert_(new_index.equals(exp_index))
  659. loc, new_index = index.get_loc_level((0, 1, 0))
  660. expected = 1
  661. self.assertEqual(loc, expected)
  662. self.assert_(new_index is None)
  663. self.assertRaises(KeyError, index.get_loc_level, (2, 2))
  664. index = MultiIndex(levels=[[2000], range(4)],
  665. labels=[np.array([0, 0, 0, 0]),
  666. np.array([0, 1, 2, 3])])
  667. result, new_index = index.get_loc_level((2000, slice(None, None)))
  668. expected = slice(None, None)
  669. self.assertEqual(result, expected)
  670. self.assert_(new_index.equals(index.droplevel(0)))
  671. def test_slice_locs(self):
  672. df = tm.makeTimeDataFrame()
  673. stacked = df.stack()
  674. idx = stacked.index
  675. slob = slice(*idx.slice_locs(df.index[5], df.index[15]))
  676. sliced = stacked[slob]
  677. expected = df[5:16].stack()
  678. tm.assert_almost_equal(sliced.values, expected.values)
  679. slob = slice(*idx.slice_locs(df.index[5] + timedelta(seconds=30),
  680. df.index[15] - timedelta(seconds=30)))
  681. sliced = stacked[slob]
  682. expected = df[6:15].stack()
  683. tm.assert_almost_equal(sliced.values, expected.values)
  684. def test_slice_locs_not_sorted(self):
  685. index = MultiIndex(levels=[Index(range(4)),
  686. Index(range(4)),
  687. Index(range(4))],
  688. labels=[np.array([0, 0, 1, 2, 2, 2, 3, 3]),
  689. np.array([0, 1, 0, 0, 0, 1, 0, 1]),
  690. np.array([1, 0, 1, 1, 0, 0, 1, 0])])
  691. self.assertRaises(Exception, index.slice_locs, (1, 0, 1),
  692. (2, 1, 0))
  693. # works
  694. sorted_index, _ = index.sortlevel(0)
  695. result = sorted_index.slice_locs((1, 0, 1), (2, 1, 0))
  696. def test_slice_locs_partial(self):
  697. sorted_idx, _ = self.index.sortlevel(0)
  698. result = sorted_idx.slice_locs(('foo', 'two'), ('qux', 'one'))
  699. self.assertEquals(result, (1, 5))
  700. result = sorted_idx.slice_locs(None, ('qux', 'one'))
  701. self.assertEquals(result, (0, 5))
  702. result = sorted_idx.slice_locs(('foo', 'two'), None)
  703. self.assertEquals(result, (1, len(sorted_idx)))
  704. result = sorted_idx.slice_locs('bar', 'baz')
  705. self.assertEquals(result, (2, 4))
  706. def test_slice_locs_not_contained(self):
  707. # some searchsorted action
  708. index = MultiIndex(levels=[[0, 2, 4, 6], [0, 2, 4]],
  709. labels=[[0, 0, 0, 1, 1, 2, 3, 3, 3],
  710. [0, 1, 2, 1, 2, 2, 0, 1, 2]],
  711. sortorder=0)
  712. result = index.slice_locs((1, 0), (5, 2))
  713. self.assertEquals(result, (3, 6))
  714. result = index.slice_locs(1, 5)
  715. self.assertEquals(result, (3, 6))
  716. result = index.slice_locs((2, 2), (5, 2))
  717. self.assertEquals(result, (3, 6))
  718. result = index.slice_locs(2, 5)
  719. self.assertEquals(result, (3, 6))
  720. result = index.slice_locs((1, 0), (6, 3))
  721. self.assertEquals(result, (3, 8))
  722. result = index.slice_locs(-1, 10)
  723. self.assertEquals(result, (0, len(index)))
  724. def test_consistency(self):
  725. # need to construct an overflow
  726. major_axis = range(70000)
  727. minor_axis = range(10)
  728. major_labels = np.arange(70000)
  729. minor_labels = np.repeat(range(10), 7000)
  730. # the fact that is works means it's consistent
  731. index = MultiIndex(levels=[major_axis, minor_axis],
  732. labels=[major_labels, minor_labels])
  733. # inconsistent
  734. major_labels = np.array([0, 0, 1, 1, 1, 2, 2, 3, 3])
  735. minor_labels = np.array([0, 1, 0, 1, 1, 0, 1, 0, 1])
  736. index = MultiIndex(levels=[major_axis, minor_axis],
  737. labels=[major_labels, minor_labels])
  738. self.assertRaises(Exception, getattr, index, 'indexMap')
  739. def test_truncate(self):
  740. major_axis = Index(range(4))
  741. minor_axis = Index(range(2))
  742. major_labels = np.array([0, 0, 1, 2, 3, 3])
  743. minor_labels = np.array([0, 1, 0, 1, 0, 1])
  744. index = MultiIndex(levels=[major_axis, minor_axis],
  745. labels=[major_labels, minor_labels])
  746. result = index.truncate(before=1)
  747. self.assert_('foo' not in result.levels[0])
  748. self.assert_(1 in result.levels[0])
  749. result = index.truncate(after=1)
  750. self.assert_(2 not in result.levels[0])
  751. self.assert_(1 in result.levels[0])
  752. result = index.truncate(before=1, after=2)
  753. self.assertEqual(len(result.levels[0]), 2)
  754. # after < before
  755. self.assertRaises(ValueError, index.truncate, 3, 1)
  756. def test_get_indexer(self):
  757. major_axis = Index(range(4))
  758. minor_axis = Index(range(2))
  759. major_labels = np.array([0, 0, 1, 2, 2, 3, 3])
  760. minor_labels = np.array([0, 1, 0, 0, 1, 0, 1])
  761. index = MultiIndex(levels=[major_axis, minor_axis],
  762. labels=[major_labels, minor_labels])
  763. idx1 = index[:5]
  764. idx2 = index[[1,3,5]]
  765. r1 = idx1.get_indexer(idx2)
  766. assert_almost_equal(r1, [1, 3, -1])
  767. r1 = idx2.get_indexer(idx1, method='pad')
  768. assert_almost_equal(r1, [-1, 0, 0, 1, 1])
  769. rffill1 = idx2.get_indexer(idx1, method='ffill')
  770. assert_almost_equal(r1, rffill1)
  771. r1 = idx2.get_indexer(idx1, method='backfill')
  772. assert_almost_equal(r1, [0, 0, 1, 1, 2])
  773. rbfill1 = idx2.get_indexer(idx1, method='bfill')
  774. assert_almost_equal(r1, rbfill1)
  775. # pass non-MultiIndex
  776. r1 = idx1.get_indexer(idx2.get_tuple_index())
  777. rexp1 = idx1.get_indexer(idx2)
  778. assert_almost_equal(r1, rexp1)
  779. r1 = idx1.get_indexer([1,2,3])
  780. self.assert_( (r1 == [-1, -1, -1]).all() )
  781. # self.assertRaises(Exception, idx1.get_indexer,
  782. # list(list(zip(*idx2.get_tuple_index()))[0]))
  783. def test_format(self):
  784. self.index.format()
  785. self.index[:0].format()
  786. def test_format_integer_names(self):
  787. index = MultiIndex(levels=[[0, 1], [0, 1]],
  788. labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
  789. names=[0, 1])
  790. index.format(names=True)
  791. def test_bounds(self):
  792. self.index._bounds
  793. def test_equals(self):
  794. self.assert_(self.index.equals(self.index))
  795. self.assert_(self.index.equal_levels(self.index))
  796. self.assert_(not self.index.equals(self.index[:-1]))
  797. self.assert_(self.index.equals(self.index.get_tuple_index()))
  798. # different number of levels
  799. index = MultiIndex(levels=[Index(range(4)),
  800. Index(range(4)),
  801. Index(range(4))],
  802. labels=[np.array([0, 0, 1, 2, 2, 2, 3, 3]),
  803. np.array([0, 1, 0, 0, 0, 1, 0, 1]),
  804. np.array([1, 0, 1, 1, 0, 0, 1, 0])])
  805. index2 = MultiIndex(levels=index.levels[:-1],
  806. labels=index.labels[:-1])
  807. self.assert_(not index.equals(index2))
  808. self.assert_(not index.equal_levels(index2))
  809. # levels are different
  810. major_axis = Index(range(4))
  811. minor_axis = Index(range(2))
  812. major_labels = np.array([0, 0, 1, 2, 2, 3])
  813. minor_labels = np.array([0, 1, 0, 0, 1, 0])
  814. index = MultiIndex(levels=[major_axis, minor_axis],
  815. labels=[major_labels, minor_labels])
  816. self.assert_(not self.index.equals(index))
  817. self.assert_(not self.index.equal_levels(index))
  818. # some of the labels are different
  819. major_axis = Index(['foo', 'bar', 'baz', 'qux'])
  820. minor_axis = Index(['one', 'two'])
  821. major_labels = np.array([0, 0, 2, 2, 3, 3])
  822. minor_labels = np.array([0, 1, 0, 1, 0, 1])
  823. index = MultiIndex(levels=[major_axis, minor_axis],
  824. labels=[major_labels, minor_labels])
  825. self.assert_(not self.index.equals(index))
  826. def test_union(self):
  827. piece1 = self.index[:5][::-1]
  828. piece2 = self.index[3:]
  829. the_union = piece1 | piece2
  830. tups = sorted(self.index.get_tuple_index())
  831. expected = MultiIndex.from_tuples(tups)
  832. self.assert_(the_union.equals(expected))
  833. # corner case, pass self or empty thing:
  834. the_union = self.index.union(self.index)
  835. self.assert_(the_union is self.index)
  836. the_union = self.index.union(self.index[:0])
  837. self.assert_(the_union is self.index)
  838. # won't work in python 3
  839. # tuples = self.index.get_tuple_index()
  840. # result = self.index[:4] | tuples[4:]
  841. # self.assert_(result.equals(tuples))
  842. # not valid for python 3
  843. # def test_union_with_regular_index(self):
  844. # other = Index(['A', 'B', 'C'])
  845. # result = other.union(self.index)
  846. # self.assert_(('foo', 'one') in result)
  847. # self.assert_('B' in result)
  848. # result2 = self.index.union(other)
  849. # self.assert_(result.equals(result2))
  850. def test_intersection(self):
  851. piece1 = self.index[:5][::-1]
  852. piece2 = self.index[3:]
  853. the_int = piece1 & piece2
  854. tups = sorted(self.index[3:5].get_tuple_index())
  855. expected = MultiIndex.from_tuples(tups)
  856. self.assert_(the_int.equals(expected))
  857. # corner case, pass self
  858. the_int = self.index.intersection(self.index)
  859. self.assert_(the_int is self.index)
  860. # empty intersection: disjoint
  861. empty = self.index[:2] & self.index[2:]
  862. expected = self.index[:0]
  863. self.assert_(empty.equals(expected))
  864. # can't do in python 3
  865. # tuples = self.index.get_tuple_index()
  866. # result = self.index & tuples
  867. # self.assert_(result.equals(tuples))
  868. def test_diff(self):
  869. first = self.index
  870. result = first - self.index[-3:]
  871. expected = MultiIndex.from_tuples(sorted(self.index[:-3].values),
  872. sortorder=0,
  873. names=self.index.names)
  874. self.assert_(isinstance(result, MultiIndex))
  875. self.assert_(result.equals(expected))
  876. self.assertEqual(result.names, self.index.names)
  877. # empty difference: reflexive
  878. result = self.index - self.index
  879. expected = self.index[:0]
  880. self.assert_(result.equals(expected))
  881. self.assertEqual(result.names, self.index.names)
  882. # empty difference: superset
  883. result = self.index[-3:] - self.index
  884. expected = self.index[:0]
  885. self.assert_(result.equals(expected))
  886. self.assertEqual(result.names, self.index.names)
  887. # empty difference: degenerate
  888. result = self.index[:0] - self.index
  889. expected = self.index[:0]
  890. self.assert_(result.equals(expected))
  891. self.assertEqual(result.names, self.index.names)
  892. # names not the same
  893. chunklet = self.index[-3:]
  894. chunklet.names = ['foo', 'baz']
  895. result = first - chunklet
  896. self.assertEqual(result.names, [None, None])
  897. # empty, but non-equal
  898. result = self.index - self.index.sortlevel(1)[0]
  899. self.assert_(len(result) == 0)
  900. # raise Exception called with non-MultiIndex
  901. self.assertRaises(Exception, first.diff, first.get_tuple_index())
  902. def test_from_tuples(self):
  903. self.assertRaises(Exception, MultiIndex.from_tuples, [])
  904. def test_argsort(self):
  905. result = self.index.argsort()
  906. expected = self.index.get_tuple_index().argsort()
  907. self.assert_(np.array_equal(result, expected))
  908. def test_sortlevel(self):
  909. import random
  910. tuples = list(self.index)
  911. random.shuffle(tuples)
  912. index = MultiIndex.from_tuples(tuples)
  913. sorted_idx, _ = index.sortlevel(0)
  914. expected = MultiIndex.from_tuples(sorted(tuples))
  915. self.assert_(sorted_idx.equals(expected))
  916. sorted_idx, _ = index.sortlevel(0, ascending=False)
  917. self.assert_(sorted_idx.equals(expected[::-1]))
  918. sorted_idx, _ = index.sortlevel(1)
  919. by1 = sorted(tuples, key=lambda x: (x[1], x[0]))
  920. expected = MultiIndex.from_tuples(by1)
  921. self.assert_(sorted_idx.equals(expected))
  922. sorted_idx, _ = index.sortlevel(1, ascending=False)
  923. self.assert_(sorted_idx.equals(expected[::-1]))
  924. def test_sortlevel_deterministic(self):
  925. tuples = [('bar', 'one'), ('foo', 'two'), ('qux', 'two'),
  926. ('foo', 'one'), ('baz', 'two'), ('qux', 'one')]
  927. index = MultiIndex.from_tuples(tuples)
  928. sorted_idx, _ = index.sortlevel(0)
  929. expected = MultiIndex.from_tuples(sorted(tuples))
  930. self.assert_(sorted_idx.equals(expected))
  931. sorted_idx, _ = index.sortlevel(0, ascending=False)
  932. self.assert_(sorted_idx.equals(expected[::-1]))
  933. sorted_idx, _ = index.sortlevel(1)
  934. by1 = sorted(tuples, key=lambda x: (x[1], x[0]))
  935. expected = MultiIndex.from_tuples(by1)
  936. self.assert_(sorted_idx.equals(expected))
  937. sorted_idx, _ = index.sortlevel(1, ascending=False)
  938. self.assert_(sorted_idx.equals(expected[::-1]))
  939. def test_dims(self):
  940. pass
  941. def test_drop(self):
  942. dropped = self.index.drop([('foo', 'two'), ('qux', 'one')])
  943. index = MultiIndex.from_tuples([('foo', 'two'), ('qux', 'one')])
  944. dropped2 = self.index.drop(index)
  945. expected = self.index[[0, 2, 3, 5]]
  946. self.assert_(dropped.equals(expected))
  947. self.assert_(dropped2.equals(expected))
  948. dropped = self.index.drop(['bar'])
  949. expected = self.index[[0, 1, 3, 4, 5]]
  950. self.assert_(dropped.equals(expected))
  951. index = MultiIndex.from_tuples([('bar', 'two')])
  952. self.assertRaises(Exception, self.index.drop, [('bar', 'two')])
  953. self.assertRaises(Exception, self.index.drop, index)
  954. # mixed partial / full drop
  955. dropped = self.index.drop(['foo', ('qux', 'one')])
  956. expected = self.index[[2, 3, 5]]
  957. self.assert_(dropped.equals(expected))
  958. def test_droplevel_with_names(self):
  959. index = self.index[self.index.get_loc('foo')]
  960. dropped = index.droplevel(0)
  961. self.assertEqual(dropped.name, 'second')
  962. index = MultiIndex(levels=[Index(range(4)),
  963. Index(range(4)),
  964. Index(range(4))],
  965. labels=[np.array([0, 0, 1, 2, 2, 2, 3, 3]),
  966. np.array([0, 1, 0, 0, 0, 1, 0, 1]),
  967. np.array([1, 0, 1, 1, 0, 0, 1, 0])],
  968. names=['one', 'two', 'three'])
  969. dropped = index.droplevel(0)
  970. self.assertEqual(dropped.names, ['two', 'three'])
  971. dropped = index.droplevel('two')
  972. expected = index.droplevel(1)
  973. self.assert_(dropped.equals(expected))
  974. def test_droplevel_multiple(self):
  975. index = MultiIndex(levels=[Index(range(4)),
  976. Index(range(4)),
  977. Index(range(4))],
  978. labels=[np.array([0, 0, 1, 2, 2, 2, 3, 3]),
  979. np.array([0, 1, 0, 0, 0, 1, 0, 1]),
  980. np.array([1, 0, 1, 1, 0, 0, 1, 0])],
  981. names=['one', 'two', 'three'])
  982. dropped = index[:2].droplevel(['three', 'one'])
  983. expected = index[:2].droplevel(2).droplevel(0)
  984. self.assert_(dropped.equals(expected))
  985. def test_insert(self):
  986. # key contained in all levels
  987. new_index = self.index.insert(0, ('bar', 'two'))
  988. self.assert_(new_index.equal_levels(self.index))
  989. self.assert_(new_index[0] == ('bar', 'two'))
  990. # key not contained in all levels
  991. new_index = self.index.insert(0, ('abc', 'three'))
  992. self.assert_(np.array_equal(new_index.levels[0],
  993. list(self.index.levels[0]) + ['abc']))
  994. self.assert_(np.array_equal(new_index.levels[1],
  995. list(self.index.levels[1]) + ['three']))
  996. self.assert_(new_index[0] == ('abc', 'three'))
  997. # key wrong length
  998. self.assertRaises(Exception, self.index.insert, 0, ('foo2',))
  999. def test_take_preserve_name(self):
  1000. taken = self.index.take([3,0,1])
  1001. self.assertEqual(taken.names, self.index.names)
  1002. def test_join_level(self):
  1003. def _check_how(other, how):
  1004. join_index, lidx, ridx = other.join(self.index, how=how,
  1005. level='second',
  1006. return_indexers=True)
  1007. exp_level = other.join(self.index.levels[1], how=how)
  1008. self.assert_(join_index.levels[0].equals(self.index.levels[0]))
  1009. self.assert_(join_index.levels[1].equals(exp_level))
  1010. # pare down levels
  1011. mask = np.array([x[1] in exp_level for x in self.index], dtype=bool)
  1012. exp_values = self.index.values[mask]
  1013. self.assert_(np.array_equal(join_index.values, exp_values))
  1014. if how in ('outer', 'inner'):
  1015. join_index2, ridx2, lidx2 = \
  1016. self.index.join(other, how=how, level='second',
  1017. return_indexers=True)
  1018. self.assert_(join_index.equals(join_index2))
  1019. self.assert_(np.array_equal(lidx, lidx2))
  1020. self.assert_(np.array_equal(ridx, ridx2))
  1021. self.assert_(np.array_equal(join_index2.values, exp_values))
  1022. def _check_all(other):
  1023. _check_how(other, 'outer')
  1024. _check_how(other, 'inner')
  1025. _check_how(other, 'left')
  1026. _check_how(other, 'right')
  1027. _check_all(Index(['three', 'one', 'two']))
  1028. _check_all(Index(['one']))
  1029. _check_all(Index(['one', 'three']))
  1030. # some corner cases
  1031. idx = Index(['three', 'one', 'two'])
  1032. result = idx.join(self.index, level='second')
  1033. self.assert_(isinstance(result, MultiIndex))
  1034. self.assertRaises(Exception, self.index.join, self.index, level=1)
  1035. def test_reindex(self):
  1036. result, indexer = self.index.reindex(list(self.index[:4]))
  1037. self.assert_(isinstance(result, MultiIndex))
  1038. result, indexer = self.index.reindex(list(self.index))
  1039. self.assert_(isinstance(result, MultiIndex))
  1040. self.assert_(indexer is None)
  1041. def test_reindex_level(self):
  1042. idx = Index(['one'])
  1043. target, indexer = self.index.reindex(idx, level='second')
  1044. target2, indexer2 = idx.reindex(self.index, idx, level='second')
  1045. exp_index = self.index.join(idx, level='second', how='left')
  1046. self.assert_(target.equals(exp_index))
  1047. self.assert_(target2.equals(exp_index))
  1048. def test_has_duplicates(self):
  1049. self.assert_(not self.index.has_duplicates)
  1050. self.assert_(self.index.append(self.index).has_duplicates)
  1051. index = MultiIndex(levels=[[0, 1], [0, 1, 2]],
  1052. labels=[[0, 0, 0, 0, 1, 1, 1],
  1053. [0, 1, 2, 0, 0, 1, 2]])
  1054. self.assert_(index.has_duplicates)
  1055. class TestFactor(unittest.TestCase):
  1056. def setUp(self):
  1057. self.factor = Factor(['a', 'b', 'b', 'a', 'a', 'c', 'c', 'c'])
  1058. def test_getitem(self):
  1059. self.assertEqual(self.factor[0], 'a')
  1060. self.assertEqual(self.factor[-1], 'c')
  1061. subf = self.factor[[0, 1, 2]]
  1062. tm.assert_almost_equal(subf.labels, [0, 1, 1])
  1063. subf = self.factor[self.factor.asarray() == 'c']
  1064. tm.assert_almost_equal(subf.labels, [2, 2, 2])
  1065. def test_constructor_unsortable(self):
  1066. arr = np.array([1, 2, 3, datetime.now()], dtype='O')
  1067. # it works!
  1068. factor = Factor(arr)
  1069. def test_factor_agg(self):
  1070. import pandas.core.frame as frame
  1071. arr = np.arange(len(self.factor))
  1072. f = np.sum
  1073. agged = frame.factor_agg(self.factor, arr, f)
  1074. labels = self.factor.labels
  1075. for i, idx in enumerate(self.factor.levels):
  1076. self.assertEqual(f(arr[labels == i]), agged[i])
  1077. def test_get_combined_index():
  1078. from pandas.core.index import _get_combined_index, NULL_INDEX
  1079. result = _get_combined_index([])
  1080. assert(result is NULL_INDEX)
  1081. if __name__ == '__main__':
  1082. import nose
  1083. nose.runm

Large files files are truncated, but you can click here to view the full file