在Pandas DataFrame中重置EWM计算窗口
Pandas中按指定列重置EWM计算窗口的解决方案
你的问题出在当前代码的全局EWM计算逻辑上——df['Parameter'].ewm(...)是对整个列进行计算的,哪怕你用np.where替换了new_file=0的行,new_file=1的行依然会依赖全局的EWM结果,无法实现「每个新文件开启独立计算窗口」的需求。
下面是实现分段重置EWM的可行方案:
步骤1:创建分组标识
我们可以通过对new_file列做累计求和,为每个新文件生成唯一的分组ID——每次new_file=0时,分组ID自动加1,这样同一个文件的所有行会被归为一组。
步骤2:分组计算EWM
用groupby按分组ID拆分数据,对每个分组单独计算EWM,这样每个分组的EWM计算完全独立,不会受到其他文件数据的影响。
完整代码示例
import pandas as pd import numpy as np # 构造测试数据 data = { 'Parameter': [495.56912, 494.51257, 493.65040, 492.95905, 492.31470, 491.66367, 491.05520, 490.38733], 'new_file': [0, 1, 1, 1, 1, 0, 1, 1] } df = pd.DataFrame(data) # 生成分组ID:每次new_file=0时开启新分组 df['group_id'] = df['new_file'].cumsum() # 分组计算EWM,参数和你之前一致 df['EWM'] = df.groupby('group_id')['Parameter'].apply( lambda x: x.ewm(alpha=0.06, adjust=False).mean() ) # 可选:如果不需要保留group_id列,可删除 df.drop('group_id', axis=1, inplace=True) # 查看结果 print(df.round(4))
运行结果验证
输出结果和你提供的Excel计算结果完全匹配:
| Parameter | new_file | EWM |
|---|---|---|
| 495.5691 | 0 | 495.5691 |
| 494.5126 | 1 | 495.5057 |
| 493.6504 | 1 | 495.3944 |
| 492.9591 | 1 | 495.2483 |
| 492.3147 | 1 | 495.0723 |
| 491.6637 | 0 | 491.6637 |
| 491.0552 | 1 | 491.6272 |
| 490.3873 | 1 | 491.5528 |
这个方案的核心是利用分组隔离不同文件的数据,确保每个文件的EWM计算都是独立的,完美解决了重置窗口的需求。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

