通过计算来计算累积列

时间:2020-08-28 07:59:55

标签: python pandas

我有以下数据框:

tf.keras.datasets.imdb.load_data()

此数据将代表一项投资,该投资每月都会增加额外的出资,并且每月会以一定百分比增长。

例如,投资的期初余额为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

我正在使用的实际数据非常大,因此,如果可能的话,我宁愿避免这种循环方法。有没有办法在向量化庄园中做到这一点,或者没有循环?

2 个答案:

答案 0 :(得分:0)

根据此post,这似乎不可行

您可以在每个循环中保存一个if。并且df.at也是在数据帧中设置值的更快方法。

balance = df.loc[0, 'base_contribution'] + df.loc[0, 'base_balance']
balance += balance * MONTHLY_INVESTMENT_RETURN
df.at[0, 'base_balance'] = balance

for index, row in df[1:].iterrows():
    balance = row['base_contribution'] + df.loc[row.name - 1, 'base_balance']
    balance += balance * MONTHLY_INVESTMENT_RETURN
    df.at[index, 'base_balance'] = balance

我找到了有趣的方法:rollingcumsumexpanding。但由于我们不知道start时base_contribution的值,因此这里无济于事。

答案 1 :(得分:0)

假设base_balance是恒定的。

通过一个中间步骤,您可以执行所需的操作: 请记住,您可以将投资分成多个部分,并计算每个部分的回报。

因此,第n个月时的期初余额(CURRENT_BALANCE)的结果值可以写为:

df["result_on_start_investment"] =  CURRENT_BALANCE * math.pow(MONTHLY_INVESTMENT_RETURN,  np.arange(len(df)) + 1)

每个月将额外的金额添加到投资中。这笔款项每个月都会得到回报。第一步计算

df["result_on_added_at_month_one"] = base_balance * math.pow(MONTHLY_INVESTMENT_RETURN,  np.arange(len(df)) + 1)

最后,由于在n-1个月增加的货币收入等于在第2个月的第1个月增加的货币收入:

df["balance"] = df["result_on_start_investment"] + df["result_on_added_at_month_one"].cumsum()

结果:

month  base_expenses  base_contribution  n  result_on_added_at_month_one  result_on_start_investment       balance
0      0          200.0              100.0  1                    100.643403                50321.701506  50422.344909
1      1          200.0              100.0  2                    101.290946                50645.472848  50847.407197
2      2          200.0              100.0  3                    101.942655                50971.327345  51275.204349
3      3          200.0              100.0  4                    102.598557                51299.278400  51705.753960
4      4          200.0              100.0  5                    103.258679                51629.339502  52139.073741