高频数据处理技巧:非等间隔的时间序列处理
本页说明等间隔与非等间隔时间序列在滑动窗口计算上的差异,以及复杂性来源。
Source: https://dolphindb.cn/blogs/285
What this page covers
- 非等间隔高频时间序列的滑动/偏移/聚合等需求背景。
- 使用 window join 计算“过去 5 分钟均值”的示例。
- 按多个连接列分组后进行 window join 的示例。
- window join 的聚合函数支持范围与参数形式。
- 用 window join 匹配“之后第一条记录”,并与 SQL Server 做对比。
- pandas、DolphinDB、kdb+ 的能力限制与性能测试结论。
技能认证特训营第二期报名提示
页面顶部提供限时报名入口与福利优惠提示。
- 提供“技能认证特训营第二期”的报名链接入口。
- 该入口以限时与优惠福利提示的形式出现。
高频数据处理技巧:非等间隔的时间序列处理(文章信息)
包含文章标题、作者/站点标识与发布日期信息。
- 文章标题为“高频数据处理技巧:非等间隔的时间序列处理”。
- 页面/文章署名标识中出现“DolphinDB”。
- 文章发布日期为 2021-05-14。
问题背景:非等间隔高频时间序列的滑动/偏移/聚合需求
说明等间隔与非等间隔时间序列在滑动窗口计算上的差异与复杂性来源。
- 高频时间序列常见操作包含滑动、偏移、聚合、转置、关联等。
- 等间隔且无缺失时,可将时间窗口转为固定记录条数窗口。
- 非等间隔场景下,滑动窗口计算更复杂。
示例一:单序列过去5分钟均值(window join)
给出非等间隔样例数据,说明需要逐条与时间窗口边界对比,并用 DolphinDB window join 实现计算。
- 计算过去 5 分钟均值需要逐条对比时间窗口边界。
- 计算流程包括找出窗口内数据并计算 avg(val)。
- DolphinDB 提供 window join 用于非等间隔窗口计算任务。
- window join 需要提供左右表、时间窗口、聚合函数和连接列。
- 左表用于指定发生计算的时间点,右表是原始数据。
- 时间窗口 -5:-1 表示当前时刻前 5 分钟。
- 时间窗口 1:5 表示当前时刻后 5 分钟(上下边界都为正)。
- 边界为 0 时,当前时刻包含在时间窗口内。
- 时间窗口 -5:5 表示过去 5 分钟到未来 5 分钟,且包含当前时刻。
- 示例:time=12:31m 的窗口为 12:26m 到 12:30m(边界包含)。
示例二:多股票按 sym 分组后对 time 做 window join
说明 window join 可指定多个连接列:先等值连接分组,再在组内按最后连接列进行窗口连接;并给出多股票示例与解释。
- window join 可指定多个连接列。
- 系统先按前 N-1 个连接列做等值连接(equal join)。
- 系统在细分组内按最后一个连接列做 window join。
- 示例:sym=A 且 time=12:31m 时,在窗口内筛选 sym=A 的数据计算 avg(val)。
聚合函数支持范围(内置与自定义)
说明 DolphinDB window join 支持的内置聚合函数列表、自定义聚合函数能力及参数形式。
- DolphinDB window join 支持任意聚合函数(含内置与自定义)。
- 内置函数示例包含 avg、count、min、max、sum、var、wavg 等。
- 支持用户自定义聚合函数。
- 聚合函数参数可为一个或多个。
- 参数可为表中某列或计算字段。
业务场景:匹配 t1 之后的 t2 第一条记录(DolphinDB vs SQL Server)
通过 t1/t2 示例展示用 DolphinDB window join 获取“之后第一条记录”,并对比 SQL Server 需要自定义函数实现及性能差异。
- 示例任务:找出 t2 中与 t1 的 id 对应且在 t1 时间之后的第一条记录。
- 示例将窗口设置为 1:36500(100 年)以避免相邻 date 间隔过大。
- 文中对比:SQL Server 需要通过自定义函数实现该类需求。
- 文中给出相对性能表述:SQL Server 性能较差,DolphinDB 约快 300 倍(低置信度)。
能力限制与性能测试:pandas、DolphinDB、kdb+
指出 pandas rolling 仅适用于等间隔;给出 1000 万行测试环境与脚本,并报告 DolphinDB 与 kdb+ 的耗时及窗口长度影响结论。
- pandas rolling 只能处理等时间间隔数据。
- pandas rolling 不能处理非等时间间隔数据。
- 文中结论:DolphinDB 与 kdb+ 都可用 window join 处理非等间隔窗口。
- 性能测试数据规模为一千万行(10,000,000 行)。
- 测试机器 CPU 为 Intel(R) Core(TM) i7-7700 CPU @3.60GHz。
- 测试机器内存为 16GB。
- 测试机器 OS 为 Windows 10。
- 基准窗口:DolphinDB 456ms,kdb+ 16,398ms。
- 窗口=60ms:DolphinDB 455ms,kdb+ 21,521ms。
- 窗口=600ms:DolphinDB 500ms,kdb+ 73,649ms。
- 文中结论:DolphinDB window join 性能与窗口长度无关(中置信度)。
- 文中结论:kdb+ wj1 性能与窗口长度有关(中置信度)。
- 文中解释:对内置 avg 的优化使 DolphinDB window join 计算速度与窗口无关(中置信度)。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| 文章《高频数据处理技巧:非等间隔的时间序列处理》 | 发布日期 | 2021-05-14 | high |
| DolphinDB | 作为页面/文章署名标识出现 | DolphinDB | high |
| 高频时间序列处理 | 常用操作类型 | 滑动、偏移、聚合、转置、关联等操作 | high |
| 等间隔时间序列条件 | 窗口可简化为固定记录条数窗口 | 当时间间隔相等且无缺失数据时,可将时间窗口转为固定记录条数窗口以实现滑动窗口函数 | medium |
| 非等间隔时间序列过去5分钟均值计算 | 计算方式要求 | 需要逐条与时间窗口边界对比,找出窗口内数据,再计算 avg(val) | high |
| DolphinDB | 提供的功能 | 提供 window join 用于完成非等间隔时间序列窗口计算任务 | high |
| kdb(文中表述) | 提供的功能 | 提供 window join 用于完成该类任务 | medium |
| window join | 所需输入 | 需要提供左右表、时间窗口、聚合函数和连接列 | high |
| window join | 左表的作用(文中解释) | 左表用于指定发生计算的时间点,右表是原始数据 | high |
| window join 时间窗口 -5:-1 | 含义 | 表示当前时刻的前5分钟 | high |
| window join 时间窗口 1:5 | 含义 | 若上下边界都为正数,表示当前时刻的后5分钟 | high |
| window join 时间窗口 -5:0 或 0:5 | 含义 | 边界为0时表示当前时刻也包含在时间窗口内 | high |
| window join 时间窗口 -5:5 | 含义 | 表示过去5分钟到未来5分钟,当前时刻包含在窗口中 | high |
| 示例一(time=12:31m) | 窗口边界计算示例 | 时间点 12:31m 的窗口为 12:26m 到 12:30m(边界都包含) | high |
| window join(多个连接列) | 连接规则 | 可指定多个连接列:系统先根据前面 N-1 个连接列做等值连接(equal join),再在每个细分组中根据最后一个连接列做 window join | high |
| 示例二(sym=A, time=12:31m) | 窗口筛选规则示例 | 窗口为 12:26m 到 12:30m,系统在右表中寻找时间在窗口内且 sym=A 的数据计算 avg(val) | high |
| DolphinDB window join | 聚合函数支持范围 | 支持任意聚合函数:既支持内置 avg、beta、count、corr、covar、first、last、max、med、min、percentile、std、sum、sum2、var、wavg,也支持用户自定义聚合函数 | high |
| DolphinDB window join | 聚合函数参数形式 | 聚合函数参数可为一个或多个;参数可为表中某列或计算字段 | high |
| t1/t2 示例任务 | 目标 | 找出 t2 中与 t1 的 id 对应且时间在 t1 时间之后的第一条记录 | high |
| t1/t2 示例中的 window join 窗口设置 | 窗口取值与目的 | 设置窗口 1:36500(100年),用于防止 t2 中相邻 date 间隔过大导致数据落不进窗口 | high |
| SQL Server(传统数据库) | 实现该类需求的方式(文中对比) | 需要通过自定义函数实现 | medium |
| SQL Server 性能(相对) | 与 DolphinDB 对比结论 | SQL Server 的性能较差,DolphinDB 大约比 SQL Server 快 300 倍 | low |
| pandas rolling | 适用范围限制 | 只能处理等时间间隔的数据,不能处理非等时间间隔的数据 | medium |
| DolphinDB 与 kdb+ | 能力(文中结论) | 都可解决非等间隔数据的窗口处理(window join) | medium |
| 性能测试机器配置 | CPU | Intel(R) Core(TM) i7-7700 CPU @3.60GHz 3.60 GHz | high |
| 性能测试机器配置 | 内存 | 16GB | high |
| 性能测试机器配置 | OS | Windows 10 | high |
| 性能测试数据规模 | 行数 | 一千万行(10,000,000 行) | high |
| 性能测试结果(基准窗口) | 耗时对比 | DolphinDB 耗时 456 毫秒,kdb+ 耗时 16,398 毫秒 | high |
| 性能测试结果(窗口=60毫秒) | 耗时对比 | DolphinDB 耗时 455 毫秒,kdb+ 耗时 21,521 毫秒 | high |
| 性能测试结果(窗口=600毫秒) | 耗时对比 | DolphinDB 耗时 500 毫秒,kdb+ 耗时 73,649 毫秒 | high |
| DolphinDB window join 性能特性(文中结论) | 与窗口长度关系 | 性能与窗口长度无关 | medium |
| kdb+ wj1 性能特性(文中结论) | 与窗口长度关系 | 性能与窗口长度有关,窗口越长耗时越长 | medium |
| DolphinDB window join(avg 优化) | 原因解释(文中) | 对内置聚合函数 avg 做了优化,使 window join 中的计算速度与窗口无关 | medium |
| DolphinDB(被提及的优化聚合函数) | 优化函数列表 | avg、beta、count、corr、covar、first、last、max、med、min、percentile、std、sum、sum2、var、wavg | high |