apache/superset · error · InvalidPostProcessingError

Unsupported post processing operation: %(operation)s

Error message

Unsupported post processing operation: %(operation)s

What it means

InvalidPostProcessingError raised in QueryObject.get_post_processing_df (query_object.py:548) when the operation string in a post_processing entry does not match any attribute of superset.common.utils.pandas_postprocessing. Superset dispatches post-processing via getattr(pandas_postprocessing, operation), so unknown operation names (typos, renamed functions, plugin-specific ops) are rejected before execution.

Source

Thrown at superset/common/query_object.py:548

        """
        Perform post processing operations on DataFrame.

        :param df: DataFrame returned from database model.
        :return: new DataFrame to which all post processing operations have been
                 applied
        :raises QueryObjectValidationError: If the post processing operation
                 is incorrect
        """
        logger.debug("post_processing: \n %s", pformat(self.post_processing))
        with event_logger.log_context(f"{self.__class__.__name__}.post_processing"):
            for post_process in self.post_processing:
                operation = post_process.get("operation")
                if not operation:
                    raise InvalidPostProcessingError(
                        _("`operation` property of post processing object undefined")
                    )
                if not hasattr(pandas_postprocessing, operation):
                    raise InvalidPostProcessingError(
                        _(
                            "Unsupported post processing operation: %(operation)s",
                            type=operation,
                        )
                    )
                options = post_process.get("options", {})
                df = getattr(pandas_postprocessing, operation)(df, **options)
            return df

View on GitHub (pinned to f4587218dd)

Solutions

  1. Check superset/common/utils/pandas_postprocessing.py (or dir(pandas_postprocessing)) in your Superset version for the exact allowed operation names and correct the payload.
  2. Fix typos: common valid operations include pivot, aggregate, rolling, diff, rank, cum, contribution, geographical, boxplot.
  3. After a Superset upgrade, re-open and re-save affected charts in Explore so post_processing is normalized to the current schema.

Example fix

// before
"post_processing": [
  { "operation": "pivt", "options": { ... } }
]

// after
"post_processing": [
  { "operation": "pivot", "options": { ... } }
]
Defensive patterns

Strategy: validation

Validate before calling

from superset.common.utils import pandas_postprocessing

ALLOWED = {
    name for name in dir(pandas_postprocessing)
    if not name.startswith("_") and callable(getattr(pandas_postprocessing, name))
}

def validate_operations(steps: list[dict]) -> None:
    for step in steps or []:
        if step.get("operation") not in ALLOWED:
            raise ValueError(f"unsupported operation: {step.get('operation')!r}; allowed: {sorted(ALLOWED)}")

Type guard

def is_supported_operation(step: dict) -> bool:
    from superset.common.utils import pandas_postprocessing
    op = step.get("operation")
    return isinstance(op, str) and hasattr(pandas_postprocessing, op)

Try / catch

from superset.exceptions import InvalidPostProcessingError

try:
    df = query_object.get_post_processing_df(df)
except InvalidPostProcessingError as ex:
    if "Unsupported post processing operation" in str(ex):
        # drop or map the unknown op, then retry
        query_object.post_processing = [s for s in query_object.post_processing if is_supported_operation(s)]
        df = query_object.get_post_processing_df(df)
    else:
        raise

Prevention

When it happens

Trigger: A post_processing entry whose operation is e.g. "pivt", "timeseries", or any name not defined in pandas_postprocessing.py. Happens after Superset upgrades that rename/remove post-processing ops, or when a payload was written against a fork/plugin that supports extra operations.

Common situations: Typos in hand-written API payloads; chart definitions persisted from an older Superset version referencing an operation that was renamed (e.g. legacy 'concat' variants); custom forks adding operations that upstream rejects.

Related errors


AI-assisted analysis of apache/superset@f4587218dd (2026-08-14). Data as JSON: /api/errors/dab33e73c235c682. Report an issue: GitHub.