如何修改Python函数以指定列生成对数收益率并添加至DataFrame
问题:调整函数以基于指定列给DataFrame添加对数收益率
我已通过以下代码获取了标普500指数的DataFrame:
import pandas as pd import numpy as np from pandas_datareader import data as pdr from datetime import date, timedelta yf.pdr_override() end = date.today() start = end - timedelta(days=7300) # download dataframe data = pdr.get_data_yahoo('^GSPC', start=start, end= end)
现在我希望创建一个函数,基于指定列给该DataFrame添加对数收益率,参考代码为:
data['log_return'] = np.log(data['Adj Close'] / data['Adj Close'].shift(1))
我初步编写的函数如下:
def add_log_return(df): # add returns in a logarithmic fashion added = df.copy() added["log_return"] = np.log(df[column] / df[column].shift(1)) added["log_return"] = added["log_return"].apply(lambda x: x*100) return added
请问如何调整该函数,使其能接收如df['Adj Close']这样的指定列作为输入,从而将对数收益率列正确添加到我的data DataFrame中?预期调用方式为:
data = add_log_return(df['Adj Close'])
解决方法
你的初步函数存在两个核心问题:一是使用了未定义的column变量,二是如果传入的是df['Adj Close']这类Series对象,直接调用df.copy()得到的是Series副本,无法直接添加新列。以下是针对你预期调用方式的调整方案:
调整后的函数
import numpy as np def add_log_return(price_series): # 获取原DataFrame的副本,避免修改原数据 original_df = price_series._obj.copy() # 计算对数收益率并转换为百分比形式 original_df['log_return'] = np.log(price_series / price_series.shift(1)) * 100 return original_df
调用示例
# 传入data的Adj Close列,返回添加了log_return的完整DataFrame data = add_log_return(data['Adj Close'])
说明
- 参数接收:函数参数
price_series接收你传入的data['Adj Close'](这是一个Series对象)。 - 获取原DataFrame:通过
price_series._obj可以获取该Series所属的原始DataFrame,保证最终返回的是包含所有原始列的完整DataFrame。 - 收益率计算:直接使用传入的Series进行对数收益率计算,避免了未定义变量的问题;同时将结果乘以100转换为百分比形式,符合你代码中的处理逻辑。
如果你只需要返回包含指定价格列和对数收益率列的小型DataFrame,可以使用以下简化版本:
def add_log_return(price_series): # 将Series转换为DataFrame result_df = price_series.to_frame().copy() # 添加对数收益率列 result_df['log_return'] = np.log(price_series / price_series.shift(1)) * 100 return result_df
内容的提问来源于stack exchange,提问作者FFFAR
相关产品推荐
相关产品推荐

