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

如何修改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'])

说明

  1. 参数接收:函数参数price_series接收你传入的data['Adj Close'](这是一个Series对象)。
  2. 获取原DataFrame:通过price_series._obj可以获取该Series所属的原始DataFrame,保证最终返回的是包含所有原始列的完整DataFrame。
  3. 收益率计算:直接使用传入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:35:14