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.scope.siblings()
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 ActiveUI to 4.3.7. 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.