code: def analytic(input_type, output_type):
          
          return udf._grouped(
              input_type,
              output_type,
              base_class=ops.AnalyticOp,
              output_type_method=operator.attrgetter('column_type'),
          )
docs: Define an *analytic* user-defined function that takes N
          pandas Series or scalar values as inputs and produces N rows of output.
  
          Parameters
          ----------
          input_type : List[ibis.expr.datatypes.DataType]
              A list of the types found in :mod:`~ibis.expr.datatypes`. The
              length of this list must match the number of arguments to the
              function. Variadic arguments are not yet supported.
          output_type : ibis.expr.datatypes.DataType
              The return type of the function.
  
          Examples
          --------
          >>> import ibis
          >>> import ibis.expr.datatypes as dt
          >>> from ibis.pandas.udf import udf
          >>> @udf.analytic(input_type=[dt.double], output_type=dt.double)
          ... def zscore(series):  # note the use of aggregate functions
          ...     return (series - series.mean()) / series.std()