在DolphinDB中如何在窗口内对一个字段排序取前几然后再对另一个字段做聚合计算?

有个计算问题请教一下,对于行情数据,有四列(代码,日期,close和volume),按照代码分组,按日期排序,想做一个窗口计算,假设窗口期为20,计算逻辑是在窗口期内按照volume排序,取volume最大的五条数据的close求平均。想问下这个计算在dolphindb中如何写比较高效?

请先 登录 后评论

2 个回答

Shena Mao

感谢提问,这个目前没有特别高效的算法,但是可以用moving + 自定义函数来实现。未来DolphinDB会针对这种场景做一些优化。

1.30.15及以上版本可以用一行代码实现:

//t是模拟的四列数据
t = table(take(`IBM, 100) as code, 2020.01.01 + 1..100 as date, rand(100,100) + 20 as volume, rand(10,100) + 100.0 as close)
//moving支持用户使用自定义匿名聚合函数(https://www.dolphindb.cn/cn/help/130/Functionalprogramming/AnonymousFunction.html)
select code, date, moving(defg(vol, close){return close[isort(vol, false).subarray(0:min(5,close.size()))].avg()}, (volume, close), 20) from t context by code

其他版本可以用自定义命名函数实现:

defg top_5_close(vol,close){
return close[isort(vol, false).subarray(0:min(5,close.size()))].avg()
}
select code, date, moving(top_5_close,(volume, close), 20) from t context by code 
请先 登录 后评论
sunle shen
t = table(take(`IBM, 10000) as code, 2020.01.01 + rand(100,10000) as date, rand(100,10000) + 20 as volume, rand(10,10000) + 100.0 as close)
t = select * from t order by date
select code, date, moving(defg(vol, close) {return sort(vol, false)[0:min(5,close.size())].avg()}, (volume, close), 20) from t context by code
请先 登录 后评论