如何将DataFrame整列传入lambda调用的capm函数而非逐行传值?
解决方案
你不需要用apply(axis=1)逐行传递单个数值,直接把两列整列作为参数传入capm函数即可——毕竟线性回归需要的是一组自变量和因变量序列,而非单个值。
基础版(全局计算单个beta)
先纠正你代码里的函数名笔误(camp应该是capm),然后修改调用逻辑:
# 定义capm函数,接收两个Series类型的列数据 def capm(excess_ret, mkt_exc_ret): # 这里写线性回归计算beta的代码,比如用statsmodels实现 import statsmodels.api as sm # 给自变量添加常数项 X = sm.add_constant(mkt_exc_ret) # 拟合OLS模型 model = sm.OLS(excess_ret, X).fit() # 返回beta值(即市场超额收益对应的系数) return model.params[1] # 直接传入整列数据计算beta,赋值给新列 df_final_data['beta'] = capm(df_final_data['Excess_ret'], df_final_data['Mkt_Exc_ret'])
分组版(按维度计算多个beta)
如果你的DataFrame需要按某个维度(比如不同股票、不同行业)分别计算beta,就用groupby结合apply,此时每个分组的子DataFrame会被传入函数,你可以在函数内提取对应列处理:
def capm_by_group(group_df): X = sm.add_constant(group_df['Mkt_Exc_ret']) model = sm.OLS(group_df['Excess_ret'], X).fit() return model.params[1] # 比如按Stock_Code分组,给每个组计算beta df_final_data['beta'] = df_final_data.groupby('Stock_Code').apply(capm_by_group).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者loyala
相关产品推荐
相关产品推荐

