如何快速计算分组下逐行缩样的标准差以替代低效迭代
问题描述
我需要针对CAT1、CAT2、CAT3三类PD Percent数据计算标准差,分析其随到期日(Expiration Date)临近的变化规律。当前实现逻辑为对每个类别下的每一行迭代,计算对应剩余天数(DTE)序列的标准差:例如Cat1的起始DTE为50,我会计算DTE从50到0区间(排除最后1天DTE=0的样本)的标准差,本质是基于不断缩减的样本总体计算标准差。目前写的嵌套循环代码运行速度极慢,想请教有没有比迭代更高效的实现方法?
原有代码如下:
for category in category_list: for exp_date in exp_dates_list: min_dte = df[df['category'] == category].loc[df['Expiration Date'] == exp_date]['DTE'].min() if min_dte == 0: dte_list = list(df[df['category'] == category].loc[df['Expiration Date'] == exp_date]['DTE']) for dte in dte_list: std_dev = df[(df['category'] == category) & (df['Expiration Date'] == exp_date) & (df['DTE'] <= dte) ]['Price Delta Percent'].std() df.loc[(df['category'] == category) & (df['Expiration Date'] == exp_date) & (df['DTE'] == dte), 'PDP StdDev'] = std_dev
优化方案
你要实现的是按类别+到期日分组后,对每个组内DTE小于等于当前值的所有Price Delta Percent计算标准差,完全可以用Pandas原生的分组+扩展窗口(expanding)的向量化运算实现,比三重嵌套循环效率提升百倍以上,代码如下:
import pandas as pd # 1. 预处理:排除DTE=0的样本,按分组字段+DTE升序排序 df_sorted = df[df['DTE'] != 0].sort_values( by=['category', 'Expiration Date', 'DTE'], ascending=[True, True, True] ) # 2. 分组计算扩展窗口标准差,和原有逻辑完全对齐 df_sorted['PDP StdDev'] = df_sorted.groupby( ['category', 'Expiration Date'] )['Price Delta Percent'].expanding().std().reset_index(drop=True) # 3. 把计算结果合并回原数据表 df = df.merge( df_sorted[['category', 'Expiration Date', 'DTE', 'PDP StdDev']], on=['category', 'Expiration Date', 'DTE'], how='left' )
优化说明
- 原有嵌套循环每次都对全表做条件筛选,时间复杂度极高,数据量越大卡顿越明显
- 以上方案采用Pandas内置向量化运算,仅需一次排序、一次分组窗口计算即可得到结果,逻辑和原代码完全一致,你可以用小样本验证结果匹配
内容的提问来源于stack exchange,提问作者walksonair
相关产品推荐
相关产品推荐

