Expr package provides an engine that can compile and evaluate math expressions. An expression is a one-liner that returns a value (mostly, but not limited to, float64 and []float64). It is designed for simplicity, speed and safety.
The purpose of the package is to allow users to use expressions for fast vector math operations. It is a perfect candidate for the foundation of a time series database and machine learning feature engineering. The idea is to let configure things in a dynamic way without recompile of a program:
# Get a new vector from the addition of cos() and sin() of other variables
cos(X) + 0.33 * sin(Y)
# Get a new norm vector from vector X
(X - nanmin(X)) / (nanmax(X) - nanmin(X))
- Seamless integration with Go (no need to redefine types)
- Static typing
out, err := expr.Compile(`name + age`) // err: invalid operation + (mismatched types string and int) // | name + age // | .....^
- User-friendly error messages.
- Reasonable set of basic operators.
- Dozens of Numpy-like builtin math functions:
abs
,acos
,acosh
,asin
,asinh
,atan
,atanh
,cbrt
,ceil
,cos
,cosh
,erf
,erfc
,erfcinv
,erfinv
,exp
,exp2
,expm1
,floor
,gamma
,j0
,j1
,log
,log10
,log1p
,log2
,logb
,round
,roundtoeven
,sin
,sinh
,sqrt
,tan
,tanh
,trunc
,y0
,y1
,maximum
,minimum
,mod
,pow
,remainder
,nanmin
,nanmax
,nanmean
,nanstd
,nansum
,nanprod
.2 * (nanmean(Scores) - minimum(Elevation, Temp))
go get github.com/regel/expr
package main
import (
"fmt"
"github.com/regel/expr"
"github.com/regel/expr/ast"
)
func main() {
code := `1 + (sum(Features) / 2)`
program, err := expr.Compile(code)
if err != nil {
panic(err)
}
env := &ast.Env{
"Features": []float64{0.5, 1.0, 1.5},
}
output, err := expr.Run(program, env)
if err != nil {
panic(err)
}
fmt.Printf("%v\n", output)
}