Skip to content

Commit 710e35e

Browse files
Add del helper function and __delitem__ to Data (#208)
* Add del helper function and __delitem__ to Data * Tests for deleting fields/trials * Fixed incorrect var name * Update test_data_object.py Fixing test variable names * Fix expected result of test * Update data.rst * Update naplib/data.py * Update naplib/data.py * Update __init__.py --------- Co-authored-by: Gavin Mischler <gavinmischler@gmail.com>
1 parent 2f853cf commit 710e35e

File tree

4 files changed

+71
-3
lines changed

4 files changed

+71
-3
lines changed

docs/references/data.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ Data object
88

99
.. autoclass:: Data
1010
:members:
11-
:special-members: __getitem__, __setitem__, __len__
12-
:exclude-members: set_field, get_field
11+
:special-members: __getitem__, __setitem__, __len__, __delitem__
12+
:exclude-members: set_field, get_field, delete_field
1313

1414
.. minigallery:: naplib.Data
1515
:add-heading: Examples using ``Data ``

naplib/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,5 @@ def set_logging(level: Union[int, str]):
5656
from .data import Data, join_fields, concat
5757
import naplib.naplab
5858

59-
__version__ = "2.1.0"
59+
__version__ = "2.2.0"
6060

naplib/data.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,20 @@ def set_field(self, fielddata, fieldname):
136136
raise Exception(f'Length of field ({len(fielddata)}) is not equal to length of this Data ({len(self)})')
137137
for i, trial in enumerate(self.data):
138138
trial[fieldname] = fielddata[i]
139+
140+
def delete_field(self, fieldname):
141+
'''
142+
Remove an entire field from the Data object.
143+
144+
Parameters
145+
----------
146+
fieldname : string
147+
Name of field to delete.
148+
'''
149+
if not isinstance(fieldname, str):
150+
raise TypeError(f'Field must be a str, but found {type(fieldname)}')
151+
for trial in self.data:
152+
del trial[fieldname]
139153

140154
def get_field(self, fieldname):
141155
'''
@@ -281,6 +295,48 @@ def __setitem__(self, index, data):
281295
else:
282296
self.data[index] = data
283297

298+
def __delitem__(self, index):
299+
'''
300+
Delete a specific trial or set of trials, or delete a specific field, using
301+
bracket indexing. See examples below for details.
302+
303+
Parameters
304+
----------
305+
index : int or string
306+
Which trial to delete, or which field to delete. If an integer, must be
307+
< the length of the Data, since you can only delete an existing trial
308+
309+
Examples
310+
--------
311+
>>> # Delete a field of a Data
312+
>>> from naplib import Data
313+
>>> trial_data = [{'name': 'Zero', 'trial': 0, 'resp': [[0,1],[2,3]]},
314+
... {'name': 'One', 'trial': 1, 'resp': [[4,5],[6,7]]}]
315+
>>> data = Data(trial_data)
316+
>>> del data[0]
317+
>>> data[0]
318+
{'name': 'One', 'trial': 1, 'resp': [[4, 5], [6, 7]]}
319+
320+
>>> # We can also delete all values of a field across trials
321+
>>> trial_data = [{'name': 'Zero', 'trial': 0, 'resp': [[0,1],[2,3]]},
322+
... {'name': 'One', 'trial': 1, 'resp': [[4,5],[6,7]]}]
323+
>>> data = Data(trial_data)
324+
>>> del data['name']
325+
>>> data[0]
326+
{'trial': 0, 'resp': [[0, 1], [2, 3]]}
327+
'''
328+
if isinstance(index, str):
329+
self.delete_field(index)
330+
elif isinstance(index, int):
331+
if index >= len(self):
332+
raise IndexError((f'Index is too large. Current data is length {len(self)} '
333+
'but tried to delete index {index}. If you want to add to the end of the list '
334+
'of trials, use the Data.append() method.'))
335+
else:
336+
del self.data[index]
337+
else:
338+
raise TypeError(f'Found {type(index)} for index')
339+
284340
def append(self, trial_data, strict=None):
285341
'''
286342
Append a single trial of data to the end of a Data.

tests/test_data_object.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ def test_create_outstruct_from_dict():
4848
assert outstruct['y'][0] == 'y0'
4949
assert outstruct['y'][1] == 'y1'
5050

51+
def test_delete_field_from_outstruct():
52+
data = {'x':[1,2], 'y':[3,4], 'z':[5,6]}
53+
outstruct = Data(data)
54+
del outstruct['z']
55+
assert outstruct.fields == ['x','y']
56+
57+
def test_delete_trial_from_outstruct():
58+
data = {'x':[1,2], 'y':[3,4], 'z':[5,6]}
59+
outstruct = Data(data)
60+
del outstruct[0]
61+
assert outstruct[0] == {'x': 2, 'y': 4, 'z': 6}
62+
5163
def test_create_outstruct_from_dict_different_lengths():
5264
data = {'x': [np.array([1,2]), np.array([3,4])], 'y': ['y0', 'y1', 'y2']}
5365
with pytest.raises(ValueError):

0 commit comments

Comments
 (0)