簡體   English   中英

如何在pandas DataFrame中進行遞歸計算?

[英]How to do a recursive calculation in a pandas DataFrame?

我有一個 DataFrame,其中包含量化投資算法產生的買賣操作。 然后我嘗試用初始值進行模擬,以計算每次操作后產生的資本。

一塊數據框

為此,我創建了一個名為“money”的新列,我嘗試在其中進行遞歸計算。 其中“money”列的當前值是先前值乘以操作的利潤/損失百分比。

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)

Output:

   profit_perc        money
0    -0.039548  1000.000000
1     0.490518  1490.518000
2     0.127511  1680.575441
3    -0.019439  1647.906735

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM