🎉 🎉   RAPIDMINER 9.5 BETA IS OUT!!!   🎉 🎉

GRAB THE HOTTEST NEW BETA OF RAPIDMINER STUDIO, SERVER, AND RADOOP. LET US KNOW WHAT YOU THINK!

CLICK HERE TO DOWNLOAD

🦉 🎤   RapidMiner Wisdom 2020 - CALL FOR SPEAKERS   🦉 🎤

We are inviting all community members to submit proposals to speak at Wisdom 2020 in Boston.


Whether it's a cool RapidMiner trick or a use case implementation, we want to see what you have.
Form link is below and deadline for submissions is November 15. See you in Boston!

CLICK HERE TO GO TO ENTRY FORM

Problem with the Execute-Script-Operator

Thrhw31Thrhw31 Member Posts: 2 Contributor I
edited November 2018 in Help
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 :( 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);

Best Answer

  • Marco_BoeckMarco_Boeck Team Lead Software Engineering Posts: 1,819   RM Engineering
    Solution Accepted

    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

     

Answers

  • MariusHelfMariusHelf RapidMiner Certified Expert, Member Posts: 1,869   Unicorn
    Hi,

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

    Best regards,
    Marius
  • jhillerjhiller Member Posts: 12 Contributor II

    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

     

  • jhillerjhiller Member Posts: 12 Contributor II

    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

  • jhillerjhiller Member Posts: 12 Contributor II

    Solved!

     

    Thanks a lot!

Sign In or Register to comment.