This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous 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 [2011/06/13 16:20] (current) chris.strashok |
||
---|---|---|---|
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 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. |