RapidMiner

Problem with the Execute-Script-Operator

SOLVED
Contributor

Problem with the Execute-Script-Operator

Hey,

I'm trying to generate an attribute Y in a moving sum from another attribute X:

Y(1) = X(1)

for i = 2 ... length(X) {

Y(i) = X(i) + Y(i-1)

}

The Result should look like this:









X Y
1 1
0 1
0 1
1 2
0 2


I do not found a possibility to do this in Rapidminer and therefore I used the Execute-Script-Operator. Unfortunately I have nearly no experience in Java/Groovy Smiley Sad The problem with my script is that it overwrites my input attribute X. I would be very grateful if someone have a look on the code below.

Greetings from Germany


import com.rapidminer.example.table.NumericalAttribute;
import com.rapidminer.tools.Ontology;

ExampleSet input= input[0];
Attributes all_attributes = input.getAttributes();
Attribute bool_attrib = all_attributes.get("X");
Attribute target = AttributeFactory.createAttribute("Y", Ontology.INTEGER)

target.setTableIndex(bool_attrib.getTableIndex());
all_attributes.addRegular(target);
ExampleTable bool_tbl = input.getExampleTable();

for (int i = 0; i < bool_tbl.size(); i++) {

DataRow tmp_DataRow = bool_tbl.getDataRow(i);
if (i == 0)
{
tmp_DataRow.set(target, tmp_DataRow.get(bool_attrib));
}

if (i != 0)
{
tmp_DataRow.set(target, tmp_DataRow.get(bool_attrib) + bool_tbl.getDataRow(i-1).get(target));
}
}
return (input);
1 ACCEPTED SOLUTION

Accepted Solutions
RMStaff
Solution
Accepted by mschmitz (RMStaff)
‎04-21-2017 04:59 AM

Re: Problem with the Execute-Script-Operator

Hi,

 

here is your fixed script:

 

import com.rapidminer.tools.Ontology

ExampleSet inputExampleSet = input[0];

Attributes inputAttributes = inputExampleSet.getAttributes();
Attribute sourceAttribute = inputAttributes.get("ai_description");
Attribute targetAttribute = AttributeFactory.createAttribute("ai_description_numberOfBulletp", Ontology.INTEGER);

inputAttributes.addRegular(targetAttribute);
inputExampleSet.getExampleTable().addAttribute(targetAttribute);

for (Example actExample : inputExampleSet) {
	int counter = 0;
	String actValue = actExample.getNominalValue(sourceAttribute);
	for( int i=0; i<actValue.length(); i++ ) {
    		if(actValue.charAt(i) == '•') {
			counter++;
    		}
    		
    }
    actExample.setValue(targetAttribute, counter);
}

return(inputExampleSet);

You just need to call "inputExampleSet.getExampleTable().addAttribute(targetAttribute);" after adding a new attribute to the Attributes.

 

Regards,

Marco

 

_________________________________________________________
Team Lead Software Engineering | RapidMiner GmbH
5 REPLIES

Re: Problem with the Execute-Script-Operator

Hi,

what you need is the Integrate operator from the Value Series extension. This will get the job done without any coding Smiley Happy

Best regards,
Marius
Regular Contributor

Re: Problem with the Execute-Script-Operator

[ Edited ]

Hi Thrhw31,

 

I have the same issue in another context.

In my for loop (for exploring the examples) I'm taking the text from a column into a string-variable. Then I count the occurences of a specific character and want wo write the result in a new column. Unfortunately the values of my source-column are overwritten.

 

Have you got a solution for that issue?

 

My code:

import com.rapidminer.tools.Ontology

ExampleSet inputExampleSet = input[0];

Attributes inputAttributes = inputExampleSet.getAttributes();
Attribute sourceAttribute = inputAttributes.get("ai_description");
Attribute targetAttribute = AttributeFactory.createAttribute("ai_description_numberOfBulletp", Ontology.INTEGER);

targetAttribute.setTableIndex(sourceAttribute.getTableIndex());
inputAttributes.addRegular(targetAttribute);

for (Example actExample : inputExampleSet) {
	int counter = 0;
	String actValue = actExample.getNominalValue(sourceAttribute);
	for( int i=0; i<actValue.length(); i++ ) {
    		if(actValue.charAt(i) == '•') {
			counter++;
    		}
    		
    }
    actExample.setValue(targetAttribute, counter);
}

return(inputExampleSet);

 

Regards

Johannes

 

Regular Contributor

Re: Problem with the Execute-Script-Operator

Hi again,

 

i think the sourceAttribute is overwritten by that line:

    actExample.setValue(targetAttribute, counter);

Has anyone an idea to do that in a better way?

 

Regards

Johannes

RMStaff
Solution
Accepted by mschmitz (RMStaff)
‎04-21-2017 04:59 AM

Re: Problem with the Execute-Script-Operator

Hi,

 

here is your fixed script:

 

import com.rapidminer.tools.Ontology

ExampleSet inputExampleSet = input[0];

Attributes inputAttributes = inputExampleSet.getAttributes();
Attribute sourceAttribute = inputAttributes.get("ai_description");
Attribute targetAttribute = AttributeFactory.createAttribute("ai_description_numberOfBulletp", Ontology.INTEGER);

inputAttributes.addRegular(targetAttribute);
inputExampleSet.getExampleTable().addAttribute(targetAttribute);

for (Example actExample : inputExampleSet) {
	int counter = 0;
	String actValue = actExample.getNominalValue(sourceAttribute);
	for( int i=0; i<actValue.length(); i++ ) {
    		if(actValue.charAt(i) == '•') {
			counter++;
    		}
    		
    }
    actExample.setValue(targetAttribute, counter);
}

return(inputExampleSet);

You just need to call "inputExampleSet.getExampleTable().addAttribute(targetAttribute);" after adding a new attribute to the Attributes.

 

Regards,

Marco

 

_________________________________________________________
Team Lead Software Engineering | RapidMiner GmbH
Regular Contributor

Re: Problem with the Execute-Script-Operator

Solved!

 

Thanks a lot!