如何在 pandas DataFrame 中进行递归计算?
How to do a recursive calculation in a pandas DataFrame?
我有一个 DataFrame,其中包含量化投资算法产生的买卖操作。然后我尝试用一个初始值投入进行模拟,以计算每次操作后的最终资本。
为此,我创建了一个名为 'money' 的新列,我尝试在其中进行递归计算。其中 'money' 列的当前值是先前值乘以操作的 profit/loss 百分比。
ops_df['money'] = list( repeat(TOTAL_INVESTED, len(ops_df)) )
ops_df['money'] = (1 + ops_df.profit_perc.shift(1)) * ops_df.money.shift(1)
ops_df.head(10)
然而,预期的递归计算并没有发生。我很怀疑,因为归因的右侧是在归因之前完整计算的。
我设法使用公共循环解决了这个计算,但我把它记在了脑海里。必须有更好、更有效的方法来进行此计算。我想知道如果有,会是什么样子?
TOTAL_INVESTED = 1000
money = [TOTAL_INVESTED, ]
for i in range(1, len(ops_df)):
curr_money = round( money[i-1] * (1 + ops_df.profit_perc.iloc[i]), 2 )
money.append(curr_money)
ops_df['money'] = money
数据:
{'profit_perc': [-0.039548, 0.490518, 0.127511, -0.019439]}
您可以使用 cumprod
。这个想法是找到每一行的收益率并将其乘以初始投资:
TOTAL_INVESTED = 1000
df = pd.DataFrame({'profit_perc': [-0.039548, 0.490518, 0.127511, -0.019439]})
df['money'] = df['profit_perc'].shift(-1).add(1).cumprod().mul(TOTAL_INVESTED).shift().fillna(TOTAL_INVESTED)
输出:
profit_perc money
0 -0.039548 1000.000000
1 0.490518 1490.518000
2 0.127511 1680.575441
3 -0.019439 1647.906735
我有一个 DataFrame,其中包含量化投资算法产生的买卖操作。然后我尝试用一个初始值投入进行模拟,以计算每次操作后的最终资本。
为此,我创建了一个名为 'money' 的新列,我尝试在其中进行递归计算。其中 'money' 列的当前值是先前值乘以操作的 profit/loss 百分比。
ops_df['money'] = list( repeat(TOTAL_INVESTED, len(ops_df)) )
ops_df['money'] = (1 + ops_df.profit_perc.shift(1)) * ops_df.money.shift(1)
ops_df.head(10)
然而,预期的递归计算并没有发生。我很怀疑,因为归因的右侧是在归因之前完整计算的。
我设法使用公共循环解决了这个计算,但我把它记在了脑海里。必须有更好、更有效的方法来进行此计算。我想知道如果有,会是什么样子?
TOTAL_INVESTED = 1000
money = [TOTAL_INVESTED, ]
for i in range(1, len(ops_df)):
curr_money = round( money[i-1] * (1 + ops_df.profit_perc.iloc[i]), 2 )
money.append(curr_money)
ops_df['money'] = money
数据:
{'profit_perc': [-0.039548, 0.490518, 0.127511, -0.019439]}
您可以使用 cumprod
。这个想法是找到每一行的收益率并将其乘以初始投资:
TOTAL_INVESTED = 1000
df = pd.DataFrame({'profit_perc': [-0.039548, 0.490518, 0.127511, -0.019439]})
df['money'] = df['profit_perc'].shift(-1).add(1).cumprod().mul(TOTAL_INVESTED).shift().fillna(TOTAL_INVESTED)
输出:
profit_perc money
0 -0.039548 1000.000000
1 0.490518 1490.518000
2 0.127511 1680.575441
3 -0.019439 1647.906735