test_interval_new.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import numpy as np
  2. import pytest
  3. from pandas import Interval, IntervalIndex, Series
  4. import pandas.util.testing as tm
  5. pytestmark = pytest.mark.skip(reason="new indexing tests for issue 16316")
  6. class TestIntervalIndex(object):
  7. def setup_method(self, method):
  8. self.s = Series(np.arange(5), IntervalIndex.from_breaks(np.arange(6)))
  9. def test_loc_with_interval(self):
  10. # loc with single label / list of labels:
  11. # - Intervals: only exact matches
  12. # - scalars: those that contain it
  13. s = self.s
  14. expected = 0
  15. result = s.loc[Interval(0, 1)]
  16. assert result == expected
  17. result = s[Interval(0, 1)]
  18. assert result == expected
  19. expected = s.iloc[3:5]
  20. result = s.loc[[Interval(3, 4), Interval(4, 5)]]
  21. tm.assert_series_equal(expected, result)
  22. result = s[[Interval(3, 4), Interval(4, 5)]]
  23. tm.assert_series_equal(expected, result)
  24. # missing or not exact
  25. with pytest.raises(KeyError):
  26. s.loc[Interval(3, 5, closed='left')]
  27. with pytest.raises(KeyError):
  28. s[Interval(3, 5, closed='left')]
  29. with pytest.raises(KeyError):
  30. s[Interval(3, 5)]
  31. with pytest.raises(KeyError):
  32. s.loc[Interval(3, 5)]
  33. with pytest.raises(KeyError):
  34. s[Interval(3, 5)]
  35. with pytest.raises(KeyError):
  36. s.loc[Interval(-2, 0)]
  37. with pytest.raises(KeyError):
  38. s[Interval(-2, 0)]
  39. with pytest.raises(KeyError):
  40. s.loc[Interval(5, 6)]
  41. with pytest.raises(KeyError):
  42. s[Interval(5, 6)]
  43. def test_loc_with_scalar(self):
  44. # loc with single label / list of labels:
  45. # - Intervals: only exact matches
  46. # - scalars: those that contain it
  47. s = self.s
  48. assert s.loc[1] == 0
  49. assert s.loc[1.5] == 1
  50. assert s.loc[2] == 1
  51. # TODO with __getitem__ same rules as loc, or positional ?
  52. # assert s[1] == 0
  53. # assert s[1.5] == 1
  54. # assert s[2] == 1
  55. expected = s.iloc[1:4]
  56. tm.assert_series_equal(expected, s.loc[[1.5, 2.5, 3.5]])
  57. tm.assert_series_equal(expected, s.loc[[2, 3, 4]])
  58. tm.assert_series_equal(expected, s.loc[[1.5, 3, 4]])
  59. expected = s.iloc[[1, 1, 2, 1]]
  60. tm.assert_series_equal(expected, s.loc[[1.5, 2, 2.5, 1.5]])
  61. expected = s.iloc[2:5]
  62. tm.assert_series_equal(expected, s.loc[s >= 2])
  63. def test_loc_with_slices(self):
  64. # loc with slices:
  65. # - Interval objects: only works with exact matches
  66. # - scalars: only works for non-overlapping, monotonic intervals,
  67. # and start/stop select location based on the interval that
  68. # contains them:
  69. # (slice_loc(start, stop) == (idx.get_loc(start), idx.get_loc(stop))
  70. s = self.s
  71. # slice of interval
  72. expected = s.iloc[:3]
  73. result = s.loc[Interval(0, 1):Interval(2, 3)]
  74. tm.assert_series_equal(expected, result)
  75. result = s[Interval(0, 1):Interval(2, 3)]
  76. tm.assert_series_equal(expected, result)
  77. expected = s.iloc[4:]
  78. result = s.loc[Interval(3, 4):]
  79. tm.assert_series_equal(expected, result)
  80. result = s[Interval(3, 4):]
  81. tm.assert_series_equal(expected, result)
  82. with pytest.raises(KeyError):
  83. s.loc[Interval(3, 6):]
  84. with pytest.raises(KeyError):
  85. s[Interval(3, 6):]
  86. with pytest.raises(KeyError):
  87. s.loc[Interval(3, 4, closed='left'):]
  88. with pytest.raises(KeyError):
  89. s[Interval(3, 4, closed='left'):]
  90. # TODO with non-existing intervals ?
  91. # s.loc[Interval(-1, 0):Interval(2, 3)]
  92. # slice of scalar
  93. expected = s.iloc[:3]
  94. tm.assert_series_equal(expected, s.loc[:3])
  95. tm.assert_series_equal(expected, s.loc[:2.5])
  96. tm.assert_series_equal(expected, s.loc[0.1:2.5])
  97. # TODO should this work? (-1 is not contained in any of the Intervals)
  98. # tm.assert_series_equal(expected, s.loc[-1:3])
  99. # TODO with __getitem__ same rules as loc, or positional ?
  100. # tm.assert_series_equal(expected, s[:3])
  101. # tm.assert_series_equal(expected, s[:2.5])
  102. # tm.assert_series_equal(expected, s[0.1:2.5])
  103. # slice of scalar with step != 1
  104. with pytest.raises(NotImplementedError):
  105. s[0:4:2]
  106. def test_loc_with_overlap(self):
  107. idx = IntervalIndex.from_tuples([(1, 5), (3, 7)])
  108. s = Series(range(len(idx)), index=idx)
  109. # scalar
  110. expected = s
  111. result = s.loc[4]
  112. tm.assert_series_equal(expected, result)
  113. result = s[4]
  114. tm.assert_series_equal(expected, result)
  115. result = s.loc[[4]]
  116. tm.assert_series_equal(expected, result)
  117. result = s[[4]]
  118. tm.assert_series_equal(expected, result)
  119. # interval
  120. expected = 0
  121. result = s.loc[Interval(1, 5)]
  122. tm.assert_series_equal(expected, result)
  123. result = s[Interval(1, 5)]
  124. tm.assert_series_equal(expected, result)
  125. expected = s
  126. result = s.loc[[Interval(1, 5), Interval(3, 7)]]
  127. tm.assert_series_equal(expected, result)
  128. result = s[[Interval(1, 5), Interval(3, 7)]]
  129. tm.assert_series_equal(expected, result)
  130. with pytest.raises(KeyError):
  131. s.loc[Interval(3, 5)]
  132. with pytest.raises(KeyError):
  133. s.loc[[Interval(3, 5)]]
  134. with pytest.raises(KeyError):
  135. s[Interval(3, 5)]
  136. with pytest.raises(KeyError):
  137. s[[Interval(3, 5)]]
  138. # slices with interval (only exact matches)
  139. expected = s
  140. result = s.loc[Interval(1, 5):Interval(3, 7)]
  141. tm.assert_series_equal(expected, result)
  142. result = s[Interval(1, 5):Interval(3, 7)]
  143. tm.assert_series_equal(expected, result)
  144. with pytest.raises(KeyError):
  145. s.loc[Interval(1, 6):Interval(3, 8)]
  146. with pytest.raises(KeyError):
  147. s[Interval(1, 6):Interval(3, 8)]
  148. # slices with scalar raise for overlapping intervals
  149. # TODO KeyError is the appropriate error?
  150. with pytest.raises(KeyError):
  151. s.loc[1:4]
  152. def test_non_unique(self):
  153. idx = IntervalIndex.from_tuples([(1, 3), (3, 7)])
  154. s = Series(range(len(idx)), index=idx)
  155. result = s.loc[Interval(1, 3)]
  156. assert result == 0
  157. result = s.loc[[Interval(1, 3)]]
  158. expected = s.iloc[0:1]
  159. tm.assert_series_equal(expected, result)
  160. def test_non_unique_moar(self):
  161. idx = IntervalIndex.from_tuples([(1, 3), (1, 3), (3, 7)])
  162. s = Series(range(len(idx)), index=idx)
  163. expected = s.iloc[[0, 1]]
  164. result = s.loc[Interval(1, 3)]
  165. tm.assert_series_equal(expected, result)
  166. expected = s
  167. result = s.loc[Interval(1, 3):]
  168. tm.assert_series_equal(expected, result)
  169. expected = s
  170. result = s[Interval(1, 3):]
  171. tm.assert_series_equal(expected, result)
  172. expected = s.iloc[[0, 1]]
  173. result = s[[Interval(1, 3)]]
  174. tm.assert_series_equal(expected, result)