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

Python计算多频率滚动回报遇KeyError: 'col_A'求原因及优化方案

问题描述

拥有如下带日期索引的DataFrame:

import pandas as pd
import numpy as np

data = [[99330,12,122],[1123,1230,1287],[123,101,812739],[1143,1230123,252],[234,342,4546],[2445,3453,3457],[7897,8657,5675],[46,5675,453],[76,484,3735],[363,93,4568],[385,568,367],[458,846,4847],[574,45747,658468],[57457,46534,4675]]
df1 = pd.DataFrame(data, index=['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04',
                       '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08',
                       '2022-01-09', '2022-01-10', '2022-01-11', '2022-01-12',
                       '2022-01-13', '2022-01-14'], 
          columns=['col_A', 'col_B', 'col_C'])
df1.index = pd.to_datetime(df1.index)

尝试用以下代码计算日度、周度滚动回报:

periodicity_dict = {1:'daily', 7:'weekly'}
df_columns = df1.columns
for key in periodicity_dict:
    for col in df_columns:
        df1[col+'_rolling']= np.nan
        for i in range(key, len(df1[col][df1[col].first_valid_index():df1[col].last_valid_index()])):
            df1[col+'_rolling'].iloc[i] = (df1[col].iloc[i] - df[col].iloc[i-key])/df[col].iloc[i-key]

运行时出现错误:KeyError: 'col_A',需要排查错误原因并寻求更优实现方式。

错误原因分析
  • 变量名拼写错误:代码中使用了df[col],但实际定义的DataFrame变量名是df1,不存在df这个对象,因此会抛出KeyError,找不到col_A列。
  • 循环逻辑冗余且低效:手动遍历索引计算滚动回报完全没必要,pandas内置了专门处理这类计算的函数,手动循环不仅代码繁琐,而且在数据量较大时运行效率极低。
  • 列名覆盖问题:每次循环不同周期(日度/周度)时,会重复使用col+'_rolling'作为列名,导致先计算的日度回报列被后计算的周度回报列覆盖,最终只能保留最后一个周期的结果。
优化实现方案

使用pandas内置的pct_change()函数可以一键完成滚动回报计算,完全不需要嵌套循环,代码简洁且效率极高:

# 定义周期与名称的映射
periodicity_dict = {1: 'daily', 7: 'weekly'}

for period, name in periodicity_dict.items():
    # 计算指定周期的百分比变化,自动处理缺失值
    rolling_returns = df1.pct_change(periods=period).add_suffix(f'_{name}_return')
    # 将计算结果合并到原DataFrame
    df1 = pd.concat([df1, rolling_returns], axis=1)

# 查看结果
print(df1)

代码说明

  • pct_change(periods=n):核心函数,计算当前值与n期前值的百分比变化,公式为(当前值 - n期前值)/n期前值,和手动实现的逻辑完全一致,同时会自动为前n行填充NaN(因为没有足够的历史数据计算回报)。
  • add_suffix():为计算后的列添加后缀(如_daily_return、_weekly_return),避免不同周期的结果列名冲突。
  • pd.concat():安全地将新计算的回报列合并到原DataFrame中,避免手动赋值可能出现的索引对齐问题。

内容的提问来源于stack exchange,提问作者MathMan 99

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:45:49