EmMin
EmMin
creates an EM Min (exponential moving minimum) for an updateBy
table operation. The formula for an EM Min is:
Where:
- is the window size, an input parameter to the method.
- is the EM Min.
- is the current value.
- denotes the step. The current step is , and the previous step is .
Syntax
EmMin(tickDecay, pairs...)
EmMin(control, tickDecay, pairs...)
EmMin(control, timestampColumn, timeDecay, pairs...)
EmMin(control, timestampColumn, durationDecay, pairs...)
EmMin(timestampColumn, timeDecay, pairs...)
EmMin(timestampColumn, durationDecay, pairs...)
Parameters
Parameter | Type | Description |
---|---|---|
tickDecay | double | The decay rate in ticks (rows). |
pairs | String... | The input/output column name pairs. |
control | OperationControl | Defines how special cases should behave. If not given, default |
timestampColumn | String | The column in the source table to use for timestamps. |
timeDecay | long | The decay rate in nanoseconds. |
durationDecay | Duration | The decay rate in a |
Returns
An UpdateByOperation
to be used in an updateBy
table operation.
Examples
One column, no groups
The following example calculates the tick-based and time-based EM Max of the X
column, renaming the resultant column to EmMin_X
. The tick decay rate is set to 5 rows, and the time decay rate is set to 5 seconds. No grouping columns are specified, so the EM Max is calculated for all rows.
baseTime = parseInstant("2023-01-01T00:00:00 ET")
source = emptyTable(10).update("Timestamp = baseTime + i * SECOND", "Letter = (i % 2 == 0) ? `A` : `B`", "X = randomInt(0,25)")
result = source.updateBy([EmMin(5, "EmMin_Tick_X = X"), EmMin("Timestamp", 5 * SECOND, "EmMin_Time_X = X")])
- source
- result
One EM Max column, one grouping column
The following example builds on the previous by specifying Letter
as the key column. Thus, the EM Max is calculated on a per-letter basis.
baseTime = parseInstant("2023-01-01T00:00:00 ET")
source = emptyTable(10).update("Timestamp = baseTime + i * SECOND", "Letter = (i % 2 == 0) ? `A` : `B`", "X = randomInt(0,25)")
result = source.updateBy([EmMin(5, "EmMin_Tick_X = X"), EmMin("Timestamp", 5 * SECOND, "EmMin_Time_X = X")], "Letter")
- source
- result
Multiple EM Max columns, multiple grouping columns
The following example builds on the previous by calculating the EM Max of multiple columns with each UpdateByOperation
. Also, the groups are defined by unique combinations of letter and boolean in the Letter
and Truth
columns, respectively.
baseTime = parseInstant("2023-01-01T00:00:00 ET")
source = emptyTable(20).update("Timestamp = baseTime + i * SECOND", "Letter = (i % 2 == 0) ? `A` : `B`", "Truth = randomBool()", "X = randomInt(0, 25)", "Y = randomInt(0, 25)")
result = source.updateBy([EmMin(2, "EmMin_Tick_X = X", "EmMin_Tick_Y = Y"), EmMin("Timestamp", 3 * SECOND, "EmMin_Time_X = X", "EmMin_Time_Y = Y")], "Letter", "Truth")
- source
- result
Multiple UpdateByOperations
, multiple grouping columns
The following example builds on the previous by calculating the tick- and time-based EM Max of the X and Y columns using different EM Max
UpdateByOperations
. This allows each EM Max to have its own decay rate. The decay rates are reflected in the renamed resultant columns.
baseTime = parseInstant("2023-01-01T00:00:00 ET")
source = emptyTable(20).update("Timestamp = baseTime + i * SECOND", "Letter = (i % 2 == 0) ? `A` : `B`", "Truth = randomBool()", "X = randomInt(0, 25)", "Y = randomInt(0, 25)")
emminTickX = EmMin(1, "EmMin_Tick_X_1row = X")
emminTickY = EmMin(5, "EmMin_Tick_Y_5rows = Y")
emminTimeX = EmMin("Timestamp", 2 * SECOND, "EmMin_Time_X_2sec = X")
emminTimeY = EmMin("Timestamp", 4 * SECOND, "EmMin_Time_Y_4sec = Y")
result = source.updateBy([emminTickX, emminTickY, emminTimeX, emminTimeY], "Letter", "Truth")
- source
- result