如何基于另一列求和阈值实现Pandas可变跨度ewm mean计算?
计算基于A列求和阈值的可变跨度EWM均值
需求说明
我们需要为B列计算可变跨度的指数加权均值(EWM Mean),跨度由A列的累积求和结果决定:从当前行向前累加A列的值,当累加和≥阈值(示例中为4)时,取此时累积的行数作为EWM的跨度,再计算对应窗口内B列的EWM均值。
示例数据及预期逻辑:
| A | B | 预期逻辑 |
|---|---|---|
| 1 | 2 | 无(累加和未达阈值) |
| 1 | 2 | 无(累加和未达阈值) |
| 2 | 3 | 取最后3行B值(A累加1+1+2=4)计算EWM |
| 4 | 1 | 取最后1行B值(A累加4=4)计算EWM |
| 1 | 1 | 取最后2行B值(A累加1+4=5≥4)计算EWM |
| 3 | 1 | 取最后2行B值(A累加3+1=4)计算EWM |
实现代码(Pandas)
import pandas as pd # 初始化示例数据 df = pd.DataFrame({ 'A': [1, 1, 2, 4, 1, 3], 'B': [2, 2, 3, 1, 1, 1] }) def get_target_span(row_idx, df, threshold=4): """计算当前行对应的EWM跨度:向前累加A直到和≥阈值,返回累加行数""" total_sum = 0 span = 0 # 从当前行向前遍历(包含当前行) for i in range(row_idx, -1, -1): total_sum += df.loc[i, 'A'] span += 1 if total_sum >= threshold: break return span # 为每行计算跨度 df['span'] = df.index.map(lambda idx: get_target_span(idx, df)) def compute_ewm_result(row_idx, df): """根据跨度计算当前行的EWM均值""" span = df.loc[row_idx, 'span'] # 截取对应窗口的B值 b_window = df.loc[row_idx - span + 1 : row_idx, 'B'] # 计算EWM均值(adjust=True为默认参数,可按需调整) return b_window.ewm(span=span).mean().iloc[-1] # 生成最终结果列 df['ewm_result'] = df.index.map(lambda idx: compute_ewm_result(idx, df)) print(df)
代码说明
get_target_span函数:遍历当前行及之前的A列值,累加直到和≥阈值,返回累加的行数作为EWM跨度。- 生成跨度列:通过
index.map为每行匹配对应的跨度值。 compute_ewm_result函数:根据每行的跨度截取B列窗口,计算窗口内的EWM均值,取窗口最后一个值作为当前行的结果。- 结果输出:最终生成的
ewm_result列即为符合需求的可变跨度EWM均值。
内容的提问来源于stack exchange,提问作者BYZZav
相关产品推荐
相关产品推荐

