What’s new in atoti version 0.7.0?

As always, we’re working hard to deliver a great product. Check out our breaking updates in this latest release.

On Tuesday, August 16, we released version 0.7.0 of atoti! If you have not had a chance to read about the changes in our changelog, we’ll go through a select subset of changes here. For a complete list of changes, please visit our changelog.

Breaking Changes

If you’re using atoti.scope.cumulative(), you’ll want to pay attention to this.

We’ve updated the behavior of atoti.scope.cumulative()’s time window parameter to align with Pandas and Excel’s treatment of a time window.

Note: Scope factory functions are also changing, and thus the below scope argument could be re-written as well. We cover this example briefly in the section further below. Read about this and other deprecated functions under the ‘Deprecated’ header of our changelog.


m["Cumulative datetime"] = tt.agg.sum(
    scope=tt.scope.cumulative(l["date"], window=("-1D", None)),

would sum the data starting from one day ago, up to and including today. Thus it would include two data points.

screenshot of aggregation logic using prior version

Now, to get the same interval of time, update the window to “-2D”.

m["Cumulative datetime"] = tt.agg.sum(
    scope=tt.scope.cumulative(l["datetime"], window=("-2D", None)),

This results in the following aggregation:

screenshot of aggregation logic using version 0.7.0

Breaking Removals

We’ve talked about several deprecated functions previously. Having deprecated them in previous releases, we’re discontinuing their usage. If you didn’t have a moment to update when they were originally deprecated, you will want to update them before upgrading to version 0.7.0.

You can find a full list of removals in our changelog. A few examples of the breaking removal changes include:


We’ve cleaned up how we instantiate an atoti session in the 0.6.5 release, streamlining to atoti.Session(). In this latest release of 0.7.0, we have dropped atoti.create_session().


Previously, we could set the order for our levels by setting the comparator to atoti.comparator.ASCENDING, atoti.comparator.DESCENDING, or atoti.comparator.first_members() (for custom ordering). Now, use atoti.NaturalOrder in the place of atoti.comparator.ASCENDING or atoti.comparator.DESCENDING.

And use atoti.CustomOrder in place of atoti.comparator.first_members().

Deprecated Functions

As we mentioned earlier, Scope factory functions are changing. Read about this update and others under the ‘Deprecated’ header of our changelog.

For example, in our earlier example we rewrote our new measure as:

m["Cumulative datetime"] = tt.agg.sum(
    scope=tt.scope.cumulative(l["date"], window=("-2D", None)),

We can replace atoti.scope.cumulative() with atoti.CumulativeScope(). For atoti.CumulativeScope(), we set our window using “P-2D” notation to indicate the period of the prior two days, aligning with the format Java’s period.parse() method would use.


Thank you for reading. As always, we’re constantly improving atoti. This was a highlight of some of the changes in our latest release latest release, 0.7.0. Have an idea or a question? Join the conversation on GitHub. For a complete list of changes, please visit our changelog.

Latest posts

Understanding Logs in Atoti
From the default log to how to configure additional logging Application logs are extremely important in any system! Most commonly, they are used to troubleshoot any issue that users may encounter while using an application. For instance, developers use them for debugging and the production support crew uses them to investigate outages. Not just that, in production, they are used to monitor an application’s performance and health. For instance, monitoring tools can pick up certain keywords to identify events such as “server down” or “system out of memory”. It can also serve as an audit trail to track user activity...
Atoti: Working with dates in Python
What is the most problematic data type you have ever dealt with when working with data? I would say dates! Depending on the locale, dates come in different formats such as YYYY-mm-dd, d/m/YYYY, d-mmm-yy etc. Not to mention, sometimes it comes with timestamps and time zones! We can let programs infer the date format or explicitly cast the data to date with a specific format e.g. in Python with Pandas DataFrame: What if we open the CSV file in Microsoft Excel, update it, and try to read it again? The above code snippet will throw out exceptions such as this:...
Understanding conditional statements in Atoti
When do we use filter, where and switch statements? We know that we can perform aggregations and multi-dimensional analysis with Atoti. Aggregation is not always as simple as 1 + 2. Sometimes we end up in an “if…else” situation, and that is where conditional statements come in. Let’s explore some examples with the XVA use case from the Atoti CE Notebook Gallery. Some definitions before moving on: Measures – we refer to metrics or quantifiable data that measure certain aspects of our goals. In the code snippets below, they are represented by measure[<name of metrics>]. Members of a level –...

Join our Community

    Like this post ? Please share

    Follow Us

    atoti Free Community Edition is developed and brought to you by ActiveViam. Learn more about ActiveViam at activeviam.com.