如何在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
相关产品推荐
相关产品推荐

