Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.activeviam.com/llms.txt

Use this file to discover all available pages before exploring further.

Session.query_mdx(mdx: str, /, *, context: Mapping[str, bool | int | float | str] = frozendict({}), explain: Literal[False] = False, keep_totals: bool = False, mode: Literal[‘pretty’] = ‘pretty’, **kwargs: Unpack[_QueryPrivateParameters]) → MdxQueryResult

Session.query_mdx(mdx: str, /, *, context: Mapping[str, bool | int | float | str] = frozendict({}), explain: Literal[False] = False, keep_totals: bool = False, mode: Literal[‘pretty’, ‘raw’] = ‘pretty’, **kwargs: Unpack[_QueryPrivateParameters]) → DataFrame

Session.query_mdx(mdx: str, /, *, context: Mapping[str, bool | int | float | str] = frozendict({}), explain: Literal[True], keep_totals: bool = False, mode: Literal[‘pretty’, ‘raw’] = ‘pretty’, **kwargs: Unpack[_QueryPrivateParameters]) → object

Execute an MDX query. In JupyterLab with atoti-jupyterlab installed, query results can be converted to interactive widgets with the Convert to Widget Below action available in the command palette or by right clicking on the representation of the returned Dataframe.
  • Parameters:
    • mdx The MDX SELECT query to execute. Regardless of the axes on which levels and measures appear in the MDX, the returned DataFrame will have all levels on rows and measures on columns.

      Example

      >>> from datetime import date
      >>> df = pd.DataFrame(
      ...     columns=["Country", "Date", "Price"],
      ...     data=[
      ...         ("China", date(2020, 3, 3), 410.0),
      ...         ("France", date(2020, 1, 1), 480.0),
      ...         ("France", date(2020, 2, 2), 500.0),
      ...         ("France", date(2020, 3, 3), 400.0),
      ...         ("India", date(2020, 1, 1), 360.0),
      ...         ("India", date(2020, 2, 2), 400.0),
      ...         ("UK", date(2020, 2, 2), 960.0),
      ...     ],
      ... )
      >>> table = session.read_pandas(
      ...     df,
      ...     keys={"Country", "Date"},
      ...     table_name="Prices",
      ... )
      >>> cube = session.create_cube(table)
      
      This MDX:
      >>> mdx = (
      ...     "SELECT"
      ...     "  NON EMPTY Hierarchize("
      ...     "    DrilldownLevel("
      ...     "      [Prices].[Country].[ALL].[AllMember]"
      ...     "    )"
      ...     "  ) ON ROWS,"
      ...     "  NON EMPTY Crossjoin("
      ...     "    [Measures].[Price.SUM],"
      ...     "    Hierarchize("
      ...     "      DrilldownLevel("
      ...     "        [Prices].[Date].[ALL].[AllMember]"
      ...     "      )"
      ...     "    )"
      ...     "  ) ON COLUMNS"
      ...     "  FROM [Prices]"
      ... )
      
      Returns this DataFrame:
      >>> session.query_mdx(mdx, keep_totals=True)
                         Price.SUM
      Date       Country
      Total               3,510.00
      2020-01-01            840.00
      2020-02-02          1,860.00
      2020-03-03            810.00
                 China      410.00
      2020-01-01 China
      2020-02-02 China
      2020-03-03 China      410.00
                 France   1,380.00
      2020-01-01 France     480.00
      2020-02-02 France     500.00
      2020-03-03 France     400.00
                 India      760.00
      2020-01-01 India      360.00
      2020-02-02 India      400.00
      2020-03-03 India
                 UK         960.00
      2020-01-01 UK
      2020-02-02 UK         960.00
      2020-03-03 UK
      
      But, if it was displayed into a pivot table, would look like this:
      CountryPrice.sum
      Total2020-01-012020-02-022020-03-03
      Total3,510.00840.001,860.00
      China410.00
      France1,380.00480.00500.00
      India760.00360.00400.00
      UK960.00960.00
    • context Context values to use when executing the query. See shared_context for some of the available context values.
    • explain – When True, execute the query but, instead of returning its result, return an explanation of how it was executed containing a summary, global timings, and the query plan and all its retrievals.
    • keep_totals – Whether the resulting DataFrame should contain, if they are present in the query result, the grand total and subtotals. Totals can be useful but they make the DataFrame harder to work with since its index will have some empty values.
    • mode The query mode.
      • "pretty" is best for queries returning small results.
      • "raw" is best for benchmarks or large exports:
        • A faster and more efficient endpoint reducing the data transfer from Java to Python will be used.
        • The Convert to Widget Below action provided by atoti-jupyterlab will not be available.