如何高效计算滚动时间窗口内的事件最大发生次数?
问题背景
现有一张事件表,结构如下:
| Type | Incident ID | Date of incident |
|---|---|---|
| A | 1 | 2022-02-12 |
| A | 2 | 2022-02-14 |
| A | 3 | 2022-02-14 |
| A | 4 | 2022-02-14 |
| A | 5 | 2022-02-16 |
| A | 6 | 2022-02-17 |
| A | 7 | 2022-02-19 |
| A | 8 | 2022-02-19 |
| A | 7 | 2022-02-19 |
| A | 8 | 2022-02-19 |
| ... | ... | ... |
| B | 1 | 2022-02-12 |
| B | 2 | 2022-02-12 |
| B | 3 | 2022-02-13 |
| ... | ... | ... |
该表记录不同类型的事件,每条事件包含Type(类型)、Incident ID(事件ID)和Date of incident(事件发生日期)。
需求说明
针对给定的时间范围(如5天),计算滚动窗口内事件发生次数的最大值。示例:
- 第一个窗口
2022-02-12至2022-02-17内事件发生次数为6; - 窗口滚动一天后,
2022-02-13至2022-02-18内事件发生次数为5,此时最大值仍为6; - 需要遍历完整时间范围得出最终最大值。
核心问题
如何在百万级数据量下高效实现该需求?具体而言,创建固定时长的滚动日期窗口,统计每个窗口内的事件发生次数,并输出所有窗口中的最大值。
当前使用SQLAlchemy,同时关注Plain SQL实现方案,也考虑是否可通过Pandas实现滚动窗口计算。
测试数据集
test_data_small = {'Id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3], 'Type': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'Date': [ '2022-02-12', '2022-02-14', '2022-02-14', '2022-02-14', '2022-02-16', '2022-02-17', '2022-02-19', '2022-02-19', '2022-02-19', '2022-02-19', '2022-02-16', '2022-02-12', '2022-02-12', '2022-02-13'] }
现有SQLAlchemy代码
incidents = select( incidents.c.type, incidents.c.id, incidents.c.date ).subquery() result = self.connection.execute(incidents).fetchall()
提问
是否可通过Plain SQL实现?或是否应使用Pandas进行滚动窗口计算?
内容的提问来源于stack exchange,提问作者Ipsider
相关产品推荐
相关产品推荐

