You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一列求和阈值实现Pandas可变跨度ewm mean计算?

计算基于A列求和阈值的可变跨度EWM均值

需求说明

我们需要为B列计算可变跨度的指数加权均值(EWM Mean),跨度由A列的累积求和结果决定:从当前行向前累加A列的值,当累加和≥阈值(示例中为4)时,取此时累积的行数作为EWM的跨度,再计算对应窗口内B列的EWM均值。

示例数据及预期逻辑:

AB预期逻辑
12无(累加和未达阈值)
12无(累加和未达阈值)
23取最后3行B值(A累加1+1+2=4)计算EWM
41取最后1行B值(A累加4=4)计算EWM
11取最后2行B值(A累加1+4=5≥4)计算EWM
31取最后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)

代码说明

  1. get_target_span函数:遍历当前行及之前的A列值,累加直到和≥阈值,返回累加的行数作为EWM跨度。
  2. 生成跨度列:通过index.map为每行匹配对应的跨度值。
  3. compute_ewm_result函数:根据每行的跨度截取B列窗口,计算窗口内的EWM均值,取窗口最后一个值作为当前行的结果。
  4. 结果输出:最终生成的ewm_result列即为符合需求的可变跨度EWM均值。

内容的提问来源于stack exchange,提问作者BYZZav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:22:58