def test_error_invalid_expression(self): data = Table("iris") self.widget.setData(data) self.widget.addFeature(ContinuousDescriptor("X", "0", 3)) self.widget.apply() self.assertFalse(self.widget.Error.invalid_expressions.is_shown()) self.widget.addFeature(ContinuousDescriptor("X", "0a", 3)) self.widget.apply() self.assertTrue(self.widget.Error.invalid_expressions.is_shown())
def test_transform_error(self): data = Table("iris")[::5] self.send_signal(self.widget.Inputs.data, data) self.widget.addFeature(ContinuousDescriptor("X", "1/0", 3)) self.widget.apply() self.wait_until_finished(self.widget) self.assertTrue(self.widget.Error.transform_error.is_shown()) self.widget.removeFeature(0) self.widget.addFeature(ContinuousDescriptor("X", "1", 3)) self.widget.apply() self.wait_until_finished(self.widget) self.assertFalse(self.widget.Error.transform_error.is_shown())
def test_migration_discrete_strings(self): v = [DiscreteVariable("Ana", values=tuple("012")), ContinuousVariable("Cilka")] domain = Domain(v) data = Table.from_numpy(domain, [[1, 3.14]]) settings_w_discrete = { "context_settings": [Context( attributes=dict(Ana=1, Cilka=2), metas={}, values=dict( descriptors=[ ContinuousDescriptor("y", "Ana + int(Cilka)", 1), StringDescriptor("u", "Ana.value + 'X'") ], currentIndex=0) )] } widget = self.create_widget(OWFeatureConstructor, settings_w_discrete) self.send_signal(widget.Inputs.data, data) self.assertTrue(widget.expressions_with_values) self.assertFalse(widget.fix_button.isHidden()) out = self.get_output(widget.Outputs.data) np.testing.assert_almost_equal(out.X, [[1, 3.14, 4]]) np.testing.assert_equal(out.metas, [["1X"]]) settings_no_discrete = { "context_settings": [Context( attributes=dict(Ana=1, Cilka=2), metas={}, values=dict( descriptors=[ ContinuousDescriptor("y", "int(Cilka)", 1), ], currentIndex=0) )] } widget = self.create_widget(OWFeatureConstructor, settings_no_discrete) self.send_signal(widget.Inputs.data, data) self.assertFalse(widget.expressions_with_values) self.assertTrue(widget.fix_button.isHidden()) out = self.get_output(widget.Outputs.data) np.testing.assert_almost_equal(out.X, [[1, 3.14, 3]]) widget = self.create_widget(OWFeatureConstructor, settings_w_discrete) self.send_signal(widget.Inputs.data, data) self.assertTrue(widget.expressions_with_values) self.assertFalse(widget.fix_button.isHidden()) self.send_signal(widget.Inputs.data, None) self.assertFalse(widget.expressions_with_values) self.assertTrue(widget.fix_button.isHidden())
def test_report(self): settings = { "context_settings": [Context( attributes=dict(x=2, y=2, z=2), metas={}, values=dict( descriptors=[ ContinuousDescriptor("a", "x + 2", 1), DiscreteDescriptor("b", "x < 3", (), False), DiscreteDescriptor("c", "x > 15", (), True), DiscreteDescriptor("d", "y > x", ("foo", "bar"), False), DiscreteDescriptor("e", "x ** 2 + y == 5", ("foo", "bar"), True), StringDescriptor("f", "str(x)"), DateTimeDescriptor("g", "z") ], currentIndex=0) )] } w = self.create_widget(OWFeatureConstructor, settings) v = [ContinuousVariable(name) for name in "xyz"] domain = Domain(v, []) self.send_signal(w.Inputs.data, Table.from_numpy(domain, [[0, 1, 2]])) w.report_items = Mock() w.send_report() args = w.report_items.call_args[0][1] self.assertEqual(list(args), list("abcdefg"))
def test_renaming_duplicate_vars(self): data = Table("iris") self.widget.setData(data) self.widget.addFeature(ContinuousDescriptor("iris", "0", 3)) self.widget.apply() output = self.get_output(self.widget.Outputs.data) self.assertEqual(len(set(var.name for var in output.domain.variables)), len(output.domain.variables))
def test_construct_numeric_names(self): data = Table("iris") data.domain.attributes[0].name = "0.1" data.domain.attributes[1].name = "1" desc = PyListModel([ ContinuousDescriptor(name="S", expression="_0_1 + _1", number_of_decimals=3) ]) nv = construct_variables(desc, data.domain) ndata = Table(Domain(nv, None), data) np.testing.assert_array_equal(ndata.X[:, 0], data.X[:, :2].sum(axis=1)) ContinuousVariable._clear_all_caches()
def test_construct_numeric_names(): data = Table("iris") newdomain = Domain( (ContinuousVariable("0.1"), ContinuousVariable("1")) + data.domain.attributes[2:], data.domain.class_var) data = Table.from_numpy(newdomain, data.X, data.Y) desc = PyListModel([ ContinuousDescriptor(name="S", expression="_0_1 + _1", number_of_decimals=3) ]) nv = construct_variables(desc, data) ndata = Table(Domain(nv, None), data) np.testing.assert_array_equal(ndata.X[:, 0], data.X[:, :2].sum(axis=1))
def test_unicode_normalization(): micro = "\u00b5" domain = Domain([ContinuousVariable(micro)]) name = 'Micro Variable' expression = micro desc = PyListModel( [ContinuousDescriptor(name=name, expression=expression, number_of_decimals=2)] ) data = Table.from_numpy(domain, np.arange(5).reshape(5, 1)) data = data.transform(Domain(data.domain.attributes, [], construct_variables(desc, data))) np.testing.assert_equal(data.X, data.metas)
def test_construct_variables_continuous(self): data = Table("iris") name = 'Continuous Variable' expression = "pow(sepal_length + sepal_width, 2)" featuremodel = PyListModel( [ContinuousDescriptor(name=name, expression=expression, number_of_decimals=2)] ) data = Table(Domain(list(data.domain.attributes) + construct_variables(featuremodel, data.domain), data.domain.class_vars, data.domain.metas), data) self.assertTrue(isinstance(data.domain[name], ContinuousVariable)) for i in range(3): self.assertEqual(data[i * 50, name], pow(data[i * 50, 0] + data[i * 50, 1], 2))
def test_fix_values(self, msgbox): w = self.widget msgbox.ApplyRole, msgbox.RejectRole = object(), object() msgbox.return_value = Mock() dlgexec = msgbox.return_value.exec = Mock() v = [DiscreteVariable(name, values=tuple("abc")) for name in ("ana", "berta", "cilka")] domain = Domain(v, []) self.send_signal(w.Inputs.data, Table.from_numpy(domain, [[0, 1, 2]])) w.descriptors = [StringDescriptor( "y", "ana.value + berta.value + cilka.value")] # Reject fixing - no changes dlgexec.return_value=msgbox.RejectRole w.fix_expressions() self.assertEqual(w.descriptors[0].expression, "ana.value + berta.value + cilka.value") dlgexec.return_value = Mock(return_value=msgbox.AcceptRole) w.fix_expressions() self.assertEqual(w.descriptors[0].expression, "ana + berta + cilka") w.descriptors = [StringDescriptor( "y", "ana.value + dani.value + cilka.value")] with patch.object(w, "apply"): # dani doesn't exist and will fail w.fix_expressions() self.assertEqual(w.descriptors[0].expression, "ana + dani.value + cilka") w.descriptors = [ContinuousDescriptor("y", "sqrt(berta)", 1)] w.fix_expressions() self.assertEqual(w.descriptors[0].expression, "sqrt({'a': 0, 'b': 1, 'c': 2}[berta])")
def test_create_variable_with_no_data(self): self.widget.addFeature(ContinuousDescriptor("X1", "", 3))