Поделиться через


series_rolling_fl()

Область применения: ✅Microsoft Fabric✅Azure Data Explorer

Функция series_rolling_fl() — это определяемая пользователем функция (UDF), которая применяет скользящую агрегирование в ряде. Она принимает таблицу, содержащую несколько рядов (динамический числовый массив) и применяется для каждой серии, скользящей функции агрегирования.

Необходимые компоненты

  • Подключаемый модуль Python должен быть включен в кластере. Это необходимо для встроенного Python, используемого в функции.
  • Подключаемый модуль Python должен быть включен в базе данных. Это необходимо для встроенного Python, используемого в функции.

Синтаксис

T | invoke series_rolling_fl(, y_series y_rolling_series, n, aggr, aggr_params center, )

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
y_series string ✔️ Имя столбца, содержащего ряд для соответствия.
y_rolling_series string ✔️ Имя столбца для хранения последовательной серии агрегирования.
n int ✔️ Ширина скользящего окна.
aggr string ✔️ Имя используемой функции агрегирования. См . функции агрегирования.
aggr_params string Необязательные параметры для функции агрегирования.
центр bool Указывает, применяется ли скользячее окно симметрично до и после текущей точки или применяется из текущей точки назад. По умолчанию центр предназначен falseдля вычисления потоковых данных.

Агрегатные функции

Эта функция поддерживает любую функцию агрегирования из numpy или scipy.stats , которая вычисляет скаляр из ряда. Следующий список не является исчерпывающим.

Определение функции

Вы можете определить функцию, внедрив код как определяемую запросом функцию или создав ее в качестве хранимой функции в базе данных следующим образом:

Определите функцию с помощью следующей инструкции let. Разрешения не требуются.

Внимание

Инструкция let не может выполняться самостоятельно. За ним следует оператор табличного выражения. Чтобы запустить рабочий пример, см. примерыseries_rolling_fl().

let series_rolling_fl = (tbl:(*), y_series:string, y_rolling_series:string, n:int, aggr:string, aggr_params:dynamic=dynamic([null]), center:bool=true)
{
    let kwargs = bag_pack('y_series', y_series, 'y_rolling_series', y_rolling_series, 'n', n, 'aggr', aggr, 'aggr_params', aggr_params, 'center', center);
    let code = ```if 1:
        y_series = kargs["y_series"]
        y_rolling_series = kargs["y_rolling_series"]
        n = kargs["n"]
        aggr = kargs["aggr"]
        aggr_params = kargs["aggr_params"]
        center = kargs["center"]
        result = df
        in_s = df[y_series]
        func = getattr(np, aggr, None)
        if not func:
            import scipy.stats
            func = getattr(scipy.stats, aggr)
        if func:
            result[y_rolling_series] = list(pd.Series(in_s[i]).rolling(n, center=center, min_periods=1).apply(func, args=tuple(aggr_params)).values for i in range(len(in_s)))
    ```;
    tbl
    | evaluate python(typeof(*), code, kwargs)
};
// Write your query to use the function here.

Примеры

В следующих примерах для запуска функции используется оператор вызова.

Вычисление скользящего медиана из 9 элементов

Чтобы использовать определяемую запросом функцию, вызовите ее после внедренного определения функции.

let series_rolling_fl = (tbl:(*), y_series:string, y_rolling_series:string, n:int, aggr:string, aggr_params:dynamic=dynamic([null]), center:bool=true)
{
    let kwargs = bag_pack('y_series', y_series, 'y_rolling_series', y_rolling_series, 'n', n, 'aggr', aggr, 'aggr_params', aggr_params, 'center', center);
    let code = ```if 1:
        y_series = kargs["y_series"]
        y_rolling_series = kargs["y_rolling_series"]
        n = kargs["n"]
        aggr = kargs["aggr"]
        aggr_params = kargs["aggr_params"]
        center = kargs["center"]
        result = df
        in_s = df[y_series]
        func = getattr(np, aggr, None)
        if not func:
            import scipy.stats
            func = getattr(scipy.stats, aggr)
        if func:
            result[y_rolling_series] = list(pd.Series(in_s[i]).rolling(n, center=center, min_periods=1).apply(func, args=tuple(aggr_params)).values for i in range(len(in_s)))
    ```;
    tbl
    | evaluate python(typeof(*), code, kwargs)
};
//
//  Calculate rolling median of 9 elements
//
demo_make_series1
| make-series num=count() on TimeStamp step 1h by OsVer
| extend rolling_med = dynamic(null)
| invoke series_rolling_fl('num', 'rolling_med', 9, 'median')
| render timechart

Выходные данные

Граф, изображающий скользящий медиан из 9 элементов.

Вычисление скользящей минимальной, максимальной и 75-й процентиль из 15 элементов

Чтобы использовать определяемую запросом функцию, вызовите ее после внедренного определения функции.

let series_rolling_fl = (tbl:(*), y_series:string, y_rolling_series:string, n:int, aggr:string, aggr_params:dynamic=dynamic([null]), center:bool=true)
{
    let kwargs = bag_pack('y_series', y_series, 'y_rolling_series', y_rolling_series, 'n', n, 'aggr', aggr, 'aggr_params', aggr_params, 'center', center);
    let code = ```if 1:
        y_series = kargs["y_series"]
        y_rolling_series = kargs["y_rolling_series"]
        n = kargs["n"]
        aggr = kargs["aggr"]
        aggr_params = kargs["aggr_params"]
        center = kargs["center"]
        result = df
        in_s = df[y_series]
        func = getattr(np, aggr, None)
        if not func:
            import scipy.stats
            func = getattr(scipy.stats, aggr)
        if func:
            result[y_rolling_series] = list(pd.Series(in_s[i]).rolling(n, center=center, min_periods=1).apply(func, args=tuple(aggr_params)).values for i in range(len(in_s)))
    ```;
    tbl
    | evaluate python(typeof(*), code, kwargs)
};
//
//  Calculate rolling min, max & 75th percentile of 15 elements
//
demo_make_series1
| make-series num=count() on TimeStamp step 1h by OsVer
| extend rolling_min = dynamic(null), rolling_max = dynamic(null), rolling_pct = dynamic(null)
| invoke series_rolling_fl('num', 'rolling_min', 15, 'min', dynamic([null]))
| invoke series_rolling_fl('num', 'rolling_max', 15, 'max', dynamic([null]))
| invoke series_rolling_fl('num', 'rolling_pct', 15, 'percentile', dynamic([75]))
| render timechart

Выходные данные

Диаграмма, изображающая скользящей минимальной, максимальной и 75-й процентиль из 15 элементов.

Вычисление среднего скользящего обрезки

Чтобы использовать определяемую запросом функцию, вызовите ее после внедренного определения функции.

let series_rolling_fl = (tbl:(*), y_series:string, y_rolling_series:string, n:int, aggr:string, aggr_params:dynamic=dynamic([null]), center:bool=true)
{
    let kwargs = bag_pack('y_series', y_series, 'y_rolling_series', y_rolling_series, 'n', n, 'aggr', aggr, 'aggr_params', aggr_params, 'center', center);
    let code = ```if 1:
        y_series = kargs["y_series"]
        y_rolling_series = kargs["y_rolling_series"]
        n = kargs["n"]
        aggr = kargs["aggr"]
        aggr_params = kargs["aggr_params"]
        center = kargs["center"]
        result = df
        in_s = df[y_series]
        func = getattr(np, aggr, None)
        if not func:
            import scipy.stats
            func = getattr(scipy.stats, aggr)
        if func:
            result[y_rolling_series] = list(pd.Series(in_s[i]).rolling(n, center=center, min_periods=1).apply(func, args=tuple(aggr_params)).values for i in range(len(in_s)))
    ```;
    tbl
    | evaluate python(typeof(*), code, kwargs)
};
range x from 1 to 100 step 1
| extend y=iff(x % 13 == 0, 2.0, iff(x % 23 == 0, -2.0, rand()))
| summarize x=make_list(x), y=make_list(y)
| extend yr = dynamic(null)
| invoke series_rolling_fl('y', 'yr', 7, 'tmean', pack_array(pack_array(-2, 2), pack_array(false, false))) //  trimmed mean: ignoring values outside [-2,2] inclusive
| render linechart

Выходные данные

Диаграмма, изображающая среднее скользящей обрезки.