Python中如何对pandas DataFrame不同行应用不同公式计算方差
实现方案
原有代码问题梳理
- 第一处笔误:pandas生成DataFrame的方法名是
pd.DataFrame(首字母F大写),你写的pd.Dataframe会直接报错 - 你尝试用的
agg写法不适用当前场景:递推计算依赖上一行已经计算出的方差结果,agg无法直接按顺序复用前序行的计算结果,同时你写的x.shift(-1)、returns[:2]存在维度不匹配、索引对应错误的问题,自然运行报错。
正确可运行代码
import numpy as np import pandas as pd # 生成样例DataFrame df = pd.DataFrame({ 'a': range(1,7), 'b': [x**2 for x in range(1,7)], 'c': [x**3 for x in range(1,7)] }) # 计算收益率DataFrame returns = df.pct_change() # 初始化存储方差的DataFrame lamb = 0.94 d = pd.DataFrame(0, index=np.arange(len(returns)), columns=returns.columns) # 第一行填充传统方差结果 d.iloc[0] = returns.var() # 从第二行开始按递推公式填充 for i in range(1, len(d)): d.iloc[i] = lamb * d.iloc[i-1] + (1 - lamb) * (returns.iloc[i-1] ** 2)
代码说明
- 用循环逐行计算从第二行到最后一行的方差值,完全匹配你给出的递推规则:
当前行方差 = λ * 上一行方差 + (1-λ) * 上一行收益率的平方 - 所有计算的列维度自动对齐,不需要额外处理列匹配问题
注意:
df.pct_change()生成的收益率DataFrame第一行(索引0)为NaN,如果你的业务逻辑中递推需要用到有效收益率值,可以根据需求调整起始计算的索引,比如将d的第一行有效值对应到returns的索引1位置,修改循环起始和初始值填充逻辑即可。
内容的提问来源于stack exchange,提问作者sam_sam
相关产品推荐
相关产品推荐

