如何按给定步长计算行区间的平均最大值
按指定步长计算行区间平均最大值实现方案
以下提供两种常用场景的实现逻辑,可根据你的技术栈直接套用:
Python Pandas 实现
适合本地处理结构化表格数据,步长和聚合规则可灵活调整:
import pandas as pd # 读取数据,可替换为pd.read_csv、pd.read_excel等读表逻辑 df = pd.DataFrame({ 'id': [1,2,3,4,5], 'eventDate': ['10.10.2021', '10.11.2021', '10.12.2021', '10.13.2021', '10.14.2021'], 'x': [0.33, 0.34, 0.35, 0.36, 0.37], 'y': [0.4, 0.5, 0.6, 0.7, 0.8] }) step = 3 # 自定义步长,可任意修改 # 核心逻辑:按步长对行分组 df['group_tag'] = df.index // step # 分组聚合:每组取最后一行的id和日期,数值列按需求计算 result = df.groupby('group_tag').agg( id = ('id', 'last'), eventDate = ('eventDate', 'last'), x = ('x', 'mean'), # 若需计算平均最大值,可替换为自定义聚合函数,比如lambda s: (s.max() + s.mean())/2 y = ('y', 'mean') ).reset_index(drop=True) print(result)
运行上述代码输出结果和你给出的示例完全一致。
SQL 实现
适合库内数据直接计算,支持MySQL 8.0+、PostgreSQL、Hive等支持窗口函数的数据库:
SET @step = 3; -- 自定义步长 WITH t1 AS ( SELECT *, FLOOR((ROW_NUMBER() OVER(ORDER BY id) - 1) / @step) AS group_num FROM 你的表名 ) SELECT MAX(id) AS id, MAX(eventDate) KEEP (DENSE_RANK LAST ORDER BY id) AS eventDate, AVG(x) AS x, -- 按需求替换为平均最大值的计算逻辑 AVG(y) AS y FROM t1 GROUP BY group_num ORDER BY id;
补充说明
- 若行数不是步长的整数倍,最后一组默认取剩余所有行计算,符合常规业务逻辑
- 数值列的计算规则可灵活调整,分组逻辑不需要改动
内容的提问来源于stack exchange,提问作者Mr Doro
相关产品推荐
相关产品推荐

