You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在KDB/q中实现剔除极值的10期移动平均列?

KDB实现10期修剪移动平均方案

假设你的scores_table表已经按datetime字段排序(时间序列数据必须保证有序,否则滑动窗口逻辑会出错),可以通过以下步骤实现需求:

步骤1:定义窗口处理函数

先写一个处理单个滑动窗口的函数,完成「剔高低值→求平均」的逻辑:

trimmedAvg: {[window]
    // 窗口元素不足10个时返回空值
    if[count window < 10; :0N];
    // 对窗口内的score排序
    sortedScores: asc window;
    // 剔除最小2个、最大2个,取中间6个值
    keptScores: sortedScores[2:-2];
    // 计算平均值
    avg keptScores
}

步骤2:应用滑动窗口到表中

用KDB内置的moving函数,将上述函数应用到score列的10期滑动窗口上,新增列存储结果:

// 更新表,新增trimmed_ma列
scores_table: update trimmed_ma: moving[trimmedAvg; 10; score] from scores_table

简化写法(内联函数)

如果不想单独定义函数,也可以直接用内联函数完成:

scores_table: update trimmed_ma: moving[{if[count x<10;:0N]; avg asc x[2:-2]}; 10; score] from scores_table

关键逻辑说明

  • moving[f; n; col]:对col字段生成大小为n的滑动窗口,每个窗口传入函数f处理
  • asc x:对窗口内的score值升序排序
  • x[2:-2]:利用KDB的索引切片,去掉排序后前2个(最小)和后2个(最大)元素,保留中间6个
  • avg:计算剩余元素的算术平均值
  • 窗口元素不足10个时返回0N(空值),避免无效计算

内容的提问来源于stack exchange,提问作者David Moss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:36:01