【发布时间】:2020-12-17 03:35:02
【问题描述】:
我有以下数据框:
data = {'month': {0: Timestamp('2019-01-01 00:00:00'),
1: Timestamp('2019-02-01 00:00:00'),
2: Timestamp('2019-03-01 00:00:00'),
3: Timestamp('2019-04-01 00:00:00'),
4: Timestamp('2019-05-01 00:00:00')},
'base_expenses': {0: 200.0, 1: 200.0, 2: 200.0, 3: 200.0, 4: 200.0},
'base_contribution': {0: 100.0, 1: 100.0, 2: 100.0, 3: 100.0, 4: 100.0}}
df = pd.DataFrame(data)
df
month base_expenses base_contribution
0 2019-01-01 200.0 100.0
1 2019-02-01 200.0 100.0
2 2019-03-01 200.0 100.0
3 2019-04-01 200.0 100.0
4 2019-05-01 200.0 100.0
此数据将代表一项投资,该投资每个月都会增加额外的贡献,并且每个月都会以一定的百分比增长。
例如,投资的起始余额为50000。每个月我们都会在余额中添加base_contribution。最后,余额每个月都会增长0.6%。
我可以使用如下循环计算所有这些:
CURRENT_BALANCE = 50000
MONTHLY_INVESTMENT_RETURN = 0.006
df['base_balance'] = CURRENT_BALANCE
for index, row in df.iterrows():
if index == 0:
balance = row['base_contribution'] + row['base_balance']
balance += balance * MONTHLY_INVESTMENT_RETURN
df.loc[row.name, 'base_balance'] = balance
else:
balance = row['base_contribution'] + df.loc[row.name - 1, 'base_balance']
balance += balance * MONTHLY_INVESTMENT_RETURN
df.loc[row.name, 'base_balance'] = balance
结果是:
month base_expenses base_contribution base_balance
0 2019-01-01 200.0 100.0 50422.344909
1 2019-02-01 200.0 100.0 50847.407197
2 2019-03-01 200.0 100.0 51275.204349
3 2019-04-01 200.0 100.0 51705.753960
4 2019-05-01 200.0 100.0 52139.073741
我正在处理的真实数据非常大,因此我希望尽可能避免这种循环方法。有没有办法在矢量化庄园或不循环的情况下做到这一点?
【问题讨论】:
-
根据您的代码,第一行我得到: (50000+100)*1.006 = 50400.6 。所以我不明白你是怎么得到 50422.344909 的。
-
大概用numpy写代码,用numba加速
-
@IsmaelELATIFI 这是因为为了简单起见,我将 MONTHLY_INVESTMENT_RETURN 舍入到小数点后 3 位。实际数字是 0.00643403011000343。我为混乱道歉,但问题的核心仍然存在。
-
好的,我明白了。顺便说一句,这里的向量化没有意义,因为您的计算是顺序的,即您需要计算第 N 行才能计算第 N+1 行。所以因为它不能并行化,所以不值得矢量化。
-
哦,好的,有道理,好点。谢谢。