The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

0.4.3 (2020-09-01)


  • agg.sum_product() return a measure equal to the product and sum of two measures or fields.

  • The modulo % operation between measures (#48).

  • Support reading Parquet files from AWS S3 (#27).

  • store.Store.drop() remove rows from a store by specifying column names and values.

  • atoti widgets are snapshotted as SVG images in the notebook on save. These images will appear in HTML exports or in GitHub previews of the notebook.

  • Context menu actions for widgets of the atoti JupyterLab extension:

    • Undo and Redo (#71).

    • Convert to atoti Widget Below available in DataFrames returned by session.Session.query_mdx() and cube.Cube.query() to start an interactive exploration from the same MDX query (#49).

    • Open state editor to navigate to the notebook cell metadata editor (#104).


  • Java is no longer required in the pip installation since the atoti Python wheel now relies on jdk4py.

  • The Measure simulations and Source simulation editors have been redesigned. They now both have their dedicated page instead of being widgets embeddable in dashboards. The Measure simulations editor also issue more minimal updates to the underlying store (#70).

  • Upgraded from ActiveUI SDK 4.3.8 to 4.3.11 (#30, #59, #74, #79, #84, #87 and #110).

  • Upgraded from ActivePivot 5.9.1 to 5.9.2 (#98 and #99).

  • session.Session.query_mdx(), cube.Cube.query(), query.session.QuerySession.query_mdx(), and query.cube.QueryCube.query() return DataFrames displaying formatted values and providing a style attribute reflecting the potential styling properties of the corresponding cell set (#91).

  • The first MDX query ran by an atoti widget in JupyterLab is now executed in Python and its resulting cell set is outputted to the corresponding notebook cell. It allows to ensure that the data displayed by the widget reflects the expected state of the cube without having to block the IPython kernel in a fragile way.

  • Added ability to append rows in all scenarios of a store with store.Store.append().


  • The creation of calculated measures and the action to add a measure computing the difference between to table columns have been disabled in the JupyterLab widget extension to incentivize creating these measures in Python instead. These features are still available in the app (#21).


  • Issue with dates not correctly converted to Python datetime in store.Store.head() (#97).

  • Issue getting vector element with a measure containing long (#115).

  • Issue with aggregation function not preserved when creating a simulated measure (#121).

0.4.2 (2020-07-15)


  • Kafka streaming data source through store.Store.load_kafka().

  • session.Session.endpoint() decorator adds HTTP endpoints to the session from a Python callback.

  • array.sort() has a new ascending parameter. True by default, it allows to choose the sorting order.

  • scope.cumulative() has a new dense parameter. False by default, it allows to choose whether to include all of a level’s members in the cumulative aggregation, even those for which the underlying measure has no values.

  • Atoti+ now supports i18n. en-US is the only locale supported by default but additional locales can be made available by providing custom translation files. These can be configured with config.create_config() A good starting point for adding new locales is to use the template containing all the translatable items, which can be obtained by using session.Session.export_translations_template().

  • The Gauss error function math.erf() and its complementary math.erfc() (#92).


  • The name_attribute parameter used to select the displayed username when using an OpenID Connect can be configured.

  • The scope parameter used to select the requested scopes when using an OpenID Connect provider can be configured. The openid scope is always passed by default.


  • Missing images in the tutorial (#80).

  • Wrong results when using where() (#17).

  • Issue when reading pandas DataFrame with NaN (#77).

  • hierarchy.Hierarchy.isin() and level.Level.isin() can be used with more than 2 values (#93).

  • Issue with array types not displayed correctly in the stores schema.

  • Issue when joining a column of type int to a column of type long if the store is based on a parquet file (#76).

0.4.1 (2020-06-17)


  • New tutorial exploring the main basic features of atoti.

  • rank() returns a measure ranking the members of a given hierarchy based on the value of another measure.

  • array.prefix_sum() performs the prefix sum of array measures.

  • Hierarchies can have the same name if they are in different dimensions. To avoid conflicts, a hierarchy can be accessed via a tuple containing the dimension and the hierarchy: cube.hierarchies["Product", "Size"].


  • Bumped the minimal required version of JupyterLab to 2.1.

  • Upgraded from ActiveUI SDK 4.3.7 to 4.3.8.

  • Better messages for Java known errors (#43).

  • The Auth0 support in Atoti+ has been replaced by the more general OpenID Connect authentication protocol. The structure of the configuration can be seen in the configuration tutorial.


  • filter()’s measure parameter accepts any value that can be converted to a measure (#22).

  • filter() and where() support inequalities on dates as conditions.

  • Issue when loading data into a scenario with truncate set to True (#53).

  • Issue with agg.quantile() combined with scope.origin().

  • Issue when aggregating .VALUE measures using any of the functions (#52).

  • Type issue that sometimes happened when chaining operators such as array.quantile() and date_shift().

  • Blinking cell updates not appearing in pivot tables with real time queries.

0.4.0 (2020-05-25)




  • BREAKING: simulation.Priority. Directly pass numbers to rank simulation rules instead.

  • BREAKING: Cube.create_bucketing() has moved to Cube._setup_bucketing() and is not part of the public API anymore. It might change in future releases without notice.

  • BREAKING: config.create_config()’s properties parameter. max_memory can be passed directly as a named-parameter instead. The other properties have been removed.

  • BREAKING: pow(measure_a, measure_b) replaced by measure_a ** measure_b.


  • Inability to install atoti alongside Python > 3.7 when using Conda.

  • Issue with filter() not being aggregated correctly (#17, #28).

  • Metadata DBs created in atoti can be used in Atoti+ and reciprocally (#15).

  • Inability to create some measures or hierarchies after some partial joins (#4, #10).

  • Inability to load CSV folders from AWS S3 storage.

  • Slow read of files on AWS S3 when anonymous due to multiple timeouts in the credentials provider (#26).

  • Inability to use wildcards on fields types other than strings.

  • Inability to use numeric levels for measure simulations.

0.3.1 (2020-04-14)

First public release of atoti.