Loop which sets a mark from a time interval
![felix_w](https://us.v-cdn.net/6038102/uploads/defaultavatar/nLP0QHCLH24WL.jpg)
Dear Rapidminer Community,
I got a problem which I hope you can help me with!
I have a time interval, lets say from 27th of November 3pm to 7pm and what I would like to do is that I take this interval and mark all the hours within this interval on a 24h basis.
Like this:
27th November 1 AM
27th November 2 AM
27th November 3 AM
27th November 4 AM
....
27th November 2 PM
27th November 3 PM X (the mark)
27th November 4 PM X (the mark)
27th November 5 PM X (the mark)
27th November 6 PM X (the mark)
27th November 7 PM X (the mark)
27th November 8 PM
27th November 9 PM
....
I tried to solve this with a generate attribute operator and an "if clause" but I didn't manage to get any proper results!
Is there any way to solve this?
Best regards
Felix
Answers
-
Hi Felix,
You can use a couple of ways, but Generate Attributes should work fine for you. See these examples.
<?xml version="1.0" encoding="UTF-8"?><process version="7.6.001">
<context>
<input/>
<output/>
<macros/>
</context>
<operator activated="true" class="process" compatibility="7.6.001" expanded="true" name="Process">
<process expanded="true">
<operator activated="true" class="operator_toolbox:generate_univariate_series" compatibility="0.6.001" expanded="true" height="68" name="Generate Univariate Series" width="90" x="45" y="85">
<parameter key="data_type" value="DATE_TIME"/>
<parameter key="startdate" value="2017-11-26 00:00:00"/>
<parameter key="enddate" value="2017-11-28 00:00:00"/>
<parameter key="intervaltype" value="HOUR"/>
</operator>
<operator activated="true" class="filter_examples" compatibility="7.6.001" expanded="true" height="103" name="Filter Examples" width="90" x="179" y="85">
<list key="filters_list">
<parameter key="filters_entry_key" value="att1.le.11/27/2017 7:00:00 PM"/>
<parameter key="filters_entry_key" value="att1.ge.11/27/2017 3:00:00 PM"/>
</list>
</operator>
<operator activated="true" class="generate_empty_attribute" compatibility="7.6.001" expanded="true" height="82" name="Generate Empty Attribute" width="90" x="313" y="187">
<parameter key="name" value="mark"/>
<parameter key="value_type" value="polynominal"/>
</operator>
<operator activated="true" class="generate_attributes" compatibility="7.6.001" expanded="true" height="82" name="Generate Attributes" width="90" x="313" y="85">
<list key="function_descriptions">
<parameter key="mark" value=""X""/>
</list>
</operator>
<operator activated="true" class="append" compatibility="7.6.001" expanded="true" height="103" name="Append" width="90" x="447" y="85"/>
<operator activated="true" class="sort" compatibility="7.6.001" expanded="true" height="82" name="Sort" width="90" x="581" y="85">
<parameter key="attribute_name" value="att1"/>
</operator>
<operator activated="true" class="operator_toolbox:generate_univariate_series" compatibility="0.6.001" expanded="true" height="68" name="Generate Univariate Series (2)" width="90" x="45" y="391">
<parameter key="data_type" value="DATE_TIME"/>
<parameter key="startdate" value="2017-11-26 00:00:00"/>
<parameter key="enddate" value="2017-11-28 00:00:00"/>
<parameter key="intervaltype" value="HOUR"/>
</operator>
<operator activated="true" class="generate_attributes" compatibility="7.6.001" expanded="true" height="82" name="Generate Attributes (2)" width="90" x="179" y="391">
<list key="function_descriptions">
<parameter key="mark" value="if( date_after(att1,date_parse_custom("201711271459","yyyyMMddHHmm")) && date_before(att1,date_parse_custom("201711271901","yyyyMMddHHmm")),"X",MISSING_NOMINAL)"/>
</list>
</operator>
<connect from_op="Generate Univariate Series" from_port="output" to_op="Filter Examples" to_port="example set input"/>
<connect from_op="Filter Examples" from_port="example set output" to_op="Generate Attributes" to_port="example set input"/>
<connect from_op="Filter Examples" from_port="unmatched example set" to_op="Generate Empty Attribute" to_port="example set input"/>
<connect from_op="Generate Empty Attribute" from_port="example set output" to_op="Append" to_port="example set 2"/>
<connect from_op="Generate Attributes" from_port="example set output" to_op="Append" to_port="example set 1"/>
<connect from_op="Append" from_port="merged set" to_op="Sort" to_port="example set input"/>
<connect from_op="Sort" from_port="example set output" to_port="result 1"/>
<connect from_op="Generate Univariate Series (2)" from_port="output" to_op="Generate Attributes (2)" to_port="example set input"/>
<connect from_op="Generate Attributes (2)" from_port="example set output" to_port="result 2"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="sink_result 1" spacing="0"/>
<portSpacing port="sink_result 2" spacing="336"/>
<portSpacing port="sink_result 3" spacing="0"/>
<description align="center" color="yellow" colored="false" height="105" resized="false" width="180" x="426" y="221">Route one.</description>
<description align="center" color="yellow" colored="false" height="105" resized="false" width="180" x="315" y="430">Route two. 1 operator</description>
</process>
</operator>
</process>2 -
There is an operator in the Toolbox extension called "Generate Univariate Series" which will also do something similar for you.2
-
Thank you very much for your quick help!
Is there also a loop which can go through a high amount of those intervals (~1000)? Because right now, this solutions works only for one specific date, right?!
0 -
Yes, you should be able to go through and use a loop to generate your desired intervals---you'll want to set macros for start and end date (if you are using Generate Univariate Series) based on the values from your dataset, and then loop over them.1
-
Can I do this with Loop Examples? Because the intervals are below each other.
0 -
Something like this would work @felix_w
You can load a list of dates to mark here and the process will mark any number of them.
<?xml version="1.0" encoding="UTF-8"?><process version="7.6.001">
<context>
<input/>
<output/>
<macros/>
</context>
<operator activated="true" class="process" compatibility="7.6.001" expanded="true" name="Process">
<process expanded="true">
<operator activated="true" class="operator_toolbox:generate_univariate_series" compatibility="0.6.001" expanded="true" height="68" name="Generate Univariate Series (2)" width="90" x="45" y="34">
<parameter key="data_type" value="DATE_TIME"/>
<parameter key="startdate" value="2017-10-31 00:00:00"/>
<parameter key="enddate" value="2017-12-28 00:00:00"/>
<parameter key="intervaltype" value="HOUR"/>
</operator>
<operator activated="true" class="generate_empty_attribute" compatibility="7.6.001" expanded="true" height="82" name="Generate Empty Attribute" width="90" x="246" y="34">
<parameter key="name" value="mark"/>
<parameter key="value_type" value="polynominal"/>
</operator>
<operator activated="true" class="operator_toolbox:create_exampleset_from_doc" compatibility="0.6.001" expanded="true" height="68" name="Create ExampleSet" width="90" x="45" y="187">
<parameter key="Input Csv" value="markDates,starthour,markhours 2017-11-01,2,5 2017-11-27,15,3 2017-11-22,3,4 "/>
<description align="center" color="transparent" colored="false" width="126">Put your dates to mark here. <br/>Format date, hour to start the mark, hour to finish it.</description>
</operator>
<operator activated="true" class="extract_macro" compatibility="7.6.001" expanded="true" height="68" name="Extract Macro (2)" width="90" x="179" y="187">
<parameter key="macro" value="loopNum"/>
<parameter key="statistics" value="count"/>
<list key="additional_macros"/>
</operator>
<operator activated="true" class="concurrency:loop" compatibility="7.6.001" expanded="true" height="103" name="Loop" width="90" x="447" y="34">
<parameter key="number_of_iterations" value="%{loopNum}"/>
<parameter key="reuse_results" value="true"/>
<process expanded="true">
<operator activated="true" class="extract_macro" compatibility="7.6.001" expanded="true" height="68" name="Extract Macro" width="90" x="112" y="85">
<parameter key="macro" value="starthour"/>
<parameter key="macro_type" value="data_value"/>
<parameter key="attribute_name" value="starthour"/>
<parameter key="example_index" value="%{iteration}"/>
<list key="additional_macros">
<parameter key="markhours" value="markhours"/>
<parameter key="markDates" value="markDates"/>
</list>
</operator>
<operator activated="true" class="free_memory" compatibility="7.6.001" expanded="true" height="103" name="Free Memory" width="90" x="313" y="34"/>
<operator activated="true" class="generate_attributes" compatibility="7.6.001" expanded="true" height="82" name="Generate Attributes (2)" width="90" x="514" y="34">
<list key="function_descriptions">
<parameter key="mark" value="if( date_after(att1,date_add(date_parse_custom(%{markDates},"yyyy-MM-dd"),eval(%{starthour})-1,DATE_UNIT_HOUR)) && date_before(att1,date_add(date_parse_custom(%{markDates},"yyyy-MM-dd"),eval(%{starthour})+eval(%{markhours}),DATE_UNIT_HOUR)) ,"X",mark)"/>
</list>
</operator>
<connect from_port="input 1" to_op="Free Memory" to_port="through 1"/>
<connect from_port="input 2" to_op="Extract Macro" to_port="example set"/>
<connect from_op="Extract Macro" from_port="example set" to_op="Free Memory" to_port="through 2"/>
<connect from_op="Free Memory" from_port="through 1" to_op="Generate Attributes (2)" to_port="example set input"/>
<connect from_op="Free Memory" from_port="through 2" to_port="output 2"/>
<connect from_op="Generate Attributes (2)" from_port="example set output" to_port="output 1"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="source_input 2" spacing="63"/>
<portSpacing port="source_input 3" spacing="0"/>
<portSpacing port="sink_output 1" spacing="0"/>
<portSpacing port="sink_output 2" spacing="0"/>
<portSpacing port="sink_output 3" spacing="0"/>
</process>
</operator>
<connect from_op="Generate Univariate Series (2)" from_port="output" to_op="Generate Empty Attribute" to_port="example set input"/>
<connect from_op="Generate Empty Attribute" from_port="example set output" to_op="Loop" to_port="input 1"/>
<connect from_op="Create ExampleSet" from_port="output" to_op="Extract Macro (2)" to_port="example set"/>
<connect from_op="Extract Macro (2)" from_port="example set" to_op="Loop" to_port="input 2"/>
<connect from_op="Loop" from_port="output 1" to_port="result 1"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="sink_result 1" spacing="0"/>
<portSpacing port="sink_result 2" spacing="0"/>
<description align="center" color="yellow" colored="false" height="60" resized="true" width="315" x="492" y="197">This has no bug fixing at all.</description>
</process>
</operator>
</process>3 -
Thank you again for your great help! I will try that tomorrow!
1