PageRenderTime 26ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/pandas/tests/indexing/test_interval.py

https://github.com/neurodebian/pandas
Python | 261 lines | 180 code | 70 blank | 11 comment | 29 complexity | f7bb29394dda73f3e01545fd74737c47 MD5 | raw file
  1. import pytest
  2. import numpy as np
  3. import pandas as pd
  4. from pandas import Series, DataFrame, IntervalIndex, Interval
  5. from pandas.compat import product
  6. import pandas.util.testing as tm
  7. class TestIntervalIndex(object):
  8. def setup_method(self, method):
  9. self.s = Series(np.arange(5), IntervalIndex.from_breaks(np.arange(6)))
  10. def test_loc_with_scalar(self):
  11. s = self.s
  12. expected = s.iloc[:3]
  13. tm.assert_series_equal(expected, s.loc[:3])
  14. tm.assert_series_equal(expected, s.loc[:2.5])
  15. tm.assert_series_equal(expected, s.loc[0.1:2.5])
  16. tm.assert_series_equal(expected, s.loc[-1:3])
  17. expected = s.iloc[1:4]
  18. tm.assert_series_equal(expected, s.loc[[1.5, 2.5, 3.5]])
  19. tm.assert_series_equal(expected, s.loc[[2, 3, 4]])
  20. tm.assert_series_equal(expected, s.loc[[1.5, 3, 4]])
  21. expected = s.iloc[2:5]
  22. tm.assert_series_equal(expected, s.loc[s >= 2])
  23. def test_getitem_with_scalar(self):
  24. s = self.s
  25. expected = s.iloc[:3]
  26. tm.assert_series_equal(expected, s[:3])
  27. tm.assert_series_equal(expected, s[:2.5])
  28. tm.assert_series_equal(expected, s[0.1:2.5])
  29. tm.assert_series_equal(expected, s[-1:3])
  30. expected = s.iloc[1:4]
  31. tm.assert_series_equal(expected, s[[1.5, 2.5, 3.5]])
  32. tm.assert_series_equal(expected, s[[2, 3, 4]])
  33. tm.assert_series_equal(expected, s[[1.5, 3, 4]])
  34. expected = s.iloc[2:5]
  35. tm.assert_series_equal(expected, s[s >= 2])
  36. @pytest.mark.parametrize('direction, closed',
  37. product(('increasing', 'decreasing'),
  38. ('left', 'right', 'neither', 'both')))
  39. def test_nonoverlapping_monotonic(self, direction, closed):
  40. tpls = [(0, 1), (2, 3), (4, 5)]
  41. if direction == 'decreasing':
  42. tpls = reversed(tpls)
  43. idx = IntervalIndex.from_tuples(tpls, closed=closed)
  44. s = Series(list('abc'), idx)
  45. for key, expected in zip(idx.left, s):
  46. if idx.closed_left:
  47. assert s[key] == expected
  48. assert s.loc[key] == expected
  49. else:
  50. with pytest.raises(KeyError):
  51. s[key]
  52. with pytest.raises(KeyError):
  53. s.loc[key]
  54. for key, expected in zip(idx.right, s):
  55. if idx.closed_right:
  56. assert s[key] == expected
  57. assert s.loc[key] == expected
  58. else:
  59. with pytest.raises(KeyError):
  60. s[key]
  61. with pytest.raises(KeyError):
  62. s.loc[key]
  63. for key, expected in zip(idx.mid, s):
  64. assert s[key] == expected
  65. assert s.loc[key] == expected
  66. def test_with_interval(self):
  67. s = self.s
  68. expected = 0
  69. result = s.loc[Interval(0, 1)]
  70. assert result == expected
  71. result = s[Interval(0, 1)]
  72. assert result == expected
  73. expected = s.iloc[3:5]
  74. result = s.loc[Interval(3, 6)]
  75. tm.assert_series_equal(expected, result)
  76. expected = s.iloc[3:5]
  77. result = s.loc[[Interval(3, 6)]]
  78. tm.assert_series_equal(expected, result)
  79. expected = s.iloc[3:5]
  80. result = s.loc[[Interval(3, 5)]]
  81. tm.assert_series_equal(expected, result)
  82. # missing
  83. with pytest.raises(KeyError):
  84. s.loc[Interval(-2, 0)]
  85. with pytest.raises(KeyError):
  86. s[Interval(-2, 0)]
  87. with pytest.raises(KeyError):
  88. s.loc[Interval(5, 6)]
  89. with pytest.raises(KeyError):
  90. s[Interval(5, 6)]
  91. def test_with_slices(self):
  92. s = self.s
  93. # slice of interval
  94. with pytest.raises(NotImplementedError):
  95. s.loc[Interval(3, 6):]
  96. with pytest.raises(NotImplementedError):
  97. s[Interval(3, 6):]
  98. expected = s.iloc[3:5]
  99. result = s[[Interval(3, 6)]]
  100. tm.assert_series_equal(expected, result)
  101. # slice of scalar with step != 1
  102. with pytest.raises(ValueError):
  103. s[0:4:2]
  104. def test_with_overlaps(self):
  105. s = self.s
  106. expected = s.iloc[[3, 4, 3, 4]]
  107. result = s.loc[[Interval(3, 6), Interval(3, 6)]]
  108. tm.assert_series_equal(expected, result)
  109. idx = IntervalIndex.from_tuples([(1, 5), (3, 7)])
  110. s = Series(range(len(idx)), index=idx)
  111. result = s[4]
  112. expected = s
  113. tm.assert_series_equal(expected, result)
  114. result = s[[4]]
  115. expected = s
  116. tm.assert_series_equal(expected, result)
  117. result = s.loc[[4]]
  118. expected = s
  119. tm.assert_series_equal(expected, result)
  120. result = s[Interval(3, 5)]
  121. expected = s
  122. tm.assert_series_equal(expected, result)
  123. result = s.loc[Interval(3, 5)]
  124. expected = s
  125. tm.assert_series_equal(expected, result)
  126. # doesn't intersect unique set of intervals
  127. with pytest.raises(KeyError):
  128. s[[Interval(3, 5)]]
  129. with pytest.raises(KeyError):
  130. s.loc[[Interval(3, 5)]]
  131. def test_non_unique(self):
  132. idx = IntervalIndex.from_tuples([(1, 3), (3, 7)])
  133. s = pd.Series(range(len(idx)), index=idx)
  134. result = s.loc[Interval(1, 3)]
  135. assert result == 0
  136. result = s.loc[[Interval(1, 3)]]
  137. expected = s.iloc[0:1]
  138. tm.assert_series_equal(expected, result)
  139. def test_non_unique_moar(self):
  140. idx = IntervalIndex.from_tuples([(1, 3), (1, 3), (3, 7)])
  141. s = Series(range(len(idx)), index=idx)
  142. result = s.loc[Interval(1, 3)]
  143. expected = s.iloc[[0, 1]]
  144. tm.assert_series_equal(expected, result)
  145. # non-unique index and slices not allowed
  146. with pytest.raises(ValueError):
  147. s.loc[Interval(1, 3):]
  148. with pytest.raises(ValueError):
  149. s[Interval(1, 3):]
  150. # non-unique
  151. with pytest.raises(ValueError):
  152. s[[Interval(1, 3)]]
  153. def test_non_matching(self):
  154. s = self.s
  155. # this is a departure from our current
  156. # indexin scheme, but simpler
  157. with pytest.raises(KeyError):
  158. s.loc[[-1, 3, 4, 5]]
  159. with pytest.raises(KeyError):
  160. s.loc[[-1, 3]]
  161. def test_large_series(self):
  162. s = Series(np.arange(1000000),
  163. index=IntervalIndex.from_breaks(np.arange(1000001)))
  164. result1 = s.loc[:80000]
  165. result2 = s.loc[0:80000]
  166. result3 = s.loc[0:80000:1]
  167. tm.assert_series_equal(result1, result2)
  168. tm.assert_series_equal(result1, result3)
  169. def test_loc_getitem_frame(self):
  170. df = DataFrame({'A': range(10)})
  171. s = pd.cut(df.A, 5)
  172. df['B'] = s
  173. df = df.set_index('B')
  174. result = df.loc[4]
  175. expected = df.iloc[4:6]
  176. tm.assert_frame_equal(result, expected)
  177. with pytest.raises(KeyError):
  178. df.loc[10]
  179. # single list-like
  180. result = df.loc[[4]]
  181. expected = df.iloc[4:6]
  182. tm.assert_frame_equal(result, expected)
  183. # non-unique
  184. result = df.loc[[4, 5]]
  185. expected = df.take([4, 5, 4, 5])
  186. tm.assert_frame_equal(result, expected)
  187. with pytest.raises(KeyError):
  188. df.loc[[10]]
  189. # partial missing
  190. with pytest.raises(KeyError):
  191. df.loc[[10, 4]]