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
相关产品推荐
相关产品推荐

