From f7c00b8836bb8d79f108842b55f40d60635e4021 Mon Sep 17 00:00:00 2001 From: Daniel Waeber Date: Fri, 13 Sep 2013 21:03:36 +0200 Subject: [PATCH 1/3] handle start/stop in remove, delete and select_coords --- pandas/io/pytables.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index b08be80dcb16a..f7f7be6c7a321 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -860,7 +860,7 @@ def remove(self, key, where=None, start=None, stop=None): raise KeyError('No object named %s in the file' % key) # remove the node - if where is None: + if where is None and start is None and stop is None: s.group._f_remove(recursive=True) # delete from the table @@ -2139,11 +2139,9 @@ def write(self, **kwargs): raise NotImplementedError( "cannot write on an abstract storer: sublcasses should implement") - def delete(self, where=None, **kwargs): - """support fully deleting the node in its entirety (only) - where - specification must be None - """ - if where is None: + def delete(self, where=None, start=None, stop=None, **kwargs): + """ support fully deleting the node in its entirety (only) - where specification must be None """ + if where is None and start is None and stop is None: self._handle.removeNode(self.group, recursive=True) return None @@ -3700,12 +3698,16 @@ def write_data_chunk(self, indexes, mask, values): except Exception as detail: raise TypeError("tables cannot write this data -> %s" % detail) - def delete(self, where=None, **kwargs): + def delete(self, where=None, start=None, stop=None, **kwargs): # delete all rows (and return the nrows) if where is None or not len(where): - nrows = self.nrows - self._handle.removeNode(self.group, recursive=True) + if start is None and stop is None: + nrows = self.nrows + self._handle.removeNode(self.group, recursive=True) + else: + nrows = self.table.removeRows(start=start, stop=stop) + self.table.flush() return nrows # infer the data kind @@ -3714,7 +3716,7 @@ def delete(self, where=None, **kwargs): # create the selection table = self.table - self.selection = Selection(self, where, **kwargs) + self.selection = Selection(self, where, start=start, stop=stop, **kwargs) values = self.selection.select_coords() # delete the rows in reverse order @@ -4297,7 +4299,7 @@ def select_coords(self): generate the selection """ if self.condition is None: - return np.arange(self.table.nrows) + return np.arange(0, self.table.nrows)[self.start:self.stop] return self.table.table.getWhereList(self.condition.format(), start=self.start, stop=self.stop, From c4f4f378f038c165ae658a361ddab68211129209 Mon Sep 17 00:00:00 2001 From: Daniel Waeber Date: Tue, 1 Oct 2013 15:47:23 +0200 Subject: [PATCH 2/3] implemented unit test for start/stop in remove --- pandas/io/tests/test_pytables.py | 62 ++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index f7d01cb1bec96..b3867635b5633 100644 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -2158,6 +2158,68 @@ def test_remove_where(self): # self.assertRaises(ValueError, store.remove, # 'wp2', [('column', ['A', 'D'])]) + def test_remove_startstop(self): + + with ensure_clean(self.path) as store: + + wp = tm.makePanel() + + # start + store.put('wp1', wp, format='t') + n = store.remove('wp1', start=32) + assert(n == 120-32) + result = store.select('wp1') + expected = wp.reindex(major_axis=wp.major_axis[:32//4]) + assert_panel_equal(result, expected) + + store.put('wp2', wp, format='t') + n = store.remove('wp2', start=-32) + assert(n == 32) + result = store.select('wp2') + expected = wp.reindex(major_axis=wp.major_axis[:-32//4]) + assert_panel_equal(result, expected) + + # stop + store.put('wp3', wp, format='t') + n = store.remove('wp3', stop=32) + assert(n == 32) + result = store.select('wp3') + expected = wp.reindex(major_axis=wp.major_axis[32//4:]) + assert_panel_equal(result, expected) + + store.put('wp4', wp, format='t') + n = store.remove('wp4', stop=-32) + assert(n == 120-32) + result = store.select('wp4') + expected = wp.reindex(major_axis=wp.major_axis[-32//4:]) + assert_panel_equal(result, expected) + + # start n stop + store.put('wp5', wp, format='t') + n = store.remove('wp5', start=16, stop=-16) + assert(n == 120-32) + result = store.select('wp5') + expected = wp.reindex(major_axis=wp.major_axis[:16//4]+wp.major_axis[-16//4:]) + assert_panel_equal(result, expected) + + store.put('wp6', wp, format='t') + n = store.remove('wp6', start=16, stop=16) + assert(n == 0) + result = store.select('wp6') + expected = wp.reindex(major_axis=wp.major_axis) + assert_panel_equal(result, expected) + + # with where + date = wp.major_axis.take(np.arange(0,30,3)) + crit = Term('major_axis=date') + store.put('wp7', wp, format='t') + n = store.remove('wp7', where=[crit], stop=80) + assert(n == 28) + result = store.select('wp7') + expected = wp.reindex(major_axis=wp.major_axis-wp.major_axis[np.arange(0,20,3)]) + assert_panel_equal(result, expected) + + def test_remove_crit(self): with ensure_clean_store(self.path) as store: From e74c6961efd38eaec40f45ba9b743de1443587f8 Mon Sep 17 00:00:00 2001 From: Daniel Waeber Date: Tue, 28 Jan 2014 09:57:33 +0100 Subject: [PATCH 3/3] fixed unittest for update to test-api --- pandas/io/tests/test_pytables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index b3867635b5633..51e38bdab4469 100644 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -2160,7 +2160,7 @@ def test_remove_where(self): def test_remove_startstop(self): - with ensure_clean(self.path) as store: + with ensure_clean_store(self.path) as store: wp = tm.makePanel()