【问题标题】:Appending function created column to an existing data frame将函数创建的列附加到现有数据框
【发布时间】:2017-09-05 13:44:22
【问题描述】:

我目前有如下数据框:

并希望添加基于以下函数计算的列 E。

def geometric_brownian_motion(T = 1, N = 100, mu = 0.1, sigma = 0.01, S0 = 20):
    dt = float(T)/N
    t = np.linspace(0, T, N)
    W = np.random.standard_normal(size = N)
    W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ###
    X = (mu-0.5*sigma**2)*t + sigma*W
    S = S0*np.exp(X) ### geometric brownian motion ###
    return S

(源自here

如何为数据框中包含的所有日期创建时间序列并附加它?

函数输入参数如下:

T = (#days between df row 1 和 df last)/365

N = # 数据框中的行

S0 = 100

【问题讨论】:

  • “起始价格 = 100”呢?在函数中看不到它。
  • 对不起,修改为S0

标签: python numpy


【解决方案1】:

据我了解,问题的本质是如何对每一列应用某种方法,同时考虑到计算新值需要数据帧中的索引这一事实:

我建议您将索引提取为单独的列并像往常一样使用 apply。

from functools import partial
df['index'] = df.index
T = # precalculate T here
N = df.shape[0]
applying_method = partial(geometric_brownian_motion,T=T,N=N, S0=100)
df['E'] = df.apply(lambda row: applying_method(*row),axis=1)

或者,如果您根据函数参数重命名数据框的列:

df['E'] = df.apply(lambda row: applying_method(**row),axis=1)

希望对您有所帮助。

【讨论】:

  • 感谢您的回复。我实际上并不想将函数应用于每一列,只是为了根据索引中的日期和上面的函数为列 [E] 创建一个时间序列。
  • 我更新了答案,@S.Peters。如果您重命名原始数据框中的列,我可以改进它,并描述如何应用您的函数,以便它们与函数的参数匹配。
  • 更新了函数输入定义的问题。
  • 对不起,但我仍然对数据框列与函数参数的关系感到困惑。数据框的'A','B','C','D'是什么意思?请将它们命名为与函数的参数相同。
  • 它们只是现有的列,唯一相关的是我需要使用现有的日期为列 E 创建时间序列。基本上试图复制上面链接中的示例,而不是将其应用于一系列日期,将其应用于现有数据框中的日期并将结果添加为列。
猜你喜欢
  • 2014-01-11
  • 2020-11-13
  • 2019-09-17
  • 2023-03-17
  • 2019-08-30
  • 1970-01-01
  • 2022-01-04
  • 2021-06-06
  • 2023-02-01
相关资源
最近更新 更多