Pandas自定义步长滑动窗口的多列标准差与均值计算实现
实现方案
自定义窗口逻辑实现
你需要的每10行右移一次左边界的窗口逻辑,可以通过pandas动态滚动窗口实现,无需手动逐行遍历,代码如下:
import pandas as pd # 若df不是连续0基整数索引,可先执行 df = df.reset_index(drop=True) 保证行号连续 # 生成每个行位置对应的窗口大小 window_size_list = [idx + 1 - (idx // 10) for idx in range(len(df))] # 批量计算所有列的自定义窗口标准差,空值填0,添加SD前缀 sd_result = df.rolling(window=window_size_list).std().fillna(0).add_prefix("SD") # 合并到原DataFrame output = df.join(sd_result)
如果你的pandas版本低于1.3不支持动态窗口大小,可使用兼容写法:
import pandas as pd import numpy as np def calc_custom_window(series, calc_func): res = [] for idx in range(len(series)): left_bound = idx // 10 window_data = series.iloc[left_bound: idx+1] res.append(calc_func(window_data)) return pd.Series(res, index=series.index) sd_result = df.apply(lambda x: calc_custom_window(x, np.std)).fillna(0).add_prefix("SD") output = df.join(sd_result)
均值计算规则
是的,你只需要把代码中的std()替换为mean()即可复用完全相同的窗口逻辑计算均值,示例如下:
# 动态窗口写法计算均值 mean_result = df.rolling(window=window_size_list).mean().fillna(0).add_prefix("MEAN") # 合并标准差和均值结果到原表 output = df.join(sd_result).join(mean_result)
内容的提问来源于stack exchange,提问作者Jewel_R
相关产品推荐
相关产品推荐

