Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: ✅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 , которая вычисляет скаляр из ряда. Следующий список не является исчерпывающим.
sum
mean
min
max
ptp (max-min)
percentile
median
std
var
gmean
(геометрическое среднее)hmean
(гармоническое среднее)mode
(наиболее распространенное значение)moment
(nth момент)tmean
(усеченное среднее)tmin
tmax
tstd
iqr
(межквантильный диапазон)
Определение функции
Вы можете определить функцию, внедрив код как определяемую запросом функцию или создав ее в качестве хранимой функции в базе данных следующим образом:
Определите функцию с помощью следующей инструкции 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
Выходные данные
Вычисление скользящей минимальной, максимальной и 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
Выходные данные
Вычисление среднего скользящего обрезки
Чтобы использовать определяемую запросом функцию, вызовите ее после внедренного определения функции.
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
Выходные данные