atoti.OriginScope#

class atoti.OriginScope#

Scope performing an aggregation at the given origin.

The input of the aggregation function will be evaluated at the given levels and the aggregation function will be applied “above” these intermediate aggregates.

Example

Using this scope with atoti.agg.mean() to average quantities summed by month:

>>> df = pd.DataFrame(
...     columns=["Year", "Month", "Day", "Quantity"],
...     data=[
...         (2019, 7, 1, 15),
...         (2019, 7, 2, 20),
...         (2019, 7, 3, 30),
...         (2019, 6, 1, 25),
...         (2019, 6, 2, 15),
...         (2018, 7, 1, 5),
...         (2018, 7, 2, 10),
...         (2018, 6, 1, 15),
...         (2018, 6, 2, 5),
...     ],
... )
>>> table = session.read_pandas(
...     df, table_name="Origin", default_values={"Year": 0, "Month": 0, "Day": 0}
... )
>>> cube = session.create_cube(table, mode="manual")
>>> h, l, m = cube.hierarchies, cube.levels, cube.measures
>>> h["Date"] = [table["Year"], table["Month"], table["Day"]]
>>> m["Quantity.SUM"] = tt.agg.sum(table["Quantity"])
>>> m["Average of monthly quantities"] = tt.agg.mean(
...     m["Quantity.SUM"], scope=tt.OriginScope(levels={l["Month"]})
... )

Average of monthly quantities will evaluate Quantity.SUM for each Month and average these values “above” this level:

>>> cube.query(
...     m["Quantity.SUM"],
...     m["Average of monthly quantities"],
...     levels=[l["Day"]],
...     include_totals=True,
... )
                Quantity.SUM Average of monthly quantities
Year  Month Day
Total                    140                         35.00
2018                      35                         17.50
      6                   20                         20.00
            1             15                         15.00
            2              5                          5.00
      7                   15                         15.00
            1              5                          5.00
            2             10                         10.00
2019                     105                         52.50
      6                   40                         40.00
            1             25                         25.00
            2             15                         15.00
      7                   65                         65.00
            1             15                         15.00
            2             20                         20.00
            3             30                         30.00

The aggregation function can be changed again to compute the max of these averages:

>>> m["Max average of monthly quantities"] = tt.agg.max(
...     m["Average of monthly quantities"],
...     scope=tt.OriginScope(levels={l["Year"]}),
... )
>>> cube.query(
...     m["Average of monthly quantities"],
...     m["Max average of monthly quantities"],
...     levels=[l["Year"]],
...     include_totals=True,
... )
      Average of monthly quantities Max average of monthly quantities
Year
Total                         35.00                             52.50
2018                          17.50                             17.50
2019                          52.50                             52.50
levels: Set[HasIdentifier[LevelIdentifier] | LevelIdentifier]#

The levels constituting the origin of the aggregation.