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.isin
create conditions expressing that a hierarchy or a level should be on one of the given members.atoti.stores.Stores.schema
andatoti.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 theATOTI_URL_PATTERN
environment variable have been moved to theatoti.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
andatoti.config.Auth0Authentication.role_mapping
do 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:
percentile
andvariance
functions have been renamedquantile
andvar
: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 renamedmean
with .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)
whereslicing
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)
wherewindow
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):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.