From 2cb3213e37967e708abc52cb2f03908795adb0b2 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 22 Dec 2019 18:11:01 +0100 Subject: [PATCH] improvements to Table class - string comparison should be '!=' not 'is not', latter compares object, not value - functions for common operations: append (vstack, growTable) and join (hstack, addTable) --- python/damask/table.py | 41 +++++++++++++++++++++++++++++++++++--- python/tests/test_Table.py | 28 ++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/python/damask/table.py b/python/damask/table.py index a5ce50237..28ce3efe0 100644 --- a/python/damask/table.py +++ b/python/damask/table.py @@ -248,17 +248,17 @@ class Table(): '' if info is None else ': {}'.format(info), )) - self.shapes = {(label if label is not label_old else label_new):self.shapes[label] for label in self.shapes} + self.shapes = {(label if label != label_old else label_new):self.shapes[label] for label in self.shapes} def sort_by(self,labels,ascending=True): """ - Get column data. + Sort table by values of given labels. Parameters ---------- label : str or list - Column labels. + Column labels for sorting. ascending : bool or list, optional Set sort order. @@ -269,6 +269,41 @@ class Table(): self.comments.append('sorted by [{}]'.format(', '.join(labels))) + def append(self,other): + """ + Append other table vertically (similar to numpy.vstack). Requires matching shapes and order. + + Parameters + ---------- + other : Table + Table to append + + """ + if self.shapes != other.shapes or not self.data.columns.equals(other.data.columns): + raise KeyError('Labels or shapes or order do not match') + else: + self.data = self.data.append(other.data,ignore_index=True) + + + def join(self,other): + """ + Append other table horizontally (similar to numpy.hstack). Requires matching number of rows + and no common lables + + Parameters + ---------- + other : Table + Table to join + + """ + if set(self.shapes) & set(other.shapes) or self.data.shape[0] != other.data.shape[0]: + raise KeyError('Dublicated keys or row count mismatch') + else: + self.data = self.data.join(other.data) + for key in other.shapes: + self.shapes[key] = other.shapes[key] + + def to_ASCII(self,fname): """ Store as plain text file. diff --git a/python/tests/test_Table.py b/python/tests/test_Table.py index 818a55f40..d5f505e76 100644 --- a/python/tests/test_Table.py +++ b/python/tests/test_Table.py @@ -86,14 +86,42 @@ class TestTable: def test_rename_gone(self,default): default.rename('v','V') + assert 'v' not in default.shapes and 'v' not in default.data.columns with pytest.raises(KeyError): default.get('v') def test_delete(self,default): default.delete('v') + assert 'v' not in default.shapes and 'v' not in default.data.columns with pytest.raises(KeyError): default.get('v') + def test_join(self): + x = np.random.random((5,13)) + a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data']) + y = np.random.random((5,3)) + b = Table(y,{'u':(3,)},['random test data']) + a.join(b) + assert np.array_equal(a.get('u'), b.get('u')) + + def test_join_invalid(self): + x = np.random.random((5,13)) + a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data']) + with pytest.raises(KeyError): + a.join(a) + + def test_append(self): + x = np.random.random((5,13)) + a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data']) + a.append(a) + assert np.array_equal(a.data[:5].to_numpy(),a.data[5:].to_numpy()) + + def test_append_invalid(self): + x = np.random.random((5,13)) + a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data']) + b = Table(x,{'F':(3,3),'u':(3,),'s':(1,)},['random test data']) + with pytest.raises(KeyError): + a.append(b) def test_invalid_initialization(self): x = np.random.random((5,10))