0.4.0 (May 25, 2020)#

Added#

  • atoti.agg.max_member() and atoti.agg.min_member() return a measure equal to the member reaching the corresponding maxima/minima of the passed measure on the given level.

  • atoti.Hierarchy.isin(), atoti_query.QueryHierarchy.isin, atoti.Level.isin(), and atoti_query.QueryLevel.isin create conditions expressing that a hierarchy or a level should be on one of the given members.

  • atoti.stores.Stores.schema and atoti.Cube.schema SVG graphs of, respectively, all the session’s stores and the stores used by a cube.

  • Python package installation guide.

  • atoti.store.StoreScenarios.load_csv() loads a directory of CSV files into a store, automatically generating scenarios based on the directory’s structure.

  • atoti.total() returns the total value on each hierarchy member.

  • atoti.Session.create_store creates an empty store from a schema.

  • Exponentiation operation between measures: measure_a ** measure_b.

Changed#

  • BREAKING: Hierarchies, levels, and measures can no longer be passed by name, instances of the corresponding class are expected instead.

  • BREAKING: atoti.create_session()’s port, max_memory, java_args and sampling_mode parameters and the ATOTI_URL_PATTERN environment variable have been moved to the atoti.config.SessionConfiguration changing these signatures:

    • atoti.create_session(): (name='Unnamed', sampling_mode=SamplingMode(name='limit_lines', parameters=[10000]), port=None, max_memory=None, java_args=None, config=None, **kwargs)(name='Unnamed', *, config=None)

    • atoti.config.create_config(): (inherit=True, metadata_db=None, roles=None, authentication=None, properties=None)(*, inherit=True, port=None, url_pattern=None, metadata_db=None, roles=None, authentication=None, sampling_mode=None, max_memory=None, java_args=None)

  • BREAKING: New structure for the authentication configuration in YAML as shown in atoti.config.create_config().

  • BREAKING: atoti.config.BasicUser.roles and atoti.config.Auth0Authentication.role_mapping do not accept role instances anymore, only role names.

  • BREAKING: The wildcard value in measure simulations has been changed from * to None.

  • BREAKING: atoti.Session.read_pandas(), atoti.Session.read_spark() and atoti.Session.read_numpy() require a name for the created store:

    • atoti.Session.read_numpy(): (data, columns, store_name, keys, in_all_scenarios=True, partitioning=None, sep='|')(array, columns, store_name, *, keys=None, in_all_scenarios=True, partitioning=None, **kwargs)

    • atoti.Session.read_pandas(): (dataframe, keys=None, store_name=None, partitioning=None, types=None, **kwargs)(dataframe, store_name, *, keys=None, in_all_scenarios=True, partitioning=None, types=None, **kwargs)

    • atoti.Session.read_spark(): (dataframe, keys=None, store_name=None, partitioning=None)(dataframe, store_name, *, keys=None, in_all_scenarios=True, partitioning=None)

  • BREAKING: atoti.simulation.Scenario.insert(row) and atoti.store.Store.insert_rows(rows) have been renamed atoti.simulation.Scenario.append() and atoti.store.Store.append. They take a variadic rows parameter and in place addition of a single row is still supported with +=.

  • BREAKING: percentile and variance functions have been renamed quantile and var:

    • atoti.agg.percentile(measure, percentile_value, mode='inc', interpolation='linear', scope=None)atoti.agg.quantile() and (measure, q, *, mode='inc', interpolation='linear', scope=None)

    • atoti.array.percentile(measure, percentile_value, mode='inc', interpolation='linear')atoti.array.quantile() and (measure, q, *, mode='inc', interpolation='linear')

    • atoti.agg.variance(measure, mode='sample', scope=None)atoti.agg.var() and (measure, *, mode='sample', scope=None)

    • atoti.array.variance(measure, mode='sample')atoti.array.var() and (measure, *, mode='sample')

  • BREAKING: avg has been renamed mean with .MEAN suffix for automatically created measures instead of .AVG:

  • BREAKING: Some function signatures have changed:

    • cube.Cube.create_static_parameter_hierarchy: (level_and_hierarchy_name, members, indices=None, slicing=True, index_measure='', level_type=None)(name, members, *, data_type=None, index_measure=None, indices=None, store_name=None) where slicing has been removed since it can be set afterwards through: atoti.Hierarchy.slicing.

    • atoti.parent_value(): (measure, on_hierarchies=None, top_value=None)(measure, on, *, apply_filters=False, degree=1, total_value=None). The two new parameters default to values equivalent to the previous behavior; see the function documentation for more details.

    • atoti.scope.cumulative(): (level, partitioning=None, window=range(-2147483648, 0), exclude_self=False)(level, *, partitioning=None, window=range(-2147483648, 0), exclude_self=False) where window can also accept a tuple of two time offsets to perform a rolling time period aggregation.

    • atoti.simulation.Scenario.load_csv(): (file, delimiter=',')(path, *, sep=',')

  • BREAKING: Some other function signatures have changed only to adopt keyword-only parameters (denoted by a * in the parameter list):

  • Upgraded Atoti UI to 4.3.7 <https://docs.activeviam.com/products/atoti/ui/4.3/user/what-is-new.html#437>`__. Pivot tables support new Tree, Pivot, and Table layouts, the latter making the Tabular View widget redundant so it has been removed from the available widgets.

  • atoti.Session.read_pandas(), atoti.store.Store.load_pandas(), atoti.simulation.Simulation.load_pandas(), and atoti.simulation.Scenario.load_pandas() automatically load columns made of numerical Python lists or Numpy one-dimensional ndarrays as arrays.

  • Stores without key columns are partitioned on their non-numerical columns by default.

  • Changed the behavior of atoti.agg.single_value() aggregation function to be more consistent with other aggregation functions (issue #40).

  • Cube names are not restricted to alphanumeric strings without spaces anymore.

  • The path parameter of all CSV loading functions accepts glob patterns (e.g. /path/**/*.csv).

Removed#

  • BREAKING: atoti.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: atoti.config.create_config()’s properties parameter. max_memory can be passed directly as a named-parameter instead. The other properties have been removed.

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

Fixed#

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

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

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

  • Inability to create some measures or hierarchies after some partial joins (issue #4, issue #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 (issue #26).

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

  • Inability to use numeric levels for measure simulations.