0.4.0 (May 25, 2020)#
Added#
atoti.agg.max_member()andatoti.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(), andatoti_query.QueryLevel.isincreate conditions expressing that a hierarchy or a level should be on one of the given members.atoti.stores.Stores.schemaandatoti.Cube.schemaSVG 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_storecreates 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 theATOTI_URL_PATTERNenvironment variable have been moved to theatoti.config.SessionConfigurationchanging 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.rolesandatoti.config.Auth0Authentication.role_mappingdo not accept role instances anymore, only role names.BREAKING: The wildcard value in measure simulations has been changed from
*toNone.BREAKING:
atoti.Session.read_pandas(),atoti.Session.read_spark()andatoti.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)andatoti.store.Store.insert_rows(rows)have been renamedatoti.simulation.Scenario.append()andatoti.store.Store.append. They take a variadic rows parameter and in place addition of a single row is still supported with+=.BREAKING:
percentileandvariancefunctions have been renamedquantileandvar: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:
avghas been renamedmeanwith .MEAN suffix for automatically created measures instead of .AVG:atoti.agg.avg(measure, scope=None)→atoti.agg.mean()and(measure, *, scope=None)atoti.array.avg()→atoti.array.mean()
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)whereslicinghas 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)wherewindowcan 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):atoti.agg.single_value()atoti.Cube.setup_simulation()atoti.open_query_session()atoti_query.QuerySession.query_mdx()atoti.scope.siblings()atoti.Session.explain_mdx_query()atoti.simulation.Simulation.load_csv()atoti.store.Store.join()atoti.store.Store.load_csv()atoti.store.Store.load_pandas()atoti.store.Store.load_parquet()atoti.store.Store.load_spark()
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(), andatoti.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 toCube._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 bymeasure_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.