User Tools

Site Tools


howtos:toolcoding:many_to_one_mapping_with_non_summation_aggregation_rule

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
howtos:toolcoding:many_to_one_mapping_with_non_summation_aggregation_rule [2010/04/20 19:37]
deryn.crockett
howtos:toolcoding:many_to_one_mapping_with_non_summation_aggregation_rule [2010/04/23 18:41]
deryn.crockett
Line 1: Line 1:
-The map tool can perform an index mapping in which multiple elements of informant X are mapped to the same element of informant Y.  To aggregate multiple elements into one, the map tool sums the values of the composite elements. ​ However, there may be a need to use a different aggregation function such as minimum, maximum, or average.  ​The following code demonstrates how to implement this logic.+====== Many to One Mapping with Non-Summation Aggregation Rule ====== 
 +The map tool can perform an index mapping in which multiple elements of informant X are mapped to the same element of informant Y.  To aggregate multiple elements into one, the map tool sums the values of the composite elements. ​ However, there may be a need to use a different aggregation function such as minimum, maximum, or average.  ​
  
 +The following example demonstrates how to implement this logic.
 +
 +===== Background =====
 +In this example, the a variable indexed by the informant unitID will be mapped to a variable indexed by the informant plantID. ​ The contents of these informants are:
 <​code>​ <​code>​
 +plantID[]: set
 + ​version:​ 3
 + ​desc: ​   localinformant plantID[] = create (; object=set, data="​Plant1 Plant2"​)
 + ​data: ​   2 elements
 +-----------------------------------
 +1     ​Plant1 ​         ​
 +2     ​Plant2 ​         ​
  
 +unitID[]: set
 + ​version:​ 3
 + ​desc: ​   localinformant unitID[] = create (; object=set, data="​Unit1 Unit2 Unit3 Unit4 Unit5"​)
 + ​data: ​   5 elements
 +-----------------------------------
 +1     ​Unit1 ​          
 +2     ​Unit2 ​          
 +3     ​Unit3 ​          
 +4     ​Unit4 ​          
 +5     ​Unit5 ​          
 </​code>​ </​code>​
 +
 +The variable unitComYr contains commissioning years by unitID
 +
 +{{:​howtos:​toolcoding:​unitcomyr.png|}}
 +
 +===== Implementation =====
 +1. Create the following desired mapping from unitID to plantID is:\\
 +
 +Unit1 -> Plant1\\
 +Unit2 -> Plant2\\
 +Unit3 -> Plant1\\
 +Unit4 -> Plant1\\
 +Unit5 -> Plant2
 +
 +<​code>​
 +local unitToPlantMap[uid] = create (; dataType=integer,​ dim=unitID, data="​1 2 1 1 2")
 +</​code>​
 +
 +
 +2. Create a mask that will expand unitComYr to include plantID
 +
 +<​code>​
 +local pid[pid,​pid] = diag (1.0; dim=plantID)
 +local plantIDMask[uid,​pid] = boolne (dimtran (pid[pid,​pid];​ map1=unitToPlantMap[uid],​ newDims=1, checkData=off),​0)
 +</​code>​
 +{{:​howtos:​toolcoding:​plantidmask.png|}}
 +
 +<​code>​
 +local unitComYrx[uid,​pid] = unitComYr[uid] * plantIDMask[uid,​pid]
 +</​code>​
 +{{:​howtos:​toolcoding:​unitcomyrx.png|}}
 +
 +
 +3. Add offset to remove 0's before taking minimum
 +<​code>​
 +local unitComYry[uid,​pid] = booleq (unitComYrx[uid,​pid],​0) * 9999 + unitComYrx[uid,​pid]
 +</​code>​
 +
 +
 +4. Use coordmin to create a variable that contains online date, which is the earliest commissioning year of the units that comprise the plant, by plantId
 +<​code>​
 +local plantOnlineDate[pid] = coordmin (reorder (unitComYry[uid,​pid];​ plantID, unitID); numDims=1)
 +</​code>​
 +{{:​howtos:​toolcoding:​plantonlinedate.png|}}
 +
 +Click {{:​howtos:​toolcoding:​mapmin.t|here}} to download the tool file that encapsulates the above example.
howtos/toolcoding/many_to_one_mapping_with_non_summation_aggregation_rule.txt · Last modified: 2011/06/13 16:20 by chris.strashok