diff --git a/modules/base/pymod/table.py b/modules/base/pymod/table.py index eb90be77cf7c19a917d2012e91e66b3a4d4f2b8f..dc609a7e40589f1afbc3d22c88533aec4ae8abf4 100644 --- a/modules/base/pymod/table.py +++ b/modules/base/pymod/table.py @@ -823,14 +823,17 @@ class Table: except: return None - def Count(self, col): + def Count(self, col, ignore_nan=True): """ Count the number of cells in column that are not equal to None. """ count=0 idx=self.GetColIndex(col) for r in self.rows: - if r[idx]!=None: + if ignore_nan: + if r[idx]!=None: + count+=1 + else: count+=1 return count @@ -1095,8 +1098,42 @@ class Table: LogError("Function needs numpy, but I could not import it.") raise - - + def IsEmpty(self, col_name=None, ignore_nan=True): + ''' + Checks if a table is empty. + + If no column name is specified, the whole table is checked for being empty, + whereas if a column name is specified, only this column is checked. + + By default, all NAN (or None) values are ignored, and thus, a table + containing only NAN values is considered as empty. By specifying the + option ignore_nan=False, NAN values are counted as 'normal' values. + ''' + + # table with no columns and no rows + if len(self.col_names)==0: + if col_name: + raise ValueError('Table has no column named "%s"' % col_name) + return True + + # column name specified + if col_name: + if self.Count(col_name, ignore_nan=ignore_nan)==0: + return True + else: + return False + + # no column name specified -> test whole table + else: + for row in self.rows: + for cell in row: + if ignore_nan: + if cell!=None: + return False + else: + return False + return True + def Merge(table1, table2, by, only_matching=False): """ @@ -1195,4 +1232,6 @@ def Merge(table1, table2, by, only_matching=False): for common1_index, common2_index in zip(common1_indices, common2_indices): row[common1_index]=v[common2_index] new_tab.AddRow(row) - return new_tab \ No newline at end of file + return new_tab + + \ No newline at end of file diff --git a/modules/base/tests/test_table.py b/modules/base/tests/test_table.py index 7f43726f71d7e9f18aea4ec764674473b6c7ee4b..56d7ba134768f4f811b11d113b449b953be3a258 100644 --- a/modules/base/tests/test_table.py +++ b/modules/base/tests/test_table.py @@ -131,6 +131,7 @@ class TestTable(unittest.TestCase): tab = Table() self.CompareColCount(tab, 0) self.CompareRowCount(tab, 0) + self.assertRaises(ValueError, tab.GetColIndex, 'a') def testTableInitSingleColEmpty(self): ''' @@ -831,6 +832,10 @@ class TestTable(unittest.TestCase): self.assertEquals(tab.Count('second'),2) self.assertEquals(tab.Count('third'),2) self.assertEquals(tab.Count('fourth'),3) + self.assertEquals(tab.Count('first', ignore_nan=False),3) + self.assertEquals(tab.Count('second', ignore_nan=False),3) + self.assertEquals(tab.Count('third', ignore_nan=False),3) + self.assertEquals(tab.Count('fourth', ignore_nan=False),3) self.assertRaises(ValueError,tab.Count,'fifth') def testCalcEnrichment(self): @@ -974,6 +979,55 @@ class TestTable(unittest.TestCase): self.assertRaises(RuntimeError, tab.GetOptimalPrefactors, 'c','a','b',weight='d') self.assertRaises(RuntimeError, tab.GetOptimalPrefactors, 'c',weights='d') + + def testIsEmpty(self): + tab = Table() + self.assertTrue(tab.IsEmpty()) + self.assertTrue(tab.IsEmpty(ignore_nan=False)) + self.assertRaises(ValueError, tab.IsEmpty, 'a') + + # empty table + tab = Table(['a','b','c'], 'fff') + self.assertTrue(tab.IsEmpty()) + self.assertTrue(tab.IsEmpty('a')) + self.assertTrue(tab.IsEmpty('b')) + self.assertTrue(tab.IsEmpty('c')) + self.assertTrue(tab.IsEmpty(ignore_nan=False)) + self.assertTrue(tab.IsEmpty('a', ignore_nan=False)) + self.assertTrue(tab.IsEmpty('b', ignore_nan=False)) + self.assertTrue(tab.IsEmpty('c', ignore_nan=False)) + self.assertRaises(ValueError, tab.IsEmpty, 'd') + + # fill row with NAN values + tab.AddRow([None,None,None]) + self.assertTrue(tab.IsEmpty()) + self.assertTrue(tab.IsEmpty('a')) + self.assertTrue(tab.IsEmpty('b')) + self.assertTrue(tab.IsEmpty('c')) + self.assertFalse(tab.IsEmpty(ignore_nan=False)) + self.assertFalse(tab.IsEmpty('a', ignore_nan=False)) + self.assertFalse(tab.IsEmpty('b', ignore_nan=False)) + self.assertFalse(tab.IsEmpty('c', ignore_nan=False)) + + # fill some values into column 'c' only + tab.AddRow([None,None,1.0]) + self.assertFalse(tab.IsEmpty()) + self.assertTrue(tab.IsEmpty('a')) + self.assertTrue(tab.IsEmpty('b')) + self.assertFalse(tab.IsEmpty('c')) + self.assertFalse(tab.IsEmpty('a', ignore_nan=False)) + self.assertFalse(tab.IsEmpty('b', ignore_nan=False)) + self.assertFalse(tab.IsEmpty('c', ignore_nan=False)) + + # fill some values into all columns + tab.AddRow([2.0,3.0,1.0]) + self.assertFalse(tab.IsEmpty()) + self.assertFalse(tab.IsEmpty('a')) + self.assertFalse(tab.IsEmpty('b')) + self.assertFalse(tab.IsEmpty('c')) + self.assertFalse(tab.IsEmpty('a', ignore_nan=False)) + self.assertFalse(tab.IsEmpty('b', ignore_nan=False)) + self.assertFalse(tab.IsEmpty('c', ignore_nan=False)) if __name__ == "__main__": try: