Dataseries
A dataseries is a named set of values — revenue, headcount, a closing balance — spread across the dimensions you connect it to. Some you fill in; the rest are computed by a formula from the ones you did.
In a spreadsheet, a number's identity is its address. Sheet2!D14 is the only name it has, and every formula that uses it is really a statement about geography — which is why inserting a row can quietly change what a model means.
In Axmo a number belongs to a named dataseries and a coordinate. Revenue for Italy in March is exactly that: the Revenue series, at the coordinate Italy × March. Nothing about it depends on where it happens to be printed.
What a dataseries is
A dataseries is a named set of values spread across the dimensions it is connected to. You choose those connections when you create it: a series can be connected to none of the model's dimensions, one, or all of them.
- Headcount connected to Country and Month is a value for every country in every month.
- Corporation tax rate connected to nothing at all is a single figure the whole model can refer to.
Series are usually described as a cube — one per series, with its dimensions as the edges — and that picture is accurate, but the simpler one is just as true: a series is a name, and under that name a value at each coordinate.
Two kinds, and only two
Input series hold values you supply — typed on the worksheet, or read from a range Axmo is pointed at. An input series has no formula, and the model will not let you attach one.
Calculated series hold values produced by a formula that refers to other series. You cannot type over a calculated value, and the model will not let you try.
There is no third kind, and the strictness is the point. A cell you can both compute and overtype is where spreadsheet models quietly go wrong: the override survives, the formula that explained it does not, and six months later nobody can tell which numbers were reasoned and which were pasted. Here, every value either came from outside the model or is explained by a formula you can read.
A formula is written once
You write the relationship, not the arithmetic for each cell:
Profit = Revenue - Total Cost That is the whole definition. It is evaluated at every coordinate the series covers — Italy in March, Germany in April, and so on — and at each one, Revenue and Total Cost are read at the same coordinate as the Profit being computed. Add a country next year and the formula does not change. Add a whole dimension and it still does not change.
Where you need a different coordinate, you say so. Revenue[2026] is revenue for a fixed year; Balance[Month[-1]] is the balance one month back. This is what makes a roll-forward writable as a single line — see Recurrence.
Every name is checked before anything runs
Series, dimensions, layers, elements, functions — every name a formula mentions must exist when the model compiles. A misspelled series name is a hard error that names what it could not find and lists what is available. It is never a warning, and never silently treated as empty.
This is deliberate, and it is the opposite of what a spreadsheet does with a reference that has stopped meaning anything. The cost is that you cannot write a formula against a series you have not created yet. The benefit is that a model which compiles has no dangling references anywhere in it.
Empty, not in range, and errors
A cell holds one of four kinds of value, and telling them apart is what stops a model quietly answering a question it could not answer.
A value is a number somebody typed, a data source supplied, or a formula calculated. A zero is a value like any other, if that is what was supplied or worked out.
Empty means the cell exists and nothing was ever put in it. In a sum, an empty cell gives way: Revenue + OtherRevenue gives you Revenue where the other series holds
nothing, and you do not have to guard against it. In a product it does not: Revenue * Price stays empty where
Price is empty, because there is nothing to multiply. Dividing by an empty cell is an error, as dividing by zero
is. Functions and comparisons read an empty cell as zero. But empty is not a zero: ISEMPTY tells them apart, AVG skips an
empty cell rather than averaging it in, and counting a series counts its figures, not its coordinates.
Not in range means there is no such cell — the month before your model starts, or a child of an element that has none. It behaves like an empty cell, which is what lets a roll-forward be written as one line and still work in the first period: last period's balance gives way in the sum. Nothing is ever counted there, because there is nothing there to count.
An error means no answer could be produced: a division by zero or by an empty cell, a number too large to
represent, or a value supplied that the model cannot hold — text where a number belongs. An error is not an empty cell and
it is not a zero. It shows as an error in the cell, and it spreads: anything calculated from it is an error
too, however far along. Where you want a fallback instead, IFERROR(expression, 0) supplies one, as
Nz(expression, 0) does for a cell that is merely empty.
Keeping these apart is the point. A zero is an answer. The others each say something different about why there is no number, and the model says which rather than guessing.
Each series chooses its own totals
Every series connected to a dimension carries its own rule for combining values up that dimension's tree — and a series in three dimensions carries three independent rules.
Sum, average, weighted average, first, last, minimum, maximum, or a formula evaluated at each total rather than derived from the children. A series can also decline to total on a dimension at all.
Two examples over the same Time dimension, in one model:
- Revenue sums. A year is its twelve months added up.
- Closing balance takes the last. A year's closing balance is December's, and summing twelve of them would be meaningless.
For ratios, the formula option is usually what you want. A margin of Profit / Revenue re-evaluated at the quarter — using the quarter's own already-totalled profit and revenue — gives the correct quarterly margin. Adding up three monthly margins would not.
Actuals and forecast are not two models
The familiar spreadsheet answer is a second set of tabs, or a second workbook. In Axmo it is an ordinary categorical dimension — call it Version, with elements Actual, Forecast and Budget — connected to the series that need it.
One model, one set of formulas, evaluated for each version. Comparing plan against fact becomes an ordinary formula over that dimension rather than a reconciliation exercise between two files.
Next
Dimensions covers the structure a series is spread over. Recurrence covers the case where a series refers to its own earlier values. Dataseries expressions covers how to write the formula of a calculated series — references, filters, arithmetic, aggregation, conditions and missing values. Supported functions covers every function available in a formula — logical, arithmetic, aggregation, financial and dimension navigation.