Maths functions
pow
Arguments: [x: Floating, exp: Floating]
Returns: Floating
Raise a number by a specific power
log
Arguments: [x: Floating, base: Floating]
Returns: Floating
Return the logarithm of a number for a particular base, defaulting to natural log if none given
log10
Arguments: [Floating]
Returns: Floating
Returns the base-10 logarithm of the given value
exp
Arguments: [Floating]
Returns: Floating
Returns Euler’s number (e) raised to the power of the value given. The inverse of log()
square_root
Arguments: [Floating]
Returns: Floating
Get the square root of the given number
abs
Arguments: [Floating]
Returns: Floating
Gives the absolute value of a number
min
Arguments: [Anything, Anything]
Returns: Anything
Returns the smaller of two values given
max
Arguments: [Anything, Anything]
Returns: Anything
Returns the largest of two values given. Also works as an aggregate function for computing the largest value across a set of values
round
Arguments: [number: Floating, ndigits: Nullable[Integer]]
Returns: Integer
Rounds a number to the closest integer, or the number of digits (decimal places) specified
ceil
Arguments: [Floating]
Returns: Integer
Round number up to the closest integer
floor
Arguments: [Floating]
Returns: Integer
Round number down to the closest integer
float
Arguments: [Anything]
Returns: Floating
Convert input to a floating point number
int
Arguments: [Anything]
Returns: Integer
Convert input to a integer number
maxint
Arguments: []
Returns: Integer
Returns the largest positive number (maximum) that the integer type is capable of representing.
minint
Arguments: []
Returns: Integer
Returns the largest negative number (minimum) that the integer type is capable of representing.
maxfloat
Arguments: []
Returns: Floating
Returns the largest positive number (maximum) that the floating (point) type is capable of representing.
minfloat
Arguments: []
Returns: Floating
Returns the largest negative number (minimum) that the floating (point) type is capable of representing.
inf
Arguments: []
Returns: Floating
Returns a floating point number that can be used to represent infinity.
negative_inf
Arguments: []
Returns: Floating
Returns a floating point number that can be used to represent negative infinity
norm_cdf
Arguments: [x: Floating, mean: Floating, stddev: Floating]
Returns: Floating
Cumulative probability distribution function from a normal curve
The equivalent of this function in Excel is: NORM.DIST(x, scale, shape, 1)
Or in Python: scipy.stats.norm(mean, stddev).cdf(x)
Implementation uses org.apache.commons.math3.distribution.NormalDistribution cumulativeProbability()
(Javadoc available online)
norm_pdf
Arguments: [x: Floating, mean: Floating, stddev: Floating]
Returns: Floating
Probability Density Function (PDF
) for a given point in a normal distribution
The equivalent of this function in Excel is: NORM.DIST(x, scale, shape, 0)
Or in Python: scipy.stats.norm(mean, stddev).pdf(x)
Implementation uses org.apache.commons.math3.distribution.NormalDistribution density()
(Javadoc available online)
norm_ppf
Arguments: [x: Floating, mean: Floating, stddev: Floating]
Returns: Floating
Percent Point Function (PPF
). Returns the inverse Cumulative Distribution Function from a normal curve, where x is the desired probability between 0.0 and 1.0
For example, to find the value in a standard normal distribution that 97.72% of values are less than or equal to, use: norm_ppf(0.9772, 0, 1)
The equivalent of this function in Python is: scipy.stats.norm(mean, stddev).ppf(x)
Implementation uses org.apache.commons.math3.distribution.NormalDistribution inverseCumulativeProbability()
(Javadoc available online)
lognorm_cdf
Arguments: [x: Floating, scale: Floating, shape: Floating]
Returns: Floating
Cumulative probability distribution function from a log-normal curve. Where shape is σ (standard deviation) and scale is μ (mean), both as the log of the distribution.
The equivalent of this function in Excel is: LOGNORM.DIST(x, scale, shape, 1)
Or in Python: scipy.stats.lognorm(s=shape, scale=exp(scale)).cdf(x)
Implementation uses org.apache.commons.math3.distribution.LogNormalDistribution cumulativeProbability()
(Javadoc available online)
lognorm_pdf
Arguments: [x: Floating, scale: Floating, shape: Floating]
Returns: Floating
Probability Density Function (PDF) for a given point in a normal distribution. Where shape is σ (standard deviation) and scale is μ (mean), both as the log of the distribution.
The equivalent of this function in Excel is: LOGNORM.DIST(x, scale, shape, 0)
Or in Python: scipy.stats.lognorm(s=shape, scale=exp(scale)).pdf(x)
Implementation uses org.apache.commons.math3.distribution.LogNormalDistribution density()
(Javadoc available online)
lognorm_ppf
Arguments: [x: Floating, scale: Floating, shape: Floating]
Returns: Floating
Percent Point Function (PPF
). Returns the inverse Cumulative Distribution Function from a log normal curve, where x is the desired probability between 0.0 and 1.0
For example, to find the value in a standard log-normal distribution that 97.72% of values are less than or equal to, use: lognorm_ppf(0.9772, 0, 1)
The equivalent of this function in Python is: scipy.stats.lognorm(s=shape, scale=exp(scale)).ppf(x)
Implementation uses org.apache.commons.math3.distribution.LogNormalDistribution inverseCumulativeProbability()
(Javadoc available online)
polynomial
Arguments: [x: Floating, c: List[Floating]]
Returns: Floating
Computes a polynomial expression, denoted by the set of coefficients ‘c’ (starting at x⁰, x, x², etc)
For example, ‘polynomial(x: 4, c: [7.0, -5.0, 0.0, 1.0])’ will calculate: 7 - 5x + x³ where x=4.
The equivalent of this function in Python is: numpy.polynomial.polynomial.polyval(x, c)
Implementation uses org.apache.commons.math3.analysis.polynomials.PolynomialFunction (Javadoc available online)
random_uniform
Arguments: [start: Floating, stop: Floating]
Returns: Floating
Returns a uniformly distributed random number between start (inclusive) and stop (exclusive).
For comparison, the equivalent of this function in Python is random.uniform(start, stop)
. However, note the actual implementation uses java.util.Random.nextDouble()
.
Use the random-seed
RiskScape parameter to make the randomness reproducibly consistent.
random_norm
Arguments: [mean: Floating, stddev: Floating]
Returns: Floating
Returns a random number from the given normal distribution
The equivalent of this function in Python is: random.normalvariate(mean, stddev)
Use the random-seed
RiskScape parameter to make the randomness reproducibly consistent
modulo
Arguments: [dividend: Floating, divisor: Floating]
Returns: Floating
Compute the remainder when the dividend
is divided by the given divisor
random_choice
Arguments: [items: List[Nullable[Anything]], weights: Nullable[List[Floating]]]
Returns: Nullable[Anything]
Picks an item from the list at random, or with an optional weighted probability
This function is similar to the random.choice() variants in Python
Use the random-seed
RiskScape parameter to make the randomness reproducibly consistent
scale
Arguments: [input_value: Anything, scale_factor: Floating]
Returns: Anything
Scales the numeric input_value
by multiplying it by the scale_factor
argument. If the input_value
is a struct it will scale the numeric members of the struct and leave other members untouched.
mean
Arguments: [List[Nullable[Anything]]]
Returns: Nullable[Anything]
Aggregate function for calculating a mean value across a group, e.g. group(mean(damage), by: region)
. Can also be used in a normal expression to calculate the mean value of numeric items in a list.
count
Arguments: [List[Nullable[Anything]]]
Returns: Nullable[Anything]
Aggregate function for counting all non-null elements in a group. The exception to this is for boolean values where only those that are true are counted. Can also be used with a list in a normal expression.
sum
Arguments: [List[Nullable[Anything]]]
Returns: Nullable[Anything]
Aggregate function for calculating a sum of all non-null values in a group. Also works on lists of numbers in a normal expression.
median
Arguments: [List[Nullable[Anything]]]
Returns: Nullable[Anything]
Aggregate function for calculating the median value across a group, e.g. group(median(damage), by: region)
. Can also be used in a normal expression to calculate the median value of numeric items in a list.
mode
Arguments: [List[Nullable[Anything]]]
Returns: Nullable[Anything]
Aggregate function for calculating the mode (most observed value) across a group, e.g. group(mode(damage), by: region)
. Can also be used in a normal expression to calculate the mode from a list.
percentiles
Arguments: [items: List[Nullable[Anything]], percentiles: List[Integer]]
Returns: Nullable[Anything]
Aggregate function that returns the values at the desired percentiles across a group, e.g. group(percentiles(damage, percentiles: [50, 90]), by: region)
will return the 50th and 90th percentiles. Can also be used in a normal expression to return the percentiles of numeric items in a list. Uses the nearest-rank exclusive method.
percentile
Arguments: [items: List[Nullable[Anything]], percentile: Integer]
Returns: Nullable[Anything]
Aggregate function that returns the value at the desired percentile across a group, e.g. group(percentile(damage, percentile: 90), by: region)
will return the 90th percentile. Can also be used in a normal expression to return the percentile of numeric items in a list. Uses the nearest-rank exclusive method.
stddev
Arguments: [List[Nullable[Anything]]]
Returns: Nullable[Anything]
Aggregate function for calculating the standard deviation across a group, e.g. group(stddev(damage), by: region)
. Can also be used in a normal expression to calculate the median value of numeric items in a list.
create_continuous
Arguments: [x-values: List[Anything], apply-to: λ(x-value), apply-log-to-x: Bool]
Returns: ContinuousCurve(xvalues=[], returnType=Anything)
Creates a ‘continuous curve’ that will more efficiently evaluate a computationally expensive loss function for probabilistic modelling. Pass the curve result to apply_continuous()
where you would normally call your loss function, e.g. apply_continuous(curve, hazard_value)
.
This is useful when there are a large number of hazard intensity values to process, and they all fall into a similar range of values. Instead of executing the loss function for every single hazard intensity value, the function is executed at most once for each of the x-values
.
For example, create_continuous([0.1, 0.2, 0.3], x -> my_loss_function(exposure, x)
will only execute my_loss_function
at most three times, once each for 0.1, 0.2, 0.3. Any hazard intensities that fall between 0.1 and 0.3 will be interpolated based on the function’s return values.
Be careful that the x-values
you specify accurately reflect the range of hazard intensities you expect. The min or max x-values will be used if the hazard intensity falls outside this range.
apply_continuous
Arguments: [function: ContinuousCurve(returnType=Anything), x-value: Floating, y-value: Nullable[Floating]]
Returns: Floating
Apply an x-value to a pre-computed curve using interpolation. Used alongside create_continuous
to perform large probabilistic analysis with a computationally expensive loss function.
stack_continuous
Arguments: [List[Nullable[Anything]]]
Returns: Nullable[Anything]
Aggregate function for ‘stacking’ a set of continuous curves in to a single one. Can be used as an optimization for probabilistic modelling to cut down on the number of function calls - the function can be called once per hazard site (instead of once per exposure) by grouping all the exposures by site and then stacking their consequence curves using this function.
apply
Arguments: [function: Function(ƒ()=Anything), args...: Anything]
Returns: Anything
Call a function that is part of the expression scope (rather than by name), e.g. apply(function, x_value)
. Used for calling functions that have been created by another function, such as with mathematical modelling functions like curve fitting.
The first argument, function
is the function that you wish to call. This is not the identifier of a function from the your project, but a part of the expression scope, i.e. a member of a tuple. These are typically returned from some other function creating function. This function is just a generic way to call any function when it is part of your data.
Any extra arguments given to the apply function are taken to be arguments to the function apply
calls. These arguments must match the calling function’s types exactly.
fit_curve
Arguments: [x-value: Floating, y-value: Floating, fitters: Nullable[{}]]
Returns: {function=>Function(ƒ(Floating)=Floating), fit=>Text, score=>Floating}
Aggregate function for fitting a mathematical curve to a set of two dimensional data points (i.e. X, Y values). This function attempts to fit a curve to these points, picking the best-scoring curve from all curve types that have been registered.
The return value contains the details of the best-fitting curve, which includes: the curve ‘function’, the ‘fit’ ID (i.e. continuous
, linear
, powerlaw
, etc), and the r² ‘score’ for this curve against the original data points. Passing the returned function to the apply
function will sample the curve, i.e. determine the Y value for a given X value.
For example, use the expression fit_curve(x-value: loss, y-value: probability) as loss_curve
to fit a curve to a set of probabilistic losses. You can then use apply(loss_curve.function, threshold)
to determine the probability (Y value) of the given threshold
loss (X value) being reached.
The optional ‘fitters’ argument describes specific curves(s) that should be used. For example, using fit_curve(loss, probability, fitters: {'continuous'})
would only attempt to fit a continuous curve to the given data points. The default is to attempt to fit all possible curves.
Note that when selecting from multiple curves (the default), you can refer to the ‘fit’ ID in the return value to verify the best-fit that was actually chosen.
trapz
Arguments: [function: Function(ƒ()=Anything), a: Floating, b: Floating, intervals: Integer]
Returns: Floating
Estimates the area under the curve provided by function
between points a
and b
. Estimation is performed using the trapezoidal rule (https://en.wikipedia.org/wiki/Trapezoidal_rule)
The provided function should accept a single floating argument and also return a floating result.
Note that for average annual loss (AAL) calculations, it is simpler to use the aal_trapz
function.
aal_trapz
Arguments: [loss: Floating, ep: Floating]
Returns: Floating
Aggregate function for calculating an Average Annual Loss (AAL) for hazard-based probabilistic data using trapezoid integration
Aggregates a series of event loss data-points to calculate the AAL. The event loss data points are plotted as piecewise linear x,y coordinates, where x is the exceedance probability (EP) and y is the loss. The AAL is then the area under the loss/EP curve, which is determined using trapezoid integration.
This function produces a similar result to numpy.trapz(x=[0.0]+EPs, y=[max(losses)]+losses)
. The extra EP=0.0 data-point represents the area under the loss/EP curve beyond the maximum known loss (these losses can be inferred to be greater than or equal to the max loss).
Note that any null loss values are treated as zero. Probability values must fall between 0.0 and 1.0 and cannot be duplicated.
This function can also be used outside of aggregate ‘group’ steps by passing it the losses and exceedance probabilities as lists. This approach is more memory-efficient when calculating a large number of AAL calculations, such as a per-property AAL.