{"action":"created","comment":{"url":"https://api.github.com/repos/pydata/pandas/pulls/comments/43824938","id":43824938,"diff_hunk":"@@ -0,0 +1,527 @@\n+import numpy as np\n+\n+from pandas.core.interval import Interval, IntervalIndex\n+from pandas.core.index import Index\n+from pandas.lib import IntervalTree\n+\n+import pandas.util.testing as tm\n+import pandas as pd\n+\n+\n+class TestInterval(tm.TestCase):\n+    def setUp(self):\n+        self.interval = Interval(0, 1)\n+\n+    def test_properties(self):\n+        self.assertEqual(self.interval.closed, 'right')\n+        self.assertEqual(self.interval.left, 0)\n+        self.assertEqual(self.interval.right, 1)\n+        self.assertEqual(self.interval.mid, 0.5)\n+\n+    def test_repr(self):\n+        self.assertEqual(repr(self.interval),\n+                         \"Interval(0, 1, closed='right')\")\n+        self.assertEqual(str(self.interval), \"(0, 1]\")\n+\n+        interval_left = Interval(0, 1, closed='left')\n+        self.assertEqual(repr(interval_left),\n+                         \"Interval(0, 1, closed='left')\")\n+        self.assertEqual(str(interval_left), \"[0, 1)\")\n+\n+    def test_contains(self):\n+        self.assertIn(0.5, self.interval)\n+        self.assertIn(1, self.interval)\n+        self.assertNotIn(0, self.interval)\n+        self.assertRaises(TypeError, lambda: self.interval in self.interval)\n+\n+        interval = Interval(0, 1, closed='both')\n+        self.assertIn(0, interval)\n+        self.assertIn(1, interval)\n+\n+        interval = Interval(0, 1, closed='neither')\n+        self.assertNotIn(0, interval)\n+        self.assertIn(0.5, interval)\n+        self.assertNotIn(1, interval)\n+\n+    def test_equal(self):\n+        self.assertEqual(Interval(0, 1), Interval(0, 1, closed='right'))\n+        self.assertNotEqual(Interval(0, 1), Interval(0, 1, closed='left'))\n+        self.assertNotEqual(Interval(0, 1), 0)\n+\n+    def test_comparison(self):\n+        with self.assertRaisesRegexp(TypeError, 'unorderable types'):\n+            Interval(0, 1) < 2\n+\n+        self.assertTrue(Interval(0, 1) < Interval(1, 2))\n+        self.assertTrue(Interval(0, 1) < Interval(0, 2))\n+        self.assertTrue(Interval(0, 1) < Interval(0.5, 1.5))\n+        self.assertTrue(Interval(0, 1) <= Interval(0, 1))\n+        self.assertTrue(Interval(0, 1) > Interval(-1, 2))\n+        self.assertTrue(Interval(0, 1) >= Interval(0, 1))\n+\n+    def test_hash(self):\n+        # should not raise\n+        hash(self.interval)\n+\n+    # def test_math(self):\n+    #     expected = Interval(1, 2)\n+    #     actual = self.interval + 1\n+    #     self.assertEqual(expected, actual)\n+\n+\n+class TestIntervalTree(tm.TestCase):\n+    def setUp(self):\n+        self.tree = IntervalTree(np.arange(5), np.arange(5) + 2)\n+\n+    def test_get_loc(self):\n+        self.assert_numpy_array_equal(self.tree.get_loc(1), [0])\n+        self.assert_numpy_array_equal(np.sort(self.tree.get_loc(2)), [0, 1])\n+        with self.assertRaises(KeyError):\n+            self.tree.get_loc(-1)\n+\n+    def test_get_indexer(self):\n+        self.assert_numpy_array_equal(\n+            self.tree.get_indexer(np.array([1.0, 5.5, 6.5])), [0, 4, -1])\n+        with self.assertRaises(KeyError):\n+            self.tree.get_indexer(np.array([3.0]))\n+\n+    def test_get_indexer_non_unique(self):\n+        indexer, missing = self.tree.get_indexer_non_unique(\n+            np.array([1.0, 2.0, 6.5]))\n+        self.assert_numpy_array_equal(indexer[:1], [0])\n+        self.assert_numpy_array_equal(np.sort(indexer[1:3]), [0, 1])\n+        self.assert_numpy_array_equal(np.sort(indexer[3:]), [-1])\n+        self.assert_numpy_array_equal(missing, [2])\n+\n+    def test_duplicates(self):\n+        tree = IntervalTree([0, 0, 0], [1, 1, 1])\n+        self.assert_numpy_array_equal(np.sort(tree.get_loc(0.5)), [0, 1, 2])\n+\n+        with self.assertRaises(KeyError):\n+            tree.get_indexer(np.array([0.5]))\n+\n+        indexer, missing = tree.get_indexer_non_unique(np.array([0.5]))\n+        self.assert_numpy_array_equal(np.sort(indexer), [0, 1, 2])\n+        self.assert_numpy_array_equal(missing, [])\n+\n+    def test_get_loc_closed(self):\n+        for closed in ['left', 'right', 'both', 'neither']:\n+            tree = IntervalTree([0], [1], closed=closed)\n+            for p, errors in [(0, tree.open_left),\n+                              (1, tree.open_right)]:\n+                if errors:\n+                    with self.assertRaises(KeyError):\n+                        tree.get_loc(p)\n+                else:\n+                    self.assert_numpy_array_equal(tree.get_loc(p),\n+                                                  np.array([0]))\n+\n+    def test_get_indexer_closed(self):\n+        x = np.arange(1000)\n+        found = x\n+        not_found = -np.ones(1000)\n+        for closed in ['left', 'right', 'both', 'neither']:\n+            tree = IntervalTree(x, x + 0.5, closed=closed)\n+            self.assert_numpy_array_equal(found, tree.get_indexer(x + 0.25))\n+\n+            expected = found if tree.closed_left else not_found\n+            self.assert_numpy_array_equal(expected, tree.get_indexer(x + 0.0))\n+\n+            expected = found if tree.closed_right else not_found\n+            self.assert_numpy_array_equal(expected, tree.get_indexer(x + 0.5))\n+\n+\n+class TestIntervalIndex(tm.TestCase):","path":"pandas/tests/test_interval.py","position":134,"original_position":134,"commit_id":"f38ce300b1c37610444973e3dacb028c13ae0a57","original_commit_id":"f38ce300b1c37610444973e3dacb028c13ae0a57","user":{"login":"shoyer","id":1217238,"avatar_url":"https://avatars.githubusercontent.com/u/1217238?v=3","gravatar_id":"","url":"https://api.github.com/users/shoyer","html_url":"https://github.com/shoyer","followers_url":"https://api.github.com/users/shoyer/followers","following_url":"https://api.github.com/users/shoyer/following{/other_user}","gists_url":"https://api.github.com/users/shoyer/gists{/gist_id}","starred_url":"https://api.github.com/users/shoyer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shoyer/subscriptions","organizations_url":"https://api.github.com/users/shoyer/orgs","repos_url":"https://api.github.com/users/shoyer/repos","events_url":"https://api.github.com/users/shoyer/events{/privacy}","received_events_url":"https://api.github.com/users/shoyer/received_events","type":"User","site_admin":false},"body":"I was trying to avoid making that file bigger than it already is :)","created_at":"2015-11-03T23:50:57Z","updated_at":"2015-11-03T23:50:57Z","html_url":"https://github.com/pydata/pandas/pull/8707#discussion_r43824938","pull_request_url":"https://api.github.com/repos/pydata/pandas/pulls/8707","_links":{"self":{"href":"https://api.github.com/repos/pydata/pandas/pulls/comments/43824938"},"html":{"href":"https://github.com/pydata/pandas/pull/8707#discussion_r43824938"},"pull_request":{"href":"https://api.github.com/repos/pydata/pandas/pulls/8707"}}},"pull_request":{"url":"https://api.github.com/repos/pydata/pandas/pulls/8707","id":23729235,"html_url":"https://github.com/pydata/pandas/pull/8707","diff_url":"https://github.com/pydata/pandas/pull/8707.diff","patch_url":"https://github.com/pydata/pandas/pull/8707.patch","issue_url":"https://api.github.com/repos/pydata/pandas/issues/8707","number":8707,"state":"open","locked":false,"title":"WIP/API/ENH: IntervalIndex","user":{"login":"shoyer","id":1217238,"avatar_url":"https://avatars.githubusercontent.com/u/1217238?v=3","gravatar_id":"","url":"https://api.github.com/users/shoyer","html_url":"https://github.com/shoyer","followers_url":"https://api.github.com/users/shoyer/followers","following_url":"https://api.github.com/users/shoyer/following{/other_user}","gists_url":"https://api.github.com/users/shoyer/gists{/gist_id}","starred_url":"https://api.github.com/users/shoyer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shoyer/subscriptions","organizations_url":"https://api.github.com/users/shoyer/orgs","repos_url":"https://api.github.com/users/shoyer/repos","events_url":"https://api.github.com/users/shoyer/events{/privacy}","received_events_url":"https://api.github.com/users/shoyer/received_events","type":"User","site_admin":false},"body":"closes #7640 \r\ncloses #8625\r\n\r\nThis is a work in progress, but it's far enough along that I'd love to get\r\nsome feedback.\r\n\r\nTODOs (more called out in the code):\r\n\r\n- [ ] documentation + docstrings\r\n- [x] implement an IntervalTree under the hood to handle index methods\r\n- [x] index methods handle point queries properly:\r\n   - [x] `get_loc`\r\n   - [x] `get_indexer`\r\n   - [x] `slice_locs`\r\n- [x] index methods handle interval queries properly\r\n   - [x] `get_loc`\r\n   - [x] `get_indexer` (for non-overlapping monotonic indexes)\r\n- [x] comparison operations (should be lexicographic)\r\n- [x] ensure `is_monotonic` always works (also lexicographic)\r\n- [x] ensure `order` works\r\n- [x] cast arrays of intervals when input to `pd.Index`\r\n- [x] cythonize the bottlenecks:\r\n   - [x] `values`\r\n   - [x] `from_intervals`?\r\n   - [x] `Interval`?\r\n   - [ ] `from_tuples`?\r\n- [ ] `Categorical`/`cut`\r\n- [ ] nice to haves (not essential for MVP)\r\n   - [ ] `get_indexer` in full generality (for randomly ordered indexes)\r\n   - [ ] support for arithmetic operations\r\n   - [ ] `MultiIndex` -- should at least give a sane error messages\r\n   - [ ] serialization (HDF5) -- should at least raise `NotImplementedError`\r\n   - [ ] consider creating `interval_range` -- like `period_range`\r\n   - [ ] add `to_interval` for casting strings (e.g., `to_interval('(0, 1]')`)\r\n   - [ ] release the GIL in IntervalTree queries\r\n- [ ] lots more tests:\r\n   - [x] `Series.loc.__getitem__`\r\n   - [ ] `Series.loc.__setitem__`\r\n   - [ ] indexing a dataframe\r\n   - [ ] groupby\r\n   - [x] reset_index\r\n   - [x] add tests in test_index for the subcommon API\r\n\r\nCC @jreback @cpcloud @immerrr","created_at":"2014-11-02T09:08:13Z","updated_at":"2015-11-03T23:50:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"58dd51ad86c602cb4c21366a4bd9e53d0a0f0eaa","assignee":null,"milestone":{"url":"https://api.github.com/repos/pydata/pandas/milestones/32","html_url":"https://github.com/pydata/pandas/milestones/Next%20Major%20Release","labels_url":"https://api.github.com/repos/pydata/pandas/milestones/32/labels","id":933188,"number":32,"title":"Next Major Release","description":"after 0.16.1 of course","creator":{"login":"jreback","id":953992,"avatar_url":"https://avatars.githubusercontent.com/u/953992?v=3","gravatar_id":"","url":"https://api.github.com/users/jreback","html_url":"https://github.com/jreback","followers_url":"https://api.github.com/users/jreback/followers","following_url":"https://api.github.com/users/jreback/following{/other_user}","gists_url":"https://api.github.com/users/jreback/gists{/gist_id}","starred_url":"https://api.github.com/users/jreback/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jreback/subscriptions","organizations_url":"https://api.github.com/users/jreback/orgs","repos_url":"https://api.github.com/users/jreback/repos","events_url":"https://api.github.com/users/jreback/events{/privacy}","received_events_url":"https://api.github.com/users/jreback/received_events","type":"User","site_admin":false},"open_issues":911,"closed_issues":91,"state":"open","created_at":"2015-01-13T10:53:19Z","updated_at":"2015-11-02T12:09:13Z","due_on":"2016-01-31T05:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/pydata/pandas/pulls/8707/commits","review_comments_url":"https://api.github.com/repos/pydata/pandas/pulls/8707/comments","review_comment_url":"https://api.github.com/repos/pydata/pandas/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pydata/pandas/issues/8707/comments","statuses_url":"https://api.github.com/repos/pydata/pandas/statuses/f38ce300b1c37610444973e3dacb028c13ae0a57","head":{"label":"shoyer:IntervalIndex","ref":"IntervalIndex","sha":"f38ce300b1c37610444973e3dacb028c13ae0a57","user":{"login":"shoyer","id":1217238,"avatar_url":"https://avatars.githubusercontent.com/u/1217238?v=3","gravatar_id":"","url":"https://api.github.com/users/shoyer","html_url":"https://github.com/shoyer","followers_url":"https://api.github.com/users/shoyer/followers","following_url":"https://api.github.com/users/shoyer/following{/other_user}","gists_url":"https://api.github.com/users/shoyer/gists{/gist_id}","starred_url":"https://api.github.com/users/shoyer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shoyer/subscriptions","organizations_url":"https://api.github.com/users/shoyer/orgs","repos_url":"https://api.github.com/users/shoyer/repos","events_url":"https://api.github.com/users/shoyer/events{/privacy}","received_events_url":"https://api.github.com/users/shoyer/received_events","type":"User","site_admin":false},"repo":{"id":16186481,"name":"pandas","full_name":"shoyer/pandas","owner":{"login":"shoyer","id":1217238,"avatar_url":"https://avatars.githubusercontent.com/u/1217238?v=3","gravatar_id":"","url":"https://api.github.com/users/shoyer","html_url":"https://github.com/shoyer","followers_url":"https://api.github.com/users/shoyer/followers","following_url":"https://api.github.com/users/shoyer/following{/other_user}","gists_url":"https://api.github.com/users/shoyer/gists{/gist_id}","starred_url":"https://api.github.com/users/shoyer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shoyer/subscriptions","organizations_url":"https://api.github.com/users/shoyer/orgs","repos_url":"https://api.github.com/users/shoyer/repos","events_url":"https://api.github.com/users/shoyer/events{/privacy}","received_events_url":"https://api.github.com/users/shoyer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/shoyer/pandas","description":"Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more","fork":true,"url":"https://api.github.com/repos/shoyer/pandas","forks_url":"https://api.github.com/repos/shoyer/pandas/forks","keys_url":"https://api.github.com/repos/shoyer/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/shoyer/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/shoyer/pandas/teams","hooks_url":"https://api.github.com/repos/shoyer/pandas/hooks","issue_events_url":"https://api.github.com/repos/shoyer/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/shoyer/pandas/events","assignees_url":"https://api.github.com/repos/shoyer/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/shoyer/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/shoyer/pandas/tags","blobs_url":"https://api.github.com/repos/shoyer/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/shoyer/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/shoyer/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/shoyer/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/shoyer/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/shoyer/pandas/languages","stargazers_url":"https://api.github.com/repos/shoyer/pandas/stargazers","contributors_url":"https://api.github.com/repos/shoyer/pandas/contributors","subscribers_url":"https://api.github.com/repos/shoyer/pandas/subscribers","subscription_url":"https://api.github.com/repos/shoyer/pandas/subscription","commits_url":"https://api.github.com/repos/shoyer/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/shoyer/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/shoyer/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/shoyer/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/shoyer/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/shoyer/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/shoyer/pandas/merges","archive_url":"https://api.github.com/repos/shoyer/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/shoyer/pandas/downloads","issues_url":"https://api.github.com/repos/shoyer/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/shoyer/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/shoyer/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/shoyer/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/shoyer/pandas/labels{/name}","releases_url":"https://api.github.com/repos/shoyer/pandas/releases{/id}","created_at":"2014-01-23T21:38:59Z","updated_at":"2015-04-03T17:24:43Z","pushed_at":"2015-11-03T09:55:23Z","git_url":"git://github.com/shoyer/pandas.git","ssh_url":"git@github.com:shoyer/pandas.git","clone_url":"https://github.com/shoyer/pandas.git","svn_url":"https://github.com/shoyer/pandas","homepage":"http://pandas.pydata.org","size":64204,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"pydata:master","ref":"master","sha":"eb66bccc83a94655cbc229f3d1c3b0746ff5c9e9","user":{"login":"pydata","id":1284191,"avatar_url":"https://avatars.githubusercontent.com/u/1284191?v=3","gravatar_id":"","url":"https://api.github.com/users/pydata","html_url":"https://github.com/pydata","followers_url":"https://api.github.com/users/pydata/followers","following_url":"https://api.github.com/users/pydata/following{/other_user}","gists_url":"https://api.github.com/users/pydata/gists{/gist_id}","starred_url":"https://api.github.com/users/pydata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydata/subscriptions","organizations_url":"https://api.github.com/users/pydata/orgs","repos_url":"https://api.github.com/users/pydata/repos","events_url":"https://api.github.com/users/pydata/events{/privacy}","received_events_url":"https://api.github.com/users/pydata/received_events","type":"Organization","site_admin":false},"repo":{"id":858127,"name":"pandas","full_name":"pydata/pandas","owner":{"login":"pydata","id":1284191,"avatar_url":"https://avatars.githubusercontent.com/u/1284191?v=3","gravatar_id":"","url":"https://api.github.com/users/pydata","html_url":"https://github.com/pydata","followers_url":"https://api.github.com/users/pydata/followers","following_url":"https://api.github.com/users/pydata/following{/other_user}","gists_url":"https://api.github.com/users/pydata/gists{/gist_id}","starred_url":"https://api.github.com/users/pydata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydata/subscriptions","organizations_url":"https://api.github.com/users/pydata/orgs","repos_url":"https://api.github.com/users/pydata/repos","events_url":"https://api.github.com/users/pydata/events{/privacy}","received_events_url":"https://api.github.com/users/pydata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pydata/pandas","description":"Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more","fork":false,"url":"https://api.github.com/repos/pydata/pandas","forks_url":"https://api.github.com/repos/pydata/pandas/forks","keys_url":"https://api.github.com/repos/pydata/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pydata/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pydata/pandas/teams","hooks_url":"https://api.github.com/repos/pydata/pandas/hooks","issue_events_url":"https://api.github.com/repos/pydata/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/pydata/pandas/events","assignees_url":"https://api.github.com/repos/pydata/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/pydata/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/pydata/pandas/tags","blobs_url":"https://api.github.com/repos/pydata/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pydata/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pydata/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/pydata/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pydata/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/pydata/pandas/languages","stargazers_url":"https://api.github.com/repos/pydata/pandas/stargazers","contributors_url":"https://api.github.com/repos/pydata/pandas/contributors","subscribers_url":"https://api.github.com/repos/pydata/pandas/subscribers","subscription_url":"https://api.github.com/repos/pydata/pandas/subscription","commits_url":"https://api.github.com/repos/pydata/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/pydata/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/pydata/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/pydata/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/pydata/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/pydata/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pydata/pandas/merges","archive_url":"https://api.github.com/repos/pydata/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pydata/pandas/downloads","issues_url":"https://api.github.com/repos/pydata/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/pydata/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/pydata/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/pydata/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pydata/pandas/labels{/name}","releases_url":"https://api.github.com/repos/pydata/pandas/releases{/id}","created_at":"2010-08-24T01:37:33Z","updated_at":"2015-11-03T23:17:28Z","pushed_at":"2015-11-03T21:49:39Z","git_url":"git://github.com/pydata/pandas.git","ssh_url":"git@github.com:pydata/pandas.git","clone_url":"https://github.com/pydata/pandas.git","svn_url":"https://github.com/pydata/pandas","homepage":"http://pandas.pydata.org","size":164011,"stargazers_count":5215,"watchers_count":5215,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2047,"mirror_url":null,"open_issues_count":1520,"forks":2047,"open_issues":1520,"watchers":5215,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pydata/pandas/pulls/8707"},"html":{"href":"https://github.com/pydata/pandas/pull/8707"},"issue":{"href":"https://api.github.com/repos/pydata/pandas/issues/8707"},"comments":{"href":"https://api.github.com/repos/pydata/pandas/issues/8707/comments"},"review_comments":{"href":"https://api.github.com/repos/pydata/pandas/pulls/8707/comments"},"review_comment":{"href":"https://api.github.com/repos/pydata/pandas/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pydata/pandas/pulls/8707/commits"},"statuses":{"href":"https://api.github.com/repos/pydata/pandas/statuses/f38ce300b1c37610444973e3dacb028c13ae0a57"}}}}