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

Python pandas月度cumsum累计求和达到阈值1后自动重置的实现咨询

实现思路

原生cumsum仅支持全量累计,无法满足中途超过阈值重置的需求,你需要在月度分组的基础上,新增分组内的自定义累计逻辑即可同时满足两个重置要求。

核心逻辑拆解

  • 月度周期重置:沿用pd.Grouper(freq='1M')对时间序列分组,每个自然月单独计算,天然满足每月初重置的要求
  • 阈值触发重置:每个月度分组内部逐行累加CI_rate,每次累加后判断是否超过阈值1,若超过直接将当前累计值重置为1

代码实现示例

首先需要保证DataFrame的索引为datetime类型,否则按月份分组会失效:

import pandas as pd

# 自定义带双重置规则的CI计算函数
def calc_ci(rate_series):
    current_ci = 1 # 初始值对齐你的计算逻辑
    res = []
    for rate in rate_series:
        current_ci += rate
        # 累计值超过阈值1时重置
        if current_ci > 1:
            current_ci = 1
        res.append(current_ci)
    return pd.Series(res, index=rate_series.index)

# 按月份分组后应用自定义计算函数
df['CI'] = df.groupby(pd.Grouper(freq='1M'))['CI_rate'].apply(calc_ci)

大数据量优化方案

如果数据量超过10万行,上述循环实现的运行效率偏低,可以用numba装饰器做JIT加速:

import numpy as np
from numba import jit

@jit(nopython=True)
def fast_calc_ci(rate_arr):
    res = np.zeros_like(rate_arr)
    current_ci = 1
    for i in range(len(rate_arr)):
        current_ci += rate_arr[i]
        if current_ci > 1:
            current_ci = 1
        res[i] = current_ci
    return res

# 应用加速后的计算逻辑
df['CI'] = df.groupby(pd.Grouper(freq='1M'))['CI_rate'].transform(lambda x: fast_calc_ci(x.values))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:45:02