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 20:23] 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. | ||
- | <code - mapMin.t> | + | The following example demonstrates how to implement this logic. |
- | localinformant plantID[] = create (; object=set, data="Plant1 Plant2") | + | |
- | localinformant unitID[] = create (; object=set, data="Unit1 Unit2 Unit3 Unit4 Unit5") | + | |
- | ! map containing index value into plantID for each element of unitID to implement the mapping: | + | ===== Background ===== |
- | ! Unit1 -> Plant1 | + | 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: |
- | ! Unit2 -> Plant2 | + | <code> |
- | ! Unit3 -> Plant1 | + | plantID[]: set |
- | ! Unit4 -> Plant1 | + | version: 3 |
- | ! Unit5 -> Plant2 | + | 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> | ||
+ | |||
+ | 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") | local unitToPlantMap[uid] = create (; dataType=integer, dim=unitID, data="1 2 1 1 2") | ||
+ | </code> | ||
- | ! variable that contains commissioning years by unit id | ||
- | local unitComYr[uid] = create (; dim=unitID, data="1990 1975 1980 1995 2000") | ||
+ | 2. Create a mask that will expand unitComYr to include plantID | ||
+ | |||
+ | <code> | ||
local pid[pid,pid] = diag (1.0; dim=plantID) | 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) | 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] | local unitComYrx[uid,pid] = unitComYr[uid] * plantIDMask[uid,pid] | ||
+ | </code> | ||
+ | {{:howtos:toolcoding:unitcomyrx.png|}} | ||
+ | |||
- | ! add offset to remove 0's before taking minimum | + | 3. Add offset to remove 0's before taking minimum |
+ | <code> | ||
local unitComYry[uid,pid] = booleq (unitComYrx[uid,pid],0) * 9999 + unitComYrx[uid,pid] | local unitComYry[uid,pid] = booleq (unitComYrx[uid,pid],0) * 9999 + unitComYrx[uid,pid] | ||
+ | </code> | ||
- | ! variable that contains online date, which is the earliest commissioning year of the units that comprise the plant, by plant id | ||
- | local plantOnlineDate[pid] = coordmin (reorder (unitComYry[uid,pid]; plantID, unitID); numDims=1) | ||
- | table (plantOnlineDate[pid]) | ||
+ | 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> | </code> | ||
+ | {{:howtos:toolcoding:plantonlinedate.png|}} | ||
+ | |||
+ | Click {{:howtos:toolcoding:mapmin.t|here}} to download the tool file that encapsulates the above example. |