![](/img/trans.png)
[英]How to do calculation on pandas dataframe that require processing multiple rows?
[英]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.