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

如何快速计算分组下逐行缩样的标准差以替代低效迭代

问题描述

我需要针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:54:04