使用 DolphinDB TopN 函数探索高效的Alpha因子
DolphinDB 已经有非常多的窗口计算函数,例如 m 系列的滑动窗口计算,cum 系列累计窗口计算,tm 系列的的时间窗口滑动计算。但是所有这类函数都是对窗口内的所有记录进行指标计算,难免包含很多噪音。
DolphinDB 的金融领域用户反馈,通过交易量信息等对窗口内的记录进行过滤,得到的计算指标具有更高的质量,以此为基础的交易策略能带来更多的 Alpha。同时用户也反馈,通过自定义函数来计算按额外信息过滤后的指标,消耗的时间过长。
为此,DolphinDB 推出了 TopN 系列内置函数,涵盖 mTopN 系列、tmTopN 系列、cumTopN 系列,通过增量计算,大幅提升性能。DolphinDB 2.00.10 及 1.30.22 版本均支持本教程中涉及的功能。
本教程将从以下几个角度介绍 TopN 系列函数:
1. TopN 系列函数能解决的问题、计算规则及实现
1.1 TopN 系列函数解决的痛点问题
在分组计算中,常常不需要对分组中的所有数据做计算,有时只需要对组中 topn 个元素做计算即可。举个例子,如想要统计每天每只股票 Volume 值小于第一四分位数的平均 Volume 值,是不可以用 percentile 函数直接求值的,因为 sql 语句是先整体进行条件过滤再分组计算,因此无法将每个分组的 top 元素取出。
假设存在表 tb 是两支股票的数据表,要按照股票和日期分组后用 percentile 筛选,统计每天每只股票因子位于前40%的 value 的平均值。
trade_date=sort(take(2017.01.11..2017.01.12,20))
secu_code=take(`600570`600000,20)
value=1..20
tb=table(trade_date,secu_code,value)
常规的做法编写自定义聚合函数来实现:
defg percentile_40(x){ret = NULLy = percentile(x,40)cc = sum(x<y) if (cc > 0){ret = sum(iif( x<y,x,0))\cc}return ret
}
select percentile_40(value) as factor_value from tb group by trade_date,secu_code#output
trade_date secu_code factor_value
---------- --------- ------------
2017.01.11 600000 3
2017.01.11 600570 2
2017.01.12 600000 13
2017.01.12 600570 12
针对类似的情况,DolphinDB 推出了 topN 系列函数来解决这样的问题。topN 函数能够使得数据按照某个指标进行排序,并取排序后前 top 个元素或者前多少百分比的元素进行计算,能够显著提升脚本的可读性。
select aggrTopN(avg, funcArgs=value, sortingCol=value, top=0.4, ascending=true) as factor_value from tb group by trade_date,secu_code#output
trade_date secu_code factor_value
---------- --------- ------------
2017.01.11 600000 3
2017.01.11 600570 2
2017.01.12 600000 13
2017.01.12 600570 12
除了聚合函数 aggrTopN 之外,DolphinDB 还推出了 mTopN,cumTopN,tmTopN。对于 topN 的排序列,我们通常会将涨跌幅、交易量等指标作为排序键。在接下来的第2、3章中,将会具体举例 mTopN,cumTopN,tmTopN 的应用场景。
1.2 TopN 系列函数的计算规则及实现
TopN 系列函数基本上可以归纳为以下几种类型:mfuncTopN、tmfuncTopN 以及 cumfuncTopN。此外,还有与之对应的高阶函数 aggrTopN。
以 mfuncTopN(X, S, window, top, [ascending=true], [tiesMethod]) 为例,其计算过程为:
- 将 X 根据 S 进行稳定排序(排序方式由 ascending 指定,默认 true 为升序)
- 取排序结果的前 top 个元素进行计算。如果有多个具有相同值的元素无法全部进入前 top,可通过 tiesMethod 参数设置对这些值的选取规则。简单的说,tiesMethod 为 latest 时,优先选取最新的数据,为 oldest 时,优先选取最老的数据,为 all 时,选取全部数据。具体的用法规则可参考 TopN 的用户手册 (TopN 系列 — DolphinDB 2.0 documentation )。
目前支持 TopN 的计算函数共有36个:
| 基础函数 | mTopN 系列 | tmTopN系列 | cumTopN系列 |
|---|---|---|---|
| sum | msumTopN | tmsumTopN | cumsumTopN |
| avg | mavgTopN | tmavgTopN | cumavgTopN |
| std | mstdTopN | tmstdTopN | cumstdTopN |
| stdp | mstdpTopN | tmstdpTopN | cumstdpTopN |
| var | mvarTopN | tmvarTopN | cumvarTopN |
| varp | mvarpTopN | tmvarpTopN | cumvarpTopN |
| skew | mskewTopN | tmskewTopN | cumskewTopN |
| kurtosis | mkurtosisTopN | tmkurtosisTopN | cumkurtosisTopN |
| beta | mbetaTopN | tmbetaTopN | cumbetaTopN |
| corr | mcorrTopN | tmcorrTopN | cumcorrTopN |
| covar | mcovarTopN | tmcovarTopN | cumcovarTopN |
| wsum | mwsumTopN | tmwsumTopN | cumwsumTopN |
滑动窗口的 TopN 计算的场景很多,比如计算每只股票窗口内交易量最大的3条记录的平均价格,亦或是计算每种仪器的窗口内温度最高的5条记录的平均能耗等。具体的应用场景会在本教程的第二章 mTopN 、tmTopN 系列的应用场景中介绍。
累计窗口的 TopN 计算更多的涉及比如计算每只股票历史涨幅最大的几天的成交量之和等。具体的应用场景会在本教程的第三章 cumTopN 系列的应用场景。
除此之外,如果用户想要自定义取出 TopN 之后的计算规则,DolphinDB 也开放了 aggrTopN 函数,用户可以在此函数搭配其他高阶函数如 moving, tmoving 等,实现自己的 mfuncTopN 函数。这一部分的场景和应用会在第四章自定义 TopN 的实现方法中展开。
最后,TopN 系列函数都支持了批流一体,在第五章 TopN 的批流一体场景,会介绍如何将批计算中的 TopN 系列因子运用到实时计算流引擎中。
2. mTopN 、tmTopN 系列的应用场景
滑动窗口的 TopN 计算,是基于窗口内的记录,通过先排序,取 TopN,再做聚合计算。本章节通过一些实际场景中会用到的例子加以说明。
本章节会用到的数据由以下脚本模拟:
n = 5*121
timeVector = 2023.04.30T09:30:00.000 + 0..120 * 60000
tradingTime = take(timeVector,n)
windCode = stretch(format(600001..600005, "000000") + ".SH", n)
open = (20.00+0.01*0..120) join (30.00-0.01*0..120) join (40.00+0.01*0..120) join (50.00-0.01*0..120) join (60.00+0.01*0..120)
high = (20.50+0.01*0..120) join (31.00-0.01*0..120) join (40.80+0.01*0..120) join (50.90-0.01*0..120) join (60.70+0.01*0..120)
low = (19.50+0.01*0..120) join (29.00-0.01*0..120) join (39.00+0.01*0..120) join (48.00-0.01*0..120) join (59.00+0.01*0..120)
close = (20.00+0.01*0..120) join (30.00-0.01*0..120) join (40.00+0.01*0..120) join (50.00-0.01*0..120) join (60.00+0.01*0..120)
volume= 10000+ take(-100..100,n)
t = table(tradingTime, windCode, open, high, low, close, volume)
2.1 mTopN 应用场景
mTopN 可以按记录数滑动,窗口长度计算既可以按记录数,也可以按时间长度。具体滑动的规则可以参考窗口计算综述教程:window_cal.md · 浙江智臾科技有限公司/Tutorials_CN - Gitee
对于模拟数据中的分钟表 t,要得到每支股票每5条记录内交易量最大的3条记录的平均价格,可以用 mavgTopN 函数搭配 context by 解决:
select windCode, tradingTime, mavgTopN(close, volume, 5, 3, false) as mavgTop3Close from t context by windCode
//output
windCode tradingTime mavgTop3Close
--------- ----------------------- ------------------
600001.SH 2023.04.30T09:30:00.000 20
600001.SH 2023.04.30T09:31:00.000 20.005
600001.SH 2023.04.30T09:32:00.000 20.01
600001.SH 2023.04.30T09:33:00.000 20.02
600001.SH 2023.04.30T09:34:00.000 20.03
...
一般来说,写因子的时候,计算的值不带单位,比如计算窗口大小为100分钟的交易量最大的十条记录的平均涨幅:
select windCode, tradingTime, mavgTopN(ratios(close), volume, 100, 10, false) as mavgTop10RatioClose from t context by windCode, date(tradingTime)
//output
windCode tradingTime mavgTop10RatioClose
--------- ----------------------- -----------------
600001.SH 2023.04.30T09:30:00.000
600001.SH 2023.04.30T09:31:00.000 1.0005
600001.SH 2023.04.30T09:32:00.000 1.000499875
600001.SH 2023.04.30T09:33:00.000 1.000499750
600001.SH 2023.04.30T09:34:00.000 1.000499625
...
除了单目的 TopN 之外,DolphinDB 也支持了双目运算,如 beta、corr、covar 等的 TopN 算子。例如,计算每支股票每5条记录价格最高的3条记录的两个因子的相关性,可以用 mcorrTopN 函数搭配 context by 解决:
select windCode, tradingTime, mcorrTopN(low, close * volume, log(ratios(close)), 5, 3, false) as mcorrTop3CloseVol from t context by windCode, date(tradingTime)
//output (由于是模拟数据,比较失真)
windCode tradingTime mcorrTop3CloseVol
--------- ----------------------- -----------------
600001.SH 2023.04.30T09:30:00.000
600001.SH 2023.04.30T09:31:00.000
600001.SH 2023.04.30T09:32:00.000 1.00000
600001.SH 2023.04.30T09:33:00.000 0.99999
600001.SH 2023.04.30T09:34:00.000 0.99999
2.2 tmTopN 应用场景
mTopN 的窗口计算是根据记录数取窗口大小。而 tmTopN 函数的窗口大小可以是一个时间间隔,既可以是5分钟,也可以为20秒,以此类推。tmTopN 系列函数中,top 可以是一个0和1之间的浮点数,表示百分比,譬如0.2,表示选择窗口内20%的记录。
例如对上述数据的处理中,计算时间窗口为3分钟,交易量最大的两条记录的平均涨幅:
select windCode, tradingTime, tmavgTopN(tradingTime, ratios(close), volume, 3m, 2, false) as tmavgTop2RatioClose from t context by windCode, date(tradingTime)
//output
windCode tradingTime tmavgTop2RatioClose
--------- ----------------------- -----------------
600001.SH 2023.04.30T09:30:00.000
600001.SH 2023.04.30T09:31:00.000 1.0005
600001.SH 2023.04.30T09:32:00.000 1.000499875
600001.SH 2023.04.30T09:33:00.000 1.000499625
600001.SH 2023.04.30T09:34:00.000 1.0004993758
...
TopN 系列函数也实现了相关性函数的计算,因此可以计算例如5分钟窗口期内交易量最大的三条记录的 close 和 volume 相关性:
select windCode, tradingTime, tmcorrTopN(tradingTime, close, volume, volume, 5m, 3, false) as tmavgTop3CorrCloseVolume from t context by windCode, date(tradingTime)//output
windCode tradingTime tmavgTop3CorrCloseVolume
--------- ----------------------- ------------------------
600001.SH 2023.04.30T09:30:00.000
600001.SH 2023.04.30T09:31:00.000 0.999999990552169
600001.SH 2023.04.30T09:32:00.000 1.000000001625267
600001.SH 2023.04.30T09:33:00.000 1.000000006877599
600001.SH 2023.04.30T09:34:00.000 1.000000012129931
...
3. cumTopN 系列的应用场景
与 mTopN 和 tmTopN 的滑动计算不同,cumTopN 系列计算的是累计窗口。例如,计算历史以来涨幅最大3条记录的交易量总和,可以通过 cumsumTopN 函数实现:
select windCode, tradingTime, cumsumTopN(volume, ratios(close), 3, false) as cumsumTop3Volume from t context by windCode//output
windCode tradingTime cumsumTop3Volume
--------- ----------------------- ----------------
600001.SH 2023.04.30T09:30:00.000
600001.SH 2023.04.30T09:31:00.000 9901
600001.SH 2023.04.30T09:32:00.000 19803
600001.SH 2023.04.30T09:33:00.000 29706
600001.SH 2023.04.30T09:34:00.000 29706
...
从上述脚本可以看到,函数内部的参数也可以是计算结果,并不一定是字段名,展现了TopN 函数用法的高度灵活性。
4. 自定义 TopN 函数
第一章列举了目前 DolphinDB 支持的内置的 TopN 系列函数。考虑到用户的多样化计算需求,DolphinDB 也开放了自定义的接口。用户可以根据实际需求,自定义 TopN 函数的聚合计算方式。
注意:经过优化的内置 TopN 系列函数性能优于自定义 TopN 函数。
4.1 自定义 TopN 的实现方法
TopN 系列对应的高阶函数是 aggrTopN(func, funcArgs, sortingCol, top, [ascending=true]),func 参数可以接受聚合函数。因此,如果用户希望用复杂的自定义聚合函数计算 TopN,例如计算交易量最大的前40%的记录中 OHLC 的平均值,可以这样实现:
//用 defg 自定义聚合函数 avgOHLC,定义取出 TopN 之后的聚合行为
defg avgOHLC(price){ return avg(price)
}select aggrTopN(avgOHLC, funcArgs =(open + high + low + close) , sortingCol=volume, top=0.4, ascending=true) as factor_value from t group by windCode//output
windCode factor_value
--------- -------------------
600001.SH 80.94
600002.SH 116.56583
600003.SH 160.74
600004.SH 196.40
600005.SH 240.76167
同样,mTopN 、tmTopN 系列的窗口函数也支持自定义。例如上述的 avgOHLC 函数,用户可以将其应用到 moving、tmoving 函数中:
select windCode, tradingTime, moving(aggrTopN{avgOHLC,,,0.4,true},(open + high + low + close, volume),10,1) as udfmTopN from t context by windCode//output
windCode tradingTime udfmTopN
--------- ----------------------- ------------------
600001.SH 2023.04.30T09:30:00.000 80
...
600001.SH 2023.04.30T09:39:00.000 80.06
600001.SH 2023.04.30T09:40:00.000 80.10
600001.SH 2023.04.30T09:41:00.000 80.14
...
4.2 内置 TopN 与自定义 TopN 的性能对比
m 系列函数为各自的计算场景进行了优化,因此比 moving 高阶函数有更好的性能。上述的计算也可以用内置函数的 mavgTopN 完成:
select windCode, tradingTime, mavgTopN(open + high + low + close, volume,10,4) as udfmTopN from t context by windCode//output
windCode tradingTime udfmTopN
--------- ----------------------- ------------------
600001.SH 2023.04.30T09:30:00.000 80
...
600001.SH 2023.04.30T09:39:00.000 80.06
600001.SH 2023.04.30T09:40:00.000 80.10
600001.SH 2023.04.30T09:41:00.000 80.14
...
性能上来说,内置 TopN 系列函数的计算效率远高于自定义 TopN 函数:
- 测试设备
- CPU:Intel(R) Xeon(R) Silver 4216 CPU @ 2.10GHz
- 操作系统: 64 位 CentOS Linux 7 (Core)
- DolphinDB部署类型:2.00.10版本,单节点
//moving+aggrTopN+avgOHLC
timer(10000)select windCode, tradingTime, moving(aggrTopN{avgOHLC,,,0.4,true},(open + high + low + close, volume),10,1) as udfmTopN from t context by windCode
//8394 ms//moving+aggrTopN+avg
timer(10000)select windCode, tradingTime, moving(aggrTopN{avg,,,0.4,true},(open + high + low + close, volume),10,1) as udfmTopN from t context by windCode
//6812 ms//mavgTopN
timer(10000)select windCode, tradingTime, mavgTopN(open + high + low + close, volume,10,4) as udfmTopN from t context by windCode
//1394 ms
| TopN函数 | 运行10,000次耗时 |
|---|---|
| moving+aggrTopN+avgOHLC | 8,394 ms |
| moving+aggrTopN+avg | 6,812 ms |
| mavgTopN | 1,394 ms |
5. TopN 的批流一体场景
在之前的章节中,介绍的均为离线计算的场景。TopN 系列函数目前也支持了流计算场景。例如计算窗口大小为100分钟的交易量最大的十条记录的平均涨幅:
//离线计算中的函数可以直接填入流引擎中
factor = <mavgTopN(ratios(close), volume, 100, 10, false)>//定义输入输出表结构
share streamTable(1:0, `tradingTime`windCode`open`high`low`close`volume, [TIMESTAMP,STRING,DOUBLE,DOUBLE,DOUBLE,DOUBLE,INT]) as tickStream
result = table(1000:0, `windCode`tradingTime`mavgTop10RatioClose, [STRING,TIMESTAMP,DOUBLE])//定义流计算引擎
rse = createReactiveStateEngine(name="streamTopN", metrics =[<tradingTime>, factor], dummyTable=t, outputTable=result, keyColumn="windCode")//订阅流表、回放数据
subscribeTable(tableName=`tickStream, actionName="mTopN", handler=tableInsert{rse})
replay(inputTables=t.copy().sortBy!(`tradingTime), outputTables=tickStream, timeColumn=`tradingTime)//查询流计算结果:
select * from result//如若想要反复调用上述脚本,先运行以下三行脚本,清除流表订阅
unsubscribeTable(tableName=`tickStream, actionName="mTopN")
dropStreamEngine(`streamTopN)
undef(`tickStream, SHARED)
6. DECIMAL 的使用
2.00.10及后续的版本支持在 TopN 系列函数中使用 DECIMAL 类型(包括 DECIMAL32、64以及128类型)。不仅排序字段 S,而且计算字段 X 和 Y 均可使用 DECIMAL 类型。如果计算字段是 DECIMAL 类型,msumTopN、tmsumTopN 和 cumsumTopN 三个函数返回 DECIMAL 类型,其它函数的结果仍然返回 DOUBLE 类型。
虽然 var、varp、std、stp、corr、covar、beta、wsum 等8个基础函数对应的 TopN 系列函数最终结果位 DOUBLE 类型,但是当计算列 X 和 Y 为 DECIMAL 类型时,计算的中间结果用 DECIMAL128 表示,这样可以避免精度丢失。当然使用 DECIMAL 做计算的中间结果,也有不足的一面。首先计算耗时会更长,其次可能会出现 overflow。当前的版本,在计算出现 overflow 时,并不会抛出异常,这需要引起特别的注意。
DECIMAL128 的有效位数是38位(包括小数点前和后的位数)。例如要对价格数据算方差,18.2345这个数据总共6位有效数据,平方之后就是12位,如果有1亿个数(8位),总的有效位数是20位,远远低于38,不会出现 overflow。但如果小数位数特别多,例如小数点后从4位增加到了15位,这样价格数据的有效位数是17,平方之后就是34位,1万个数就可能超过 DECIMAL128 的有效数字38位。碰到小数位数特别多的数据,要么转成 DOUBLE 类型处理,要么用 decimal32、decimal64,decimal128 等函数先降低数据精度。
7. 总结
本教程介绍了 TopN 的计算规则,以及内置的36个 mTopN 、tmTopN、cumTopN 系列函数在离线计算和流计算等场景的应用,并针对性地介绍了自定义 TopN 的实现方法。
在未来版本中,DolphinDB 将支持更多的内置 TopN 计算函数。
相关文章:
使用 DolphinDB TopN 函数探索高效的Alpha因子
DolphinDB 已经有非常多的窗口计算函数,例如 m 系列的滑动窗口计算,cum 系列累计窗口计算,tm 系列的的时间窗口滑动计算。但是所有这类函数都是对窗口内的所有记录进行指标计算,难免包含很多噪音。 DolphinDB 的金融领域用户反馈…...
超聚变和厦门大学助力兴业银行构建智慧金融隐私计算平台,助力信用卡业务精准营销...
兴业银行与超聚变数字技术有限公司、厦门大学携手,发挥产学研用一体化整体优势联合建设,厦门大学提供先进的算法模型及科研能力,超聚变提供产品解决方案及工程能力,兴业银行提供金融实践能力,三方发挥各自领域优势&…...
docker 的compose安装
1. Docker Compose 环境安装 Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose docker compose 实现单机容器集群编排管理(使用一个模板文件定义多个应用容器的启动参数和依赖关系,并使用docker co…...
JavaScript---事件对象event
获取事件对象: 事件对象:是个对象,这个对象里有事件触发时的相关信息,在事件绑定的回调函数的第一个参数就是事件对象,一般命名为event、ev、e eg: 元素.addEventListener(click,function (e){}) 部分常用属性&…...
Day 15 C++对象模型和this指针
目录 C对象模型 类内的成员变量和成员函数分开存储 总结 this指针 概念 示例 用途 当形参和成员变量同名时 在非静态成员函数中,如果希望返回对象本身 例子 空指针访问成员函数 示例 const修饰成员函数 常函数(const member function&…...
HarmonyOS/OpenHarmony元服务开发-卡片生命周期管理
创建ArkTS卡片,需实现FormExtensionAbility生命周期接口。 1.在EntryFormAbility.ts中,导入相关模块。 import formInfo from ohos.app.form.formInfo; import formBindingData from ohos.app.form.formBindingData; import FormExtensionAbility from …...
软件工程01
软件工程原则: 开闭原则: open closed principle : 对扩展开放,对修改关闭,,,只让扩展,不让修改,用新增的类去替代修改的类 扩展之后,代码不用改变ÿ…...
UML/SysML建模工具更新(2023.7)(1-5)有国产工具
DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有: 工具最新版本:Visual Paradigm 17.1 更新时间:2023年7月11日 工具简介 很用心的建模工具。支持编写用例规约。支持文本分析和C…...
Mac plist文件
macOS、iOS、iPadOS的应用程序都可能会有plist配置文件,他是苹果系列操作系统特有的配置文件。 plist的本质是个xml格式的文本文件,英文全称是property list,文件后缀使用.plist。 对于普通用户来说,基本不用管plist文件是什么&…...
基于Java+SpringBoot+vue前后端分离校园周边美食探索分享平台设计实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
【openwrt】package介绍
openwrt package介绍 OpenWrt 构建系统主要围绕package的概念展开。不管是什么软件,几乎都对应一个package。 这几乎适用于系统中的所有内容:HOST工具、交叉编译工具链、Linux 内核、内核mod、根文件系统和上层的应用软件。 一个 OpenWrt package本质上…...
vue 封装一个鼠标拖动选择时间段功能
<template><div class"timeRange"><div class"calendar"><table><thead><tr><th rowspan"6" class"weekRow"><b>周/时间</b></th><th colspan"24"><…...
ubuntu22.0安装Barrier局域网共享鼠标键盘
ubuntu22.0安装Barrier局域网共享鼠标键盘 参考网站安装步骤客户端一直开启中解决 参考网站 https://idroot.us/install-barrier-ubuntu-22-04/ 安装步骤 sudo apt update sudo apt upgrade sudo apt install wget apt-transport-https gnupg2 software-properties-common s…...
ffmpeg常用功能博客导航
FFmpeg 是一个处理视频和音频内容的开源工具库,可以实现编码、解码、转码、流媒体和后处理等服务。 推荐博客: 常见命令和使用案例 用ffmpeg转mov为mp4格式 FFmpeg 常用命令 FFmpeg 常用命令编辑音/视频(转换格式、压缩、裁剪、截图、切分合…...
shopee,lazada,etsy店群如何高效安全的管理
对于电商卖家来说,要经营多个店铺,管理多个账号是非常常见的操作。为了避免账号关联被平台识别出来,需要使用防关联的浏览器来进行操作 1、支持多平台 支持同时管理多个电商平台店铺,Shopee、Lazada、etsy、poshmark、vinted等&…...
【计算复杂性理论】证明复杂性(八):命题鸽巢原理(Propositional Pigeonhole Principle)的指数级归结下界
往期文章: 【计算复杂性理论】证明复杂性(Proof Complexity)(一):简介 【计算复杂性理论】证明复杂性(二):归结(Resolution)与扩展归结ÿ…...
使用DataX实现mysql与hive数据互相导入导出
一、概论 1.1 什么是DataX DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 1.2 DataX 的设计 为了解决异构数据源同步问题…...
语音转录成文本:AI Transcription for mac
AI Transcription是一种人工智能技术,它可以将音频和视频文件转换成文本格式。这种技术可以帮助用户快速地将大量的音频和视频内容转换成文本格式,方便用户进行文本分析、搜索和编辑等操作。 以下是AI Transcription的几个特点: 高效性。AI …...
[nlp] TF-IDF算法介绍
(1)TF是词频(Term Frequency) 词频是文档中词出现的概率。 (2) IDF是逆向文件频率(Inverse Document Frequency) 包含词条的文档越少,IDF越大。...
一些感想,写在8月之前
最近换工作了,离开了一个奋斗了4年多的公司,现在在新公司,还在培训中,不那么忙了,就写写最近的想法吧。 因为最近一直在研究框架和搭项目框架,所以就想把一些工作上的过程记录下来,以备不时之需…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
