Higher-Order Functions
Introduction
A template is a built-in higher order function, which can extend or enhance a function or an operator. A template takes a function and some objects as input. It works like a pipe between the function and its input data. In general, the input data is dissembled into multiple pieces (which may or may not overlap) in a preset way at first; then the individual pieces of data are applied to the given function to produce results one at a time; finally all individual results are assembled into one object to return. The input data for a template can be vectors, matrices or tables, with the occasional use of scalars and dictionaries. With a template, complicated analytical tasks can be accomplished very efficiently with only a few lines of statements.
Syntax
Higher-order functions are always used together with operators, user-defined functions, or system functions. Higher-order function symbols start with the symbol colon “:” followed by an upper-case single character.
higherOrderFunctionName (<functionName>, functionParameter1, …functionParameterN)
or
<functionName> :<higher order symbol> functionParameter
or
functionParameter1 <functionName> :<higher order symbol> functionParameter2
In DolphinDB, the first parameter of all templates must be a function name. To call more than one function in a higher-order function, you can specify the call higher-order function as the first parameter <functionName>, and then pass in the functions you want to call as argument to call. Please refer to the section about the higher-order function call.
Note: Starting from Version 1.30.17, the first parameter of a higher-order function will be parsed as a function.
Higher-order Function Summary
The summary table below shows template names and applications.
Symbol |
Name |
Applications |
Examples |
---|---|---|---|
:E |
each |
unary operators, binary operators, function calls |
|
peach |
parallel version of |
||
:R |
eachRight |
binary operators |
|
:L |
eachLeft |
binary operators |
|
:P |
eachPre |
binary operators, function calls |
|
:O |
eachPost |
binary operators, function calls |
|
pivot |
function calls |
Transpose rows and columns of raw data or grouped aggregation results |
|
:A |
accumulate |
binary operators, function calls |
|
:T |
reduce |
binary operators, function calls |
|
:G |
groupby |
binary operators, function calls |
|
:C |
cross |
binary operators, function calls |
|
pcross |
parallel version of |
||
moving |
binary operators, function calls (aggregate function) |
||
window |
function calls |
Similar to |
|
nullCompare |
binary operators, function calls |
Preserve NULLs in the calculation to keep consistent with the behavior of Python. |
|
loop |
unary operators, binary operators, function calls, mixed return types |
||
ploop |
parallel version of |
||
all |
binary operators, function calls |
||
any |
binary operators, function calls |
||
call |
function calls |
Usually used with function |
|
pcall |
parallel version of |
||
unifiedCall |
function calls |
Similar to |
|
:X |
contextby |
binary operators, function calls |
Perform specified calculations in groups |
segmentby |
binary operators, function calls |
||
rolling |
binary operators, function calls |
Calculate the beta value of APPL on the market (SPY) |
|
withNullFill |
binary operators |
Replace the Null value with a specific value in the calculation |
|
byRow |
function calls |
Calculate data in each row of a matrix |
|
talib |
function calls |
To process data with DolphinDB functions in the same way as Python TA-lib |
|
tmoving |
function calls |
Apply the function/operator to a time-based sliding window (with the right boundary inclusive) of the given objects. |
|
twindow |
function calls |
Similar to |
The adverbs listed above can be used iteratively.
The operations of each adverb are conducted in left-to-right order. Take X <operator> :E:L Y for example, the leftmost adverb :E is first applied to each element in X and Y (X(i) and Y(i)), and then the next adverb :L is used to apply the operator for each X(i). The result is returned after all adverbs are applied.
$ a=1 2 3
$ b=4 5 6
$ c=(a,b)
$ re=c +:E:L c
$ re
(1 2 3
- - -
2 3 4
3 4 5
4 5 6
,4 5 6
-- -- --
8 9 10
9 10 11
10 11 12
)
Rules to Dissemble and Assemble
In general, a vector is dissembled into scalars, a matrix into columns (vectors), a tuple into multiple elements (of different data forms), and a table into rows (represented by dictionaries).
In the assembly phase, the results of scalar type are merged to form a vector, vectors to a matrix, dictionaries to a table, and other data forms (which are inconsistent) into a tuple.
A template function iterates over a vector/tuple by elements, a matrix by columns, and a table by rows.