PageRenderTime 65ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/pandas/tests/test_index.py

http://github.com/pydata/pandas
Python | 2832 lines | 2055 code | 570 blank | 207 comment | 85 complexity | 9fdefc21048410bd9feaa3634b3c1bf8 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. from pandas.compat import range, lrange, lzip, u, zip
  4. import operator
  5. import pickle
  6. import re
  7. import nose
  8. import warnings
  9. import os
  10. import numpy as np
  11. from numpy.testing import assert_array_equal
  12. from pandas.core.index import (Index, Float64Index, Int64Index, MultiIndex,
  13. InvalidIndexError)
  14. from pandas.tseries.index import DatetimeIndex
  15. from pandas.core.series import Series
  16. from pandas.util.testing import (assert_almost_equal, assertRaisesRegexp,
  17. assert_copy)
  18. from pandas import compat
  19. from pandas.compat import long
  20. import pandas.util.testing as tm
  21. import pandas.core.config as cf
  22. from pandas.tseries.index import _to_m8
  23. import pandas.tseries.offsets as offsets
  24. import pandas as pd
  25. from pandas.lib import Timestamp
  26. from pandas import _np_version_under1p7
  27. class TestIndex(tm.TestCase):
  28. _multiprocess_can_split_ = True
  29. def setUp(self):
  30. self.indices = dict(
  31. unicodeIndex = tm.makeUnicodeIndex(100),
  32. strIndex = tm.makeStringIndex(100),
  33. dateIndex = tm.makeDateIndex(100),
  34. intIndex = tm.makeIntIndex(100),
  35. floatIndex = tm.makeFloatIndex(100),
  36. empty = Index([]),
  37. tuples = MultiIndex.from_tuples(lzip(['foo', 'bar', 'baz'],
  38. [1, 2, 3]))
  39. )
  40. for name, ind in self.indices.items():
  41. setattr(self, name, ind)
  42. def test_wrong_number_names(self):
  43. def testit(ind):
  44. ind.names = ["apple", "banana", "carrot"]
  45. for ind in self.indices.values():
  46. assertRaisesRegexp(ValueError, "^Length", testit, ind)
  47. def test_set_name_methods(self):
  48. new_name = "This is the new name for this index"
  49. indices = (self.dateIndex, self.intIndex, self.unicodeIndex,
  50. self.empty)
  51. for ind in indices:
  52. original_name = ind.name
  53. new_ind = ind.set_names([new_name])
  54. self.assertEqual(new_ind.name, new_name)
  55. self.assertEqual(ind.name, original_name)
  56. res = ind.rename(new_name, inplace=True)
  57. # should return None
  58. self.assertIsNone(res)
  59. self.assertEqual(ind.name, new_name)
  60. self.assertEqual(ind.names, [new_name])
  61. with assertRaisesRegexp(TypeError, "list-like"):
  62. # should still fail even if it would be the right length
  63. ind.set_names("a")
  64. # rename in place just leaves tuples and other containers alone
  65. name = ('A', 'B')
  66. ind = self.intIndex
  67. ind.rename(name, inplace=True)
  68. self.assertEqual(ind.name, name)
  69. self.assertEqual(ind.names, [name])
  70. def test_hash_error(self):
  71. with tm.assertRaisesRegexp(TypeError,
  72. "unhashable type: %r" %
  73. type(self.strIndex).__name__):
  74. hash(self.strIndex)
  75. def test_new_axis(self):
  76. new_index = self.dateIndex[None, :]
  77. self.assertEqual(new_index.ndim, 2)
  78. tm.assert_isinstance(new_index, np.ndarray)
  79. def test_copy_and_deepcopy(self):
  80. from copy import copy, deepcopy
  81. for func in (copy, deepcopy):
  82. idx_copy = func(self.strIndex)
  83. self.assertIsNot(idx_copy, self.strIndex)
  84. self.assertTrue(idx_copy.equals(self.strIndex))
  85. new_copy = self.strIndex.copy(deep=True, name="banana")
  86. self.assertEqual(new_copy.name, "banana")
  87. new_copy2 = self.intIndex.copy(dtype=int)
  88. self.assertEqual(new_copy2.dtype.kind, 'i')
  89. def test_duplicates(self):
  90. idx = Index([0, 0, 0])
  91. self.assertFalse(idx.is_unique)
  92. def test_sort(self):
  93. self.assertRaises(TypeError, self.strIndex.sort)
  94. def test_mutability(self):
  95. self.assertRaises(TypeError, self.strIndex.__setitem__, 0, 'foo')
  96. def test_constructor(self):
  97. # regular instance creation
  98. tm.assert_contains_all(self.strIndex, self.strIndex)
  99. tm.assert_contains_all(self.dateIndex, self.dateIndex)
  100. # casting
  101. arr = np.array(self.strIndex)
  102. index = arr.view(Index)
  103. tm.assert_contains_all(arr, index)
  104. self.assert_numpy_array_equal(self.strIndex, index)
  105. # copy
  106. arr = np.array(self.strIndex)
  107. index = Index(arr, copy=True, name='name')
  108. tm.assert_isinstance(index, Index)
  109. self.assertEqual(index.name, 'name')
  110. assert_array_equal(arr, index)
  111. arr[0] = "SOMEBIGLONGSTRING"
  112. self.assertNotEqual(index[0], "SOMEBIGLONGSTRING")
  113. # what to do here?
  114. # arr = np.array(5.)
  115. # self.assertRaises(Exception, arr.view, Index)
  116. def test_constructor_corner(self):
  117. # corner case
  118. self.assertRaises(TypeError, Index, 0)
  119. def test_constructor_from_series(self):
  120. expected = DatetimeIndex([Timestamp('20110101'),Timestamp('20120101'),Timestamp('20130101')])
  121. s = Series([Timestamp('20110101'),Timestamp('20120101'),Timestamp('20130101')])
  122. result = Index(s)
  123. self.assertTrue(result.equals(expected))
  124. result = DatetimeIndex(s)
  125. self.assertTrue(result.equals(expected))
  126. # GH 6273
  127. # create from a series, passing a freq
  128. s = Series(pd.to_datetime(['1-1-1990', '2-1-1990', '3-1-1990', '4-1-1990', '5-1-1990']))
  129. result = DatetimeIndex(s, freq='MS')
  130. expected = DatetimeIndex(['1-1-1990', '2-1-1990', '3-1-1990', '4-1-1990', '5-1-1990'],freq='MS')
  131. self.assertTrue(result.equals(expected))
  132. df = pd.DataFrame(np.random.rand(5,3))
  133. df['date'] = ['1-1-1990', '2-1-1990', '3-1-1990', '4-1-1990', '5-1-1990']
  134. result = DatetimeIndex(df['date'], freq='MS')
  135. # GH 6274
  136. # infer freq of same
  137. result = pd.infer_freq(df['date'])
  138. self.assertEqual(result,'MS')
  139. def test_constructor_ndarray_like(self):
  140. # GH 5460#issuecomment-44474502
  141. # it should be possible to convert any object that satisfies the numpy
  142. # ndarray interface directly into an Index
  143. class ArrayLike(object):
  144. def __init__(self, array):
  145. self.array = array
  146. def __array__(self, dtype=None):
  147. return self.array
  148. for array in [np.arange(5),
  149. np.array(['a', 'b', 'c']),
  150. pd.date_range('2000-01-01', periods=3).values]:
  151. expected = pd.Index(array)
  152. result = pd.Index(ArrayLike(array))
  153. self.assertTrue(result.equals(expected))
  154. def test_index_ctor_infer_periodindex(self):
  155. from pandas import period_range, PeriodIndex
  156. xp = period_range('2012-1-1', freq='M', periods=3)
  157. rs = Index(xp)
  158. assert_array_equal(rs, xp)
  159. tm.assert_isinstance(rs, PeriodIndex)
  160. def test_constructor_simple_new(self):
  161. idx = Index([1, 2, 3, 4, 5], name='int')
  162. result = idx._simple_new(idx, 'int')
  163. self.assertTrue(result.equals(idx))
  164. idx = Index([1.1, np.nan, 2.2, 3.0], name='float')
  165. result = idx._simple_new(idx, 'float')
  166. self.assertTrue(result.equals(idx))
  167. idx = Index(['A', 'B', 'C', np.nan], name='obj')
  168. result = idx._simple_new(idx, 'obj')
  169. self.assertTrue(result.equals(idx))
  170. def test_copy(self):
  171. i = Index([], name='Foo')
  172. i_copy = i.copy()
  173. self.assertEqual(i_copy.name, 'Foo')
  174. def test_view(self):
  175. i = Index([], name='Foo')
  176. i_view = i.view()
  177. self.assertEqual(i_view.name, 'Foo')
  178. def test_astype(self):
  179. casted = self.intIndex.astype('i8')
  180. # it works!
  181. casted.get_loc(5)
  182. # pass on name
  183. self.intIndex.name = 'foobar'
  184. casted = self.intIndex.astype('i8')
  185. self.assertEqual(casted.name, 'foobar')
  186. def test_compat(self):
  187. self.strIndex.tolist()
  188. def test_equals(self):
  189. # same
  190. self.assertTrue(Index(['a', 'b', 'c']).equals(Index(['a', 'b', 'c'])))
  191. # different length
  192. self.assertFalse(Index(['a', 'b', 'c']).equals(Index(['a', 'b'])))
  193. # same length, different values
  194. self.assertFalse(Index(['a', 'b', 'c']).equals(Index(['a', 'b', 'd'])))
  195. # Must also be an Index
  196. self.assertFalse(Index(['a', 'b', 'c']).equals(['a', 'b', 'c']))
  197. def test_insert(self):
  198. # GH 7256
  199. # validate neg/pos inserts
  200. result = Index(['b', 'c', 'd'])
  201. #test 0th element
  202. self.assertTrue(Index(['a', 'b', 'c', 'd']).equals(
  203. result.insert(0, 'a')))
  204. #test Nth element that follows Python list behavior
  205. self.assertTrue(Index(['b', 'c', 'e', 'd']).equals(
  206. result.insert(-1, 'e')))
  207. #test loc +/- neq (0, -1)
  208. self.assertTrue(result.insert(1, 'z').equals(
  209. result.insert(-2, 'z')))
  210. #test empty
  211. null_index = Index([])
  212. self.assertTrue(Index(['a']).equals(
  213. null_index.insert(0, 'a')))
  214. def test_delete(self):
  215. idx = Index(['a', 'b', 'c', 'd'], name='idx')
  216. expected = Index(['b', 'c', 'd'], name='idx')
  217. result = idx.delete(0)
  218. self.assertTrue(result.equals(expected))
  219. self.assertEqual(result.name, expected.name)
  220. expected = Index(['a', 'b', 'c'], name='idx')
  221. result = idx.delete(-1)
  222. self.assertTrue(result.equals(expected))
  223. self.assertEqual(result.name, expected.name)
  224. with tm.assertRaises((IndexError, ValueError)):
  225. # either depeidnig on numpy version
  226. result = idx.delete(5)
  227. def test_identical(self):
  228. # index
  229. i1 = Index(['a', 'b', 'c'])
  230. i2 = Index(['a', 'b', 'c'])
  231. self.assertTrue(i1.identical(i2))
  232. i1 = i1.rename('foo')
  233. self.assertTrue(i1.equals(i2))
  234. self.assertFalse(i1.identical(i2))
  235. i2 = i2.rename('foo')
  236. self.assertTrue(i1.identical(i2))
  237. i3 = Index([('a', 'a'), ('a', 'b'), ('b', 'a')])
  238. i4 = Index([('a', 'a'), ('a', 'b'), ('b', 'a')], tupleize_cols=False)
  239. self.assertFalse(i3.identical(i4))
  240. def test_is_(self):
  241. ind = Index(range(10))
  242. self.assertTrue(ind.is_(ind))
  243. self.assertTrue(ind.is_(ind.view().view().view().view()))
  244. self.assertFalse(ind.is_(Index(range(10))))
  245. self.assertFalse(ind.is_(ind.copy()))
  246. self.assertFalse(ind.is_(ind.copy(deep=False)))
  247. self.assertFalse(ind.is_(ind[:]))
  248. self.assertFalse(ind.is_(ind.view(np.ndarray).view(Index)))
  249. self.assertFalse(ind.is_(np.array(range(10))))
  250. # quasi-implementation dependent
  251. self.assertTrue(ind.is_(ind.view().base))
  252. ind2 = ind.view()
  253. ind2.name = 'bob'
  254. self.assertTrue(ind.is_(ind2))
  255. self.assertTrue(ind2.is_(ind))
  256. # doesn't matter if Indices are *actually* views of underlying data,
  257. self.assertFalse(ind.is_(Index(ind.values)))
  258. arr = np.array(range(1, 11))
  259. ind1 = Index(arr, copy=False)
  260. ind2 = Index(arr, copy=False)
  261. self.assertFalse(ind1.is_(ind2))
  262. def test_asof(self):
  263. d = self.dateIndex[0]
  264. self.assertIs(self.dateIndex.asof(d), d)
  265. self.assertTrue(np.isnan(self.dateIndex.asof(d - timedelta(1))))
  266. d = self.dateIndex[-1]
  267. self.assertEqual(self.dateIndex.asof(d + timedelta(1)), d)
  268. d = self.dateIndex[0].to_datetime()
  269. tm.assert_isinstance(self.dateIndex.asof(d), Timestamp)
  270. def test_nanosecond_index_access(self):
  271. tm._skip_if_not_numpy17_friendly()
  272. s = Series([Timestamp('20130101')]).values.view('i8')[0]
  273. r = DatetimeIndex([s + 50 + i for i in range(100)])
  274. x = Series(np.random.randn(100), index=r)
  275. first_value = x.asof(x.index[0])
  276. # this does not yet work, as parsing strings is done via dateutil
  277. #self.assertEqual(first_value, x['2013-01-01 00:00:00.000000050+0000'])
  278. self.assertEqual(first_value, x[Timestamp(np.datetime64('2013-01-01 00:00:00.000000050+0000', 'ns'))])
  279. def test_argsort(self):
  280. result = self.strIndex.argsort()
  281. expected = np.array(self.strIndex).argsort()
  282. self.assert_numpy_array_equal(result, expected)
  283. def test_comparators(self):
  284. index = self.dateIndex
  285. element = index[len(index) // 2]
  286. element = _to_m8(element)
  287. arr = np.array(index)
  288. def _check(op):
  289. arr_result = op(arr, element)
  290. index_result = op(index, element)
  291. tm.assert_isinstance(index_result, np.ndarray)
  292. self.assertNotIsInstance(index_result, Index)
  293. self.assert_numpy_array_equal(arr_result, index_result)
  294. _check(operator.eq)
  295. _check(operator.ne)
  296. _check(operator.gt)
  297. _check(operator.lt)
  298. _check(operator.ge)
  299. _check(operator.le)
  300. def test_booleanindex(self):
  301. boolIdx = np.repeat(True, len(self.strIndex)).astype(bool)
  302. boolIdx[5:30:2] = False
  303. subIndex = self.strIndex[boolIdx]
  304. for i, val in enumerate(subIndex):
  305. self.assertEqual(subIndex.get_loc(val), i)
  306. subIndex = self.strIndex[list(boolIdx)]
  307. for i, val in enumerate(subIndex):
  308. self.assertEqual(subIndex.get_loc(val), i)
  309. def test_fancy(self):
  310. sl = self.strIndex[[1, 2, 3]]
  311. for i in sl:
  312. self.assertEqual(i, sl[sl.get_loc(i)])
  313. def test_empty_fancy(self):
  314. empty_farr = np.array([], dtype=np.float_)
  315. empty_iarr = np.array([], dtype=np.int_)
  316. empty_barr = np.array([], dtype=np.bool_)
  317. # pd.DatetimeIndex is excluded, because it overrides getitem and should
  318. # be tested separately.
  319. for idx in [self.strIndex, self.intIndex, self.floatIndex]:
  320. empty_idx = idx.__class__([])
  321. values = idx.values
  322. self.assertTrue(idx[[]].identical(empty_idx))
  323. self.assertTrue(idx[empty_iarr].identical(empty_idx))
  324. self.assertTrue(idx[empty_barr].identical(empty_idx))
  325. # np.ndarray only accepts ndarray of int & bool dtypes, so should
  326. # Index.
  327. self.assertRaises(IndexError, idx.__getitem__, empty_farr)
  328. def test_getitem(self):
  329. arr = np.array(self.dateIndex)
  330. exp = self.dateIndex[5]
  331. exp = _to_m8(exp)
  332. self.assertEqual(exp, arr[5])
  333. def test_shift(self):
  334. shifted = self.dateIndex.shift(0, timedelta(1))
  335. self.assertIs(shifted, self.dateIndex)
  336. shifted = self.dateIndex.shift(5, timedelta(1))
  337. self.assert_numpy_array_equal(shifted, self.dateIndex + timedelta(5))
  338. shifted = self.dateIndex.shift(1, 'B')
  339. self.assert_numpy_array_equal(shifted, self.dateIndex + offsets.BDay())
  340. shifted.name = 'shifted'
  341. self.assertEqual(shifted.name, shifted.shift(1, 'D').name)
  342. def test_intersection(self):
  343. first = self.strIndex[:20]
  344. second = self.strIndex[:10]
  345. intersect = first.intersection(second)
  346. self.assertTrue(tm.equalContents(intersect, second))
  347. # Corner cases
  348. inter = first.intersection(first)
  349. self.assertIs(inter, first)
  350. # non-iterable input
  351. assertRaisesRegexp(TypeError, "iterable", first.intersection, 0.5)
  352. idx1 = Index([1, 2, 3, 4, 5], name='idx')
  353. # if target has the same name, it is preserved
  354. idx2 = Index([3, 4, 5, 6, 7], name='idx')
  355. expected2 = Index([3, 4, 5], name='idx')
  356. result2 = idx1.intersection(idx2)
  357. self.assertTrue(result2.equals(expected2))
  358. self.assertEqual(result2.name, expected2.name)
  359. # if target name is different, it will be reset
  360. idx3 = Index([3, 4, 5, 6, 7], name='other')
  361. expected3 = Index([3, 4, 5], name=None)
  362. result3 = idx1.intersection(idx3)
  363. self.assertTrue(result3.equals(expected3))
  364. self.assertEqual(result3.name, expected3.name)
  365. # non monotonic
  366. idx1 = Index([5, 3, 2, 4, 1], name='idx')
  367. idx2 = Index([4, 7, 6, 5, 3], name='idx')
  368. result2 = idx1.intersection(idx2)
  369. self.assertTrue(tm.equalContents(result2, expected2))
  370. self.assertEqual(result2.name, expected2.name)
  371. idx3 = Index([4, 7, 6, 5, 3], name='other')
  372. result3 = idx1.intersection(idx3)
  373. self.assertTrue(tm.equalContents(result3, expected3))
  374. self.assertEqual(result3.name, expected3.name)
  375. def test_union(self):
  376. first = self.strIndex[5:20]
  377. second = self.strIndex[:10]
  378. everything = self.strIndex[:20]
  379. union = first.union(second)
  380. self.assertTrue(tm.equalContents(union, everything))
  381. # Corner cases
  382. union = first.union(first)
  383. self.assertIs(union, first)
  384. union = first.union([])
  385. self.assertIs(union, first)
  386. union = Index([]).union(first)
  387. self.assertIs(union, first)
  388. # non-iterable input
  389. assertRaisesRegexp(TypeError, "iterable", first.union, 0.5)
  390. # preserve names
  391. first.name = 'A'
  392. second.name = 'A'
  393. union = first.union(second)
  394. self.assertEqual(union.name, 'A')
  395. second.name = 'B'
  396. union = first.union(second)
  397. self.assertIsNone(union.name)
  398. def test_add(self):
  399. firstCat = self.strIndex + self.dateIndex
  400. secondCat = self.strIndex + self.strIndex
  401. if self.dateIndex.dtype == np.object_:
  402. appended = np.append(self.strIndex, self.dateIndex)
  403. else:
  404. appended = np.append(self.strIndex, self.dateIndex.astype('O'))
  405. self.assertTrue(tm.equalContents(firstCat, appended))
  406. self.assertTrue(tm.equalContents(secondCat, self.strIndex))
  407. tm.assert_contains_all(self.strIndex, firstCat)
  408. tm.assert_contains_all(self.strIndex, secondCat)
  409. tm.assert_contains_all(self.dateIndex, firstCat)
  410. def test_append_multiple(self):
  411. index = Index(['a', 'b', 'c', 'd', 'e', 'f'])
  412. foos = [index[:2], index[2:4], index[4:]]
  413. result = foos[0].append(foos[1:])
  414. self.assertTrue(result.equals(index))
  415. # empty
  416. result = index.append([])
  417. self.assertTrue(result.equals(index))
  418. def test_append_empty_preserve_name(self):
  419. left = Index([], name='foo')
  420. right = Index([1, 2, 3], name='foo')
  421. result = left.append(right)
  422. self.assertEqual(result.name, 'foo')
  423. left = Index([], name='foo')
  424. right = Index([1, 2, 3], name='bar')
  425. result = left.append(right)
  426. self.assertIsNone(result.name)
  427. def test_add_string(self):
  428. # from bug report
  429. index = Index(['a', 'b', 'c'])
  430. index2 = index + 'foo'
  431. self.assertNotIn('a', index2)
  432. self.assertIn('afoo', index2)
  433. def test_iadd_string(self):
  434. index = pd.Index(['a', 'b', 'c'])
  435. # doesn't fail test unless there is a check before `+=`
  436. self.assertIn('a', index)
  437. index += '_x'
  438. self.assertIn('a_x', index)
  439. def test_diff(self):
  440. first = self.strIndex[5:20]
  441. second = self.strIndex[:10]
  442. answer = self.strIndex[10:20]
  443. first.name = 'name'
  444. # different names
  445. result = first - second
  446. self.assertTrue(tm.equalContents(result, answer))
  447. self.assertEqual(result.name, None)
  448. # same names
  449. second.name = 'name'
  450. result = first - second
  451. self.assertEqual(result.name, 'name')
  452. # with empty
  453. result = first.diff([])
  454. self.assertTrue(tm.equalContents(result, first))
  455. self.assertEqual(result.name, first.name)
  456. # with everythin
  457. result = first.diff(first)
  458. self.assertEqual(len(result), 0)
  459. self.assertEqual(result.name, first.name)
  460. # non-iterable input
  461. assertRaisesRegexp(TypeError, "iterable", first.diff, 0.5)
  462. def test_symmetric_diff(self):
  463. # smoke
  464. idx1 = Index([1, 2, 3, 4], name='idx1')
  465. idx2 = Index([2, 3, 4, 5])
  466. result = idx1.sym_diff(idx2)
  467. expected = Index([1, 5])
  468. self.assertTrue(tm.equalContents(result, expected))
  469. self.assertIsNone(result.name)
  470. # __xor__ syntax
  471. expected = idx1 ^ idx2
  472. self.assertTrue(tm.equalContents(result, expected))
  473. self.assertIsNone(result.name)
  474. # multiIndex
  475. idx1 = MultiIndex.from_tuples(self.tuples)
  476. idx2 = MultiIndex.from_tuples([('foo', 1), ('bar', 3)])
  477. result = idx1.sym_diff(idx2)
  478. expected = MultiIndex.from_tuples([('bar', 2), ('baz', 3), ('bar', 3)])
  479. self.assertTrue(tm.equalContents(result, expected))
  480. # nans:
  481. # GH #6444, sorting of nans. Make sure the number of nans is right
  482. # and the correct non-nan values are there. punt on sorting.
  483. idx1 = Index([1, 2, 3, np.nan])
  484. idx2 = Index([0, 1, np.nan])
  485. result = idx1.sym_diff(idx2)
  486. # expected = Index([0.0, np.nan, 2.0, 3.0, np.nan])
  487. nans = pd.isnull(result)
  488. self.assertEqual(nans.sum(), 2)
  489. self.assertEqual((~nans).sum(), 3)
  490. [self.assertIn(x, result) for x in [0.0, 2.0, 3.0]]
  491. # other not an Index:
  492. idx1 = Index([1, 2, 3, 4], name='idx1')
  493. idx2 = np.array([2, 3, 4, 5])
  494. expected = Index([1, 5])
  495. result = idx1.sym_diff(idx2)
  496. self.assertTrue(tm.equalContents(result, expected))
  497. self.assertEqual(result.name, 'idx1')
  498. result = idx1.sym_diff(idx2, result_name='new_name')
  499. self.assertTrue(tm.equalContents(result, expected))
  500. self.assertEqual(result.name, 'new_name')
  501. # other isn't iterable
  502. with tm.assertRaises(TypeError):
  503. idx1 - 1
  504. def test_pickle(self):
  505. def testit(index):
  506. pickled = pickle.dumps(index)
  507. unpickled = pickle.loads(pickled)
  508. tm.assert_isinstance(unpickled, Index)
  509. self.assert_numpy_array_equal(unpickled, index)
  510. self.assertEqual(unpickled.name, index.name)
  511. # tm.assert_dict_equal(unpickled.indexMap, index.indexMap)
  512. testit(self.strIndex)
  513. self.strIndex.name = 'foo'
  514. testit(self.strIndex)
  515. testit(self.dateIndex)
  516. def test_is_numeric(self):
  517. self.assertFalse(self.dateIndex.is_numeric())
  518. self.assertFalse(self.strIndex.is_numeric())
  519. self.assertTrue(self.intIndex.is_numeric())
  520. self.assertTrue(self.floatIndex.is_numeric())
  521. def test_is_all_dates(self):
  522. self.assertTrue(self.dateIndex.is_all_dates)
  523. self.assertFalse(self.strIndex.is_all_dates)
  524. self.assertFalse(self.intIndex.is_all_dates)
  525. def test_summary(self):
  526. self._check_method_works(Index.summary)
  527. # GH3869
  528. ind = Index(['{other}%s', "~:{range}:0"], name='A')
  529. result = ind.summary()
  530. # shouldn't be formatted accidentally.
  531. self.assertIn('~:{range}:0', result)
  532. self.assertIn('{other}%s', result)
  533. def test_format(self):
  534. self._check_method_works(Index.format)
  535. index = Index([datetime.now()])
  536. formatted = index.format()
  537. expected = [str(index[0])]
  538. self.assertEqual(formatted, expected)
  539. # 2845
  540. index = Index([1, 2.0+3.0j, np.nan])
  541. formatted = index.format()
  542. expected = [str(index[0]), str(index[1]), u('NaN')]
  543. self.assertEqual(formatted, expected)
  544. # is this really allowed?
  545. index = Index([1, 2.0+3.0j, None])
  546. formatted = index.format()
  547. expected = [str(index[0]), str(index[1]), u('NaN')]
  548. self.assertEqual(formatted, expected)
  549. self.strIndex[:0].format()
  550. def test_format_with_name_time_info(self):
  551. # bug I fixed 12/20/2011
  552. inc = timedelta(hours=4)
  553. dates = Index([dt + inc for dt in self.dateIndex], name='something')
  554. formatted = dates.format(name=True)
  555. self.assertEqual(formatted[0], 'something')
  556. def test_format_datetime_with_time(self):
  557. t = Index([datetime(2012, 2, 7), datetime(2012, 2, 7, 23)])
  558. result = t.format()
  559. expected = ['2012-02-07 00:00:00', '2012-02-07 23:00:00']
  560. self.assertEqual(len(result), 2)
  561. self.assertEqual(result, expected)
  562. def test_format_none(self):
  563. values = ['a', 'b', 'c', None]
  564. idx = Index(values)
  565. idx.format()
  566. self.assertIsNone(idx[3])
  567. def test_take(self):
  568. indexer = [4, 3, 0, 2]
  569. result = self.dateIndex.take(indexer)
  570. expected = self.dateIndex[indexer]
  571. self.assertTrue(result.equals(expected))
  572. def _check_method_works(self, method):
  573. method(self.empty)
  574. method(self.dateIndex)
  575. method(self.unicodeIndex)
  576. method(self.strIndex)
  577. method(self.intIndex)
  578. method(self.tuples)
  579. def test_get_indexer(self):
  580. idx1 = Index([1, 2, 3, 4, 5])
  581. idx2 = Index([2, 4, 6])
  582. r1 = idx1.get_indexer(idx2)
  583. assert_almost_equal(r1, [1, 3, -1])
  584. r1 = idx2.get_indexer(idx1, method='pad')
  585. assert_almost_equal(r1, [-1, 0, 0, 1, 1])
  586. rffill1 = idx2.get_indexer(idx1, method='ffill')
  587. assert_almost_equal(r1, rffill1)
  588. r1 = idx2.get_indexer(idx1, method='backfill')
  589. assert_almost_equal(r1, [0, 0, 1, 1, 2])
  590. rbfill1 = idx2.get_indexer(idx1, method='bfill')
  591. assert_almost_equal(r1, rbfill1)
  592. def test_slice_locs(self):
  593. idx = Index([0, 1, 2, 5, 6, 7, 9, 10])
  594. n = len(idx)
  595. self.assertEqual(idx.slice_locs(start=2), (2, n))
  596. self.assertEqual(idx.slice_locs(start=3), (3, n))
  597. self.assertEqual(idx.slice_locs(3, 8), (3, 6))
  598. self.assertEqual(idx.slice_locs(5, 10), (3, n))
  599. self.assertEqual(idx.slice_locs(end=8), (0, 6))
  600. self.assertEqual(idx.slice_locs(end=9), (0, 7))
  601. idx2 = idx[::-1]
  602. self.assertRaises(KeyError, idx2.slice_locs, 8, 2)
  603. self.assertRaises(KeyError, idx2.slice_locs, 7, 3)
  604. def test_slice_locs_dup(self):
  605. idx = Index(['a', 'a', 'b', 'c', 'd', 'd'])
  606. rs = idx.slice_locs('a', 'd')
  607. self.assertEqual(rs, (0, 6))
  608. rs = idx.slice_locs(end='d')
  609. self.assertEqual(rs, (0, 6))
  610. rs = idx.slice_locs('a', 'c')
  611. self.assertEqual(rs, (0, 4))
  612. rs = idx.slice_locs('b', 'd')
  613. self.assertEqual(rs, (2, 6))
  614. def test_drop(self):
  615. n = len(self.strIndex)
  616. dropped = self.strIndex.drop(self.strIndex[lrange(5, 10)])
  617. expected = self.strIndex[lrange(5) + lrange(10, n)]
  618. self.assertTrue(dropped.equals(expected))
  619. self.assertRaises(ValueError, self.strIndex.drop, ['foo', 'bar'])
  620. dropped = self.strIndex.drop(self.strIndex[0])
  621. expected = self.strIndex[1:]
  622. self.assertTrue(dropped.equals(expected))
  623. ser = Index([1, 2, 3])
  624. dropped = ser.drop(1)
  625. expected = Index([2, 3])
  626. self.assertTrue(dropped.equals(expected))
  627. def test_tuple_union_bug(self):
  628. import pandas
  629. import numpy as np
  630. aidx1 = np.array([(1, 'A'), (2, 'A'), (1, 'B'), (2, 'B')],
  631. dtype=[('num', int), ('let', 'a1')])
  632. aidx2 = np.array([(1, 'A'), (2, 'A'), (1, 'B'), (2, 'B'), (1, 'C'), (2,
  633. 'C')], dtype=[('num', int), ('let', 'a1')])
  634. idx1 = pandas.Index(aidx1)
  635. idx2 = pandas.Index(aidx2)
  636. # intersection broken?
  637. int_idx = idx1.intersection(idx2)
  638. # needs to be 1d like idx1 and idx2
  639. expected = idx1[:4] # pandas.Index(sorted(set(idx1) & set(idx2)))
  640. self.assertEqual(int_idx.ndim, 1)
  641. self.assertTrue(int_idx.equals(expected))
  642. # union broken
  643. union_idx = idx1.union(idx2)
  644. expected = idx2
  645. self.assertEqual(union_idx.ndim, 1)
  646. self.assertTrue(union_idx.equals(expected))
  647. def test_is_monotonic_incomparable(self):
  648. index = Index([5, datetime.now(), 7])
  649. self.assertFalse(index.is_monotonic)
  650. def test_get_set_value(self):
  651. values = np.random.randn(100)
  652. date = self.dateIndex[67]
  653. assert_almost_equal(self.dateIndex.get_value(values, date),
  654. values[67])
  655. self.dateIndex.set_value(values, date, 10)
  656. self.assertEqual(values[67], 10)
  657. def test_isin(self):
  658. values = ['foo', 'bar']
  659. idx = Index(['qux', 'baz', 'foo', 'bar'])
  660. result = idx.isin(values)
  661. expected = np.array([False, False, True, True])
  662. self.assert_numpy_array_equal(result, expected)
  663. # empty, return dtype bool
  664. idx = Index([])
  665. result = idx.isin(values)
  666. self.assertEqual(len(result), 0)
  667. self.assertEqual(result.dtype, np.bool_)
  668. def test_boolean_cmp(self):
  669. values = [1, 2, 3, 4]
  670. idx = Index(values)
  671. res = (idx == values)
  672. self.assertTrue(res.all())
  673. self.assertEqual(res.dtype, 'bool')
  674. self.assertNotIsInstance(res, Index)
  675. def test_get_level_values(self):
  676. result = self.strIndex.get_level_values(0)
  677. self.assertTrue(result.equals(self.strIndex))
  678. def test_slice_keep_name(self):
  679. idx = Index(['a', 'b'], name='asdf')
  680. self.assertEqual(idx.name, idx[1:].name)
  681. def test_join_self(self):
  682. # instance attributes of the form self.<name>Index
  683. indices = 'unicode', 'str', 'date', 'int', 'float'
  684. kinds = 'outer', 'inner', 'left', 'right'
  685. for index_kind in indices:
  686. res = getattr(self, '{0}Index'.format(index_kind))
  687. for kind in kinds:
  688. joined = res.join(res, how=kind)
  689. self.assertIs(res, joined)
  690. def test_indexing_doesnt_change_class(self):
  691. idx = Index([1, 2, 3, 'a', 'b', 'c'])
  692. self.assertTrue(idx[1:3].identical(
  693. pd.Index([2, 3], dtype=np.object_)))
  694. self.assertTrue(idx[[0,1]].identical(
  695. pd.Index([1, 2], dtype=np.object_)))
  696. def test_outer_join_sort(self):
  697. left_idx = Index(np.random.permutation(15))
  698. right_idx = tm.makeDateIndex(10)
  699. with tm.assert_produces_warning(RuntimeWarning):
  700. joined = left_idx.join(right_idx, how='outer')
  701. # right_idx in this case because DatetimeIndex has join precedence over
  702. # Int64Index
  703. expected = right_idx.astype(object).union(left_idx.astype(object))
  704. tm.assert_index_equal(joined, expected)
  705. def test_nan_first_take_datetime(self):
  706. idx = Index([pd.NaT, Timestamp('20130101'), Timestamp('20130102')])
  707. res = idx.take([-1, 0, 1])
  708. exp = Index([idx[-1], idx[0], idx[1]])
  709. tm.assert_index_equal(res, exp)
  710. class TestFloat64Index(tm.TestCase):
  711. _multiprocess_can_split_ = True
  712. def setUp(self):
  713. self.mixed = Float64Index([1.5, 2, 3, 4, 5])
  714. self.float = Float64Index(np.arange(5) * 2.5)
  715. def test_hash_error(self):
  716. with tm.assertRaisesRegexp(TypeError,
  717. "unhashable type: %r" %
  718. type(self.float).__name__):
  719. hash(self.float)
  720. def test_repr_roundtrip(self):
  721. for ind in (self.mixed, self.float):
  722. tm.assert_index_equal(eval(repr(ind)), ind)
  723. def check_is_index(self, i):
  724. self.assertIsInstance(i, Index)
  725. self.assertNotIsInstance(i, Float64Index)
  726. def check_coerce(self, a, b, is_float_index=True):
  727. self.assertTrue(a.equals(b))
  728. if is_float_index:
  729. self.assertIsInstance(b, Float64Index)
  730. else:
  731. self.check_is_index(b)
  732. def test_constructor(self):
  733. # explicit construction
  734. index = Float64Index([1,2,3,4,5])
  735. self.assertIsInstance(index, Float64Index)
  736. self.assertTrue((index.values == np.array([1,2,3,4,5],dtype='float64')).all())
  737. index = Float64Index(np.array([1,2,3,4,5]))
  738. self.assertIsInstance(index, Float64Index)
  739. index = Float64Index([1.,2,3,4,5])
  740. self.assertIsInstance(index, Float64Index)
  741. index = Float64Index(np.array([1.,2,3,4,5]))
  742. self.assertIsInstance(index, Float64Index)
  743. self.assertEqual(index.dtype, float)
  744. index = Float64Index(np.array([1.,2,3,4,5]),dtype=np.float32)
  745. self.assertIsInstance(index, Float64Index)
  746. self.assertEqual(index.dtype, np.float64)
  747. index = Float64Index(np.array([1,2,3,4,5]),dtype=np.float32)
  748. self.assertIsInstance(index, Float64Index)
  749. self.assertEqual(index.dtype, np.float64)
  750. # nan handling
  751. result = Float64Index([np.nan, np.nan])
  752. self.assertTrue(pd.isnull(result.values).all())
  753. result = Float64Index(np.array([np.nan]))
  754. self.assertTrue(pd.isnull(result.values).all())
  755. result = Index(np.array([np.nan]))
  756. self.assertTrue(pd.isnull(result.values).all())
  757. def test_constructor_invalid(self):
  758. # invalid
  759. self.assertRaises(TypeError, Float64Index, 0.)
  760. self.assertRaises(TypeError, Float64Index, ['a','b',0.])
  761. self.assertRaises(TypeError, Float64Index, [Timestamp('20130101')])
  762. def test_constructor_coerce(self):
  763. self.check_coerce(self.mixed,Index([1.5, 2, 3, 4, 5]))
  764. self.check_coerce(self.float,Index(np.arange(5) * 2.5))
  765. self.check_coerce(self.float,Index(np.array(np.arange(5) * 2.5, dtype=object)))
  766. def test_constructor_explicit(self):
  767. # these don't auto convert
  768. self.check_coerce(self.float,Index((np.arange(5) * 2.5), dtype=object),
  769. is_float_index=False)
  770. self.check_coerce(self.mixed,Index([1.5, 2, 3, 4, 5],dtype=object),
  771. is_float_index=False)
  772. def test_astype(self):
  773. result = self.float.astype(object)
  774. self.assertTrue(result.equals(self.float))
  775. self.assertTrue(self.float.equals(result))
  776. self.check_is_index(result)
  777. i = self.mixed.copy()
  778. i.name = 'foo'
  779. result = i.astype(object)
  780. self.assertTrue(result.equals(i))
  781. self.assertTrue(i.equals(result))
  782. self.check_is_index(result)
  783. def test_equals(self):
  784. i = Float64Index([1.0,2.0])
  785. self.assertTrue(i.equals(i))
  786. self.assertTrue(i.identical(i))
  787. i2 = Float64Index([1.0,2.0])
  788. self.assertTrue(i.equals(i2))
  789. i = Float64Index([1.0,np.nan])
  790. self.assertTrue(i.equals(i))
  791. self.assertTrue(i.identical(i))
  792. i2 = Float64Index([1.0,np.nan])
  793. self.assertTrue(i.equals(i2))
  794. def test_contains_nans(self):
  795. i = Float64Index([1.0, 2.0, np.nan])
  796. self.assertTrue(np.nan in i)
  797. def test_contains_not_nans(self):
  798. i = Float64Index([1.0, 2.0, np.nan])
  799. self.assertTrue(1.0 in i)
  800. def test_doesnt_contain_all_the_things(self):
  801. i = Float64Index([np.nan])
  802. self.assertFalse(i.isin([0]).item())
  803. self.assertFalse(i.isin([1]).item())
  804. self.assertTrue(i.isin([np.nan]).item())
  805. def test_nan_multiple_containment(self):
  806. i = Float64Index([1.0, np.nan])
  807. np.testing.assert_array_equal(i.isin([1.0]), np.array([True, False]))
  808. np.testing.assert_array_equal(i.isin([2.0, np.pi]),
  809. np.array([False, False]))
  810. np.testing.assert_array_equal(i.isin([np.nan]),
  811. np.array([False, True]))
  812. np.testing.assert_array_equal(i.isin([1.0, np.nan]),
  813. np.array([True, True]))
  814. i = Float64Index([1.0, 2.0])
  815. np.testing.assert_array_equal(i.isin([np.nan]),
  816. np.array([False, False]))
  817. def test_astype_from_object(self):
  818. index = Index([1.0, np.nan, 0.2], dtype='object')
  819. result = index.astype(float)
  820. expected = Float64Index([1.0, np.nan, 0.2])
  821. tm.assert_equal(result.dtype, expected.dtype)
  822. tm.assert_index_equal(result, expected)
  823. class TestInt64Index(tm.TestCase):
  824. _multiprocess_can_split_ = True
  825. def setUp(self):
  826. self.index = Int64Index(np.arange(0, 20, 2))
  827. def test_too_many_names(self):
  828. def testit():
  829. self.index.names = ["roger", "harold"]
  830. assertRaisesRegexp(ValueError, "^Length", testit)
  831. def test_constructor(self):
  832. # pass list, coerce fine
  833. index = Int64Index([-5, 0, 1, 2])
  834. expected = np.array([-5, 0, 1, 2], dtype=np.int64)
  835. self.assert_numpy_array_equal(index, expected)
  836. # from iterable
  837. index = Int64Index(iter([-5, 0, 1, 2]))
  838. self.assert_numpy_array_equal(index, expected)
  839. # scalar raise Exception
  840. self.assertRaises(TypeError, Int64Index, 5)
  841. # copy
  842. arr = self.index.values
  843. new_index = Int64Index(arr, copy=True)
  844. self.assert_numpy_array_equal(new_index, self.index)
  845. val = arr[0] + 3000
  846. # this should not change index
  847. arr[0] = val
  848. self.assertNotEqual(new_index[0], val)
  849. def test_constructor_corner(self):
  850. arr = np.array([1, 2, 3, 4], dtype=object)
  851. index = Int64Index(arr)
  852. self.assertEqual(index.values.dtype, np.int64)
  853. self.assertTrue(index.equals(arr))
  854. # preventing casting
  855. arr = np.array([1, '2', 3, '4'], dtype=object)
  856. with tm.assertRaisesRegexp(TypeError, 'casting'):
  857. Int64Index(arr)
  858. arr_with_floats = [0, 2, 3, 4, 5, 1.25, 3, -1]
  859. with tm.assertRaisesRegexp(TypeError, 'casting'):
  860. Int64Index(arr_with_floats)
  861. def test_hash_error(self):
  862. with tm.assertRaisesRegexp(TypeError,
  863. "unhashable type: %r" %
  864. type(self.index).__name__):
  865. hash(self.index)
  866. def test_copy(self):
  867. i = Int64Index([], name='Foo')
  868. i_copy = i.copy()
  869. self.assertEqual(i_copy.name, 'Foo')
  870. def test_view(self):
  871. i = Int64Index([], name='Foo')
  872. i_view = i.view()
  873. self.assertEqual(i_view.name, 'Foo')
  874. def test_coerce_list(self):
  875. # coerce things
  876. arr = Index([1, 2, 3, 4])
  877. tm.assert_isinstance(arr, Int64Index)
  878. # but not if explicit dtype passed
  879. arr = Index([1, 2, 3, 4], dtype=object)
  880. tm.assert_isinstance(arr, Index)
  881. def test_dtype(self):
  882. self.assertEqual(self.index.dtype, np.int64)
  883. def test_is_monotonic(self):
  884. self.assertTrue(self.index.is_monotonic)
  885. index = Int64Index([4, 3, 2, 1])
  886. self.assertFalse(index.is_monotonic)
  887. def test_equals(self):
  888. same_values = Index(self.index, dtype=object)
  889. self.assertTrue(self.index.equals(same_values))
  890. self.assertTrue(same_values.equals(self.index))
  891. def test_identical(self):
  892. i = Index(self.index.copy())
  893. self.assertTrue(i.identical(self.index))
  894. same_values_different_type = Index(i, dtype=object)
  895. self.assertFalse(i.identical(same_values_different_type))
  896. i = self.index.copy(dtype=object)
  897. i = i.rename('foo')
  898. same_values = Index(i, dtype=object)
  899. self.assertTrue(same_values.identical(self.index.copy(dtype=object)))
  900. self.assertFalse(i.identical(self.index))
  901. self.assertTrue(Index(same_values, name='foo', dtype=object
  902. ).identical(i))
  903. self.assertFalse(
  904. self.index.copy(dtype=object)
  905. .identical(self.index.copy(dtype='int64')))
  906. def test_get_indexer(self):
  907. target = Int64Index(np.arange(10))
  908. indexer = self.index.get_indexer(target)
  909. expected = np.array([0, -1, 1, -1, 2, -1, 3, -1, 4, -1])
  910. self.assert_numpy_array_equal(indexer, expected)
  911. def test_get_indexer_pad(self):
  912. target = Int64Index(np.arange(10))
  913. indexer = self.index.get_indexer(target, method='pad')
  914. expected = np.array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4])
  915. self.assert_numpy_array_equal(indexer, expected)
  916. def test_get_indexer_backfill(self):
  917. target = Int64Index(np.arange(10))
  918. indexer = self.index.get_indexer(target, method='backfill')
  919. expected = np.array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5])
  920. self.assert_numpy_array_equal(indexer, expected)
  921. def test_join_outer(self):
  922. other = Int64Index([7, 12, 25, 1, 2, 5])
  923. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  924. # not monotonic
  925. # guarantee of sortedness
  926. res, lidx, ridx = self.index.join(other, how='outer',
  927. return_indexers=True)
  928. noidx_res = self.index.join(other, how='outer')
  929. self.assertTrue(res.equals(noidx_res))
  930. eres = Int64Index([0, 1, 2, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 25])
  931. elidx = np.array([0, -1, 1, 2, -1, 3, -1, 4, 5, 6, 7, 8, 9, -1],
  932. dtype=np.int64)
  933. eridx = np.array([-1, 3, 4, -1, 5, -1, 0, -1, -1, 1, -1, -1, -1, 2],
  934. dtype=np.int64)
  935. tm.assert_isinstance(res, Int64Index)
  936. self.assertTrue(res.equals(eres))
  937. self.assert_numpy_array_equal(lidx, elidx)
  938. self.assert_numpy_array_equal(ridx, eridx)
  939. # monotonic
  940. res, lidx, ridx = self.index.join(other_mono, how='outer',
  941. return_indexers=True)
  942. noidx_res = self.index.join(other_mono, how='outer')
  943. self.assertTrue(res.equals(noidx_res))
  944. eridx = np.array([-1, 0, 1, -1, 2, -1, 3, -1, -1, 4, -1, -1, -1, 5],
  945. dtype=np.int64)
  946. tm.assert_isinstance(res, Int64Index)
  947. self.assertTrue(res.equals(eres))
  948. self.assert_numpy_array_equal(lidx, elidx)
  949. self.assert_numpy_array_equal(ridx, eridx)
  950. def test_join_inner(self):
  951. other = Int64Index([7, 12, 25, 1, 2, 5])
  952. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  953. # not monotonic
  954. res, lidx, ridx = self.index.join(other, how='inner',
  955. return_indexers=True)
  956. # no guarantee of sortedness, so sort for comparison purposes
  957. ind = res.argsort()
  958. res = res.take(ind)
  959. lidx = lidx.take(ind)
  960. ridx = ridx.take(ind)
  961. eres = Int64Index([2, 12])
  962. elidx = np.array([1, 6])
  963. eridx = np.array([4, 1])
  964. tm.assert_isinstance(res, Int64Index)
  965. self.assertTrue(res.equals(eres))
  966. self.assert_numpy_array_equal(lidx, elidx)
  967. self.assert_numpy_array_equal(ridx, eridx)
  968. # monotonic
  969. res, lidx, ridx = self.index.join(other_mono, how='inner',
  970. return_indexers=True)
  971. res2 = self.index.intersection(other_mono)
  972. self.assertTrue(res.equals(res2))
  973. eridx = np.array([1, 4])
  974. tm.assert_isinstance(res, Int64Index)
  975. self.assertTrue(res.equals(eres))
  976. self.assert_numpy_array_equal(lidx, elidx)
  977. self.assert_numpy_array_equal(ridx, eridx)
  978. def test_join_left(self):
  979. other = Int64Index([7, 12, 25, 1, 2, 5])
  980. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  981. # not monotonic
  982. res, lidx, ridx = self.index.join(other, how='left',
  983. return_indexers=True)
  984. eres = self.index
  985. eridx = np.array([-1, 4, -1, -1, -1, -1, 1, -1, -1, -1],
  986. dtype=np.int64)
  987. tm.assert_isinstance(res, Int64Index)
  988. self.assertTrue(res.equals(eres))
  989. self.assertIsNone(lidx)
  990. self.assert_numpy_array_equal(ridx, eridx)
  991. # monotonic
  992. res, lidx, ridx = self.index.join(other_mono, how='left',
  993. return_indexers=True)
  994. eridx = np.array([-1, 1, -1, -1, -1, -1, 4, -1, -1, -1],
  995. dtype=np.int64)
  996. tm.assert_isinstance(res, Int64Index)
  997. self.assertTrue(res.equals(eres))
  998. self.assertIsNone(lidx)
  999. self.assert_numpy_array_equal(ridx, eridx)
  1000. # non-unique
  1001. """
  1002. idx = Index([1,1,2,5])
  1003. idx2 = Index([1,2,5,7,9])
  1004. res, lidx, ridx = idx2.join(idx, how='left', return_indexers=True)
  1005. eres = idx2
  1006. eridx = np.array([0, 2, 3, -1, -1])
  1007. elidx = np.array([0, 1, 2, 3, 4])
  1008. self.assertTrue(res.equals(eres))
  1009. self.assert_numpy_array_equal(lidx, elidx)
  1010. self.assert_numpy_array_equal(ridx, eridx)
  1011. """
  1012. def test_join_right(self):
  1013. other = Int64Index([7, 12, 25, 1, 2, 5])
  1014. other_mono = Int64Index([1, 2, 5, 7, 12, 25])
  1015. # not monotonic
  1016. res, lidx, ridx = self.index.join(other, how='right',
  1017. return_indexers=True)
  1018. eres = other
  1019. elidx = np.array([-1, 6, -1, -1, 1, -1],
  1020. dtype=np.int64)
  1021. tm.assert_isinstance(other, Int64Index)
  1022. self.assertTrue(res.equals(eres))
  1023. self.assert_numpy_array_equal(lidx, elidx)
  1024. self.assertIsNone(ridx)
  1025. # monotonic
  1026. res, lidx, ridx = self.index.join(other_mono, how='right',
  1027. return_indexers=True)
  1028. eres = other_mono
  1029. elidx = np.array([-1, 1, -1, -1, 6, -1],
  1030. dtype=np.int64)
  1031. tm.assert_isinstance(other, Int64Index)
  1032. self.assertTrue(res.equals(eres))
  1033. self.assert_numpy_array_equal(lidx, elidx)
  1034. self.assertIsNone(ridx)
  1035. # non-unique
  1036. """
  1037. idx = Index([1,1,2,5])
  1038. idx2 = Index([1,2,5,7,9])
  1039. res, lidx, ridx = idx.join(idx2, how='right', return_indexers=True)
  1040. eres = idx2
  1041. elidx = np.array([0, 2, 3, -1, -1])
  1042. eridx = np.array([0, 1, 2, 3, 4])
  1043. self.assertTrue(res.equals(eres))
  1044. self.assert_numpy_array_equal(lidx, elidx)
  1045. self.assert_numpy_array_equal(ridx, eridx)
  1046. idx = Index([1,1,2,5])
  1047. idx2 = Index([1,2,5,9,7])
  1048. res = idx.join(idx2, how='right', return_indexers=False)
  1049. eres = idx2
  1050. self.assert(res.equals(eres))
  1051. """
  1052. def test_join_non_int_index(self):
  1053. other = Index([3, 6, 7, 8, 10], dtype=object)
  1054. outer = self.index.join(other, how='outer')
  1055. outer2 = other.join(self.index, how='outer')
  1056. expected = Index([0, 2, 3, 4, 6, 7, 8, 10, 12, 14,
  1057. 16, 18], dtype=object)
  1058. self.assertTrue(outer.equals(outer2))
  1059. self.assertTrue(outer.equals(expected))
  1060. inner = self.index.join(other, how='inner')
  1061. inner2 = other.join(self.index, how='inner')
  1062. expected = Index([6, 8, 10], dtype=object)
  1063. self.assertTrue(inner.equals(inner2))
  1064. self.assertTrue(inner.equals(expected))
  1065. left = self.index.join(other, how='left')
  1066. self.assertTrue(left.equals(self.index))
  1067. left2 = other.join(self.index, how='left')
  1068. self.assertTrue(left2.equals(other))
  1069. right = self.index.join(other, how='right')
  1070. self.assertTrue(right.equals(other))
  1071. right2 = other.join(self.index, how='right')
  1072. self.assertTrue(right2.equals(self.index))
  1073. def test_join_non_unique(self):
  1074. left = Index([4, 4, 3, 3])
  1075. joined, lidx, ridx = left.join(left, return_indexers=True)
  1076. exp_joined = Index([3, 3, 3, 3, 4, 4, 4, 4])
  1077. self.assertTrue(joined.equals(exp_joined))
  1078. exp_lidx = np.array([2, 2, 3, 3, 0, 0, 1, 1], dtype=np.int64)
  1079. self.assert_numpy_array_equal(lidx, exp_lidx)
  1080. exp_ridx = np.array([2, 3, 2, 3, 0, 1, 0, 1], dtype=np.int64)
  1081. self.assert_numpy_array_equal(ridx, exp_ridx)
  1082. def test_join_self(self):
  1083. kinds = 'outer', 'inner', 'left', 'right'
  1084. for kind in kinds:
  1085. joined = self.index.join(self.index, how=kind)
  1086. self.assertIs(self.index, joined)
  1087. def test_intersection(self):
  1088. other = Index([1, 2, 3, 4, 5])
  1089. result = self.index.intersection(other)
  1090. expected = np.sort(np.intersect1d(self.index.values, other.values))
  1091. self.assert_numpy_array_equal(result, expected)
  1092. result = other.intersection(self.index)
  1093. expected = np.sort(np.asarray(np.intersect1d(self.index.values,
  1094. other.values)))
  1095. self.assert_numpy_array_equal(result, expected)
  1096. def test_intersect_str_dates(self):
  1097. dt_dates = [datetime(2012, 2, 9), datetime(2012, 2, 22)]
  1098. i1 = Index(dt_dates, dtype=object)
  1099. i2 = Index(['aa'], dtype=object)
  1100. res = i2.intersection(i1)
  1101. self.assertEqual(len(res), 0)
  1102. def test_union_noncomparable(self):
  1103. from datetime import datetime, timedelta
  1104. # corner case, non-Int64Index
  1105. now = datetime.now()
  1106. other = Index([now + timedelta(i) for i in range(4)], dtype=object)
  1107. result = self.index.union(other)
  1108. expected = np.concatenate((self.index, other))
  1109. self.assert_numpy_array_equal(result, expected)
  1110. result = other.union(self.index)
  1111. expected = np.concatenate((other, self.index))
  1112. self.assert_numpy_array_equal(result, expected)
  1113. def test_cant_or_shouldnt_cast(self):
  1114. # can't
  1115. data = ['foo', 'bar', 'baz']
  1116. self.assertRaises(TypeError, Int64Index, data)
  1117. # shouldn't
  1118. data = ['0', '1', '2']
  1119. self.assertRaises(TypeError, Int64Index, data)
  1120. def test_view_Index(self):
  1121. self.index.view(Index)
  1122. def test_prevent_casting(self):
  1123. result = self.index.astype('O')
  1124. self.assertEqual(result.dtype, np.object_)
  1125. def test_take_preserve_name(self):
  1126. index = Int64Index([1, 2, 3, 4], name='foo')
  1127. taken = index.take([3, 0,

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