引用Pandas中的前一行应用函数逻辑



我正在尝试创建一个剪裁的cumsum。但是,剪裁是基于前一行的值。

下面是我试图生成的数据示例。

╔══════╦═══════════════════╦═════════════════════╦════════════╦═══════════╦══════════════════╗
║ Idx  ║ datetime          ║ energy_consumption  ║ energy_pv  ║ spare_pv  ║ cumsum_spare_pv  ║
╠══════╬═══════════════════╬═════════════════════╬════════════╬═══════════╬══════════════════╣
║ 1    ║ 18/09/2021 04:00  ║ 15.5                ║ 0          ║ -15.5     ║ 42.546           ║
║ 2    ║ 18/09/2021 05:00  ║ 15.2                ║ 0          ║ -15.2     ║ 27.346           ║
║ 3    ║ 18/09/2021 06:00  ║ 15.5                ║ 0.667      ║ -14.833   ║ 12.513           ║
║ 4    ║ 18/09/2021 07:00  ║ 15.1                ║ 5.598      ║ -9.502    ║ 3.011            ║
║ 5    ║ 18/09/2021 08:00  ║ 17.1                ║ 10.638     ║ -6.462    ║ 0                ║
║ 6    ║ 18/09/2021 09:00  ║ 17.4                ║ 15.146     ║ -2.254    ║ 0                ║
║ 7    ║ 18/09/2021 10:00  ║ 17.5                ║ 19.44      ║ 1.94      ║ 1.94             ║
║ 8    ║ 18/09/2021 11:00  ║ 18.1                ║ 23.226     ║ 5.126     ║ 7.066            ║
║ 9    ║ 18/09/2021 12:00  ║ 19.5                ║ 26.246     ║ 6.746     ║ 13.812           ║
║ 10   ║ 18/09/2021 13:00  ║ 20.5                ║ 26.864     ║ 6.364     ║ 20.176           ║
║ 11   ║ 18/09/2021 14:00  ║ 19.6                ║ 24.792     ║ 5.192     ║ 25.368           ║
║ 12   ║ 18/09/2021 15:00  ║ 18.4                ║ 18.869     ║ 0.469     ║ 25.837           ║
║ 13   ║ 18/09/2021 16:00  ║ 18.3                ║ 12.319     ║ -5.981    ║ 19.856           ║
║ 14   ║ 18/09/2021 17:00  ║ 19.4                ║ 4.637      ║ -14.763   ║ 5.093            ║
║ 15   ║ 18/09/2021 18:00  ║ 18.7                ║ 0          ║ -18.7     ║ 0                ║
║ 16   ║ 18/09/2021 19:00  ║ 18.8                ║ 0          ║ -18.8     ║ 0                ║
╚══════╩═══════════════════╩═════════════════════╩════════════╩═══════════╩══════════════════╝

我有能耗和光伏柱。spare_pv易于使用生成

df['PV'] - df['energy_consumption']

然而,我不知道如何创建cumsum列。这不能使用pd.Series.cumsum()来完成,因为如果上面的行是0,则需要逻辑来剪裁该值。我有一个excel公式,我目前正在使用它来生成这个函数。对于本例,列为:

A: Idx, B: datetime, C: energy_consumption, D: energy_pv, E: spare_pv, F: cumsum_spare_pv

第1行将首先进行计算,然后第2行将具有以下公式:

=IF((E2+F1)<=0, 0, E2+F1)

我可以通过创建一个列表并在DF上循环来附加值(类似于这里建议的方式(来实现这一点,但考虑到这个数据集有几十万行,这将非常缓慢。

由于cumsum是有条件的,我认为没有办法循环它。

与其使用iloc并为此目的(这很慢(,不如使用numpy。

D = df['spare_pv'].values
# D = np.random.random(5000000)-0.5
start_value = 42.546+15.5
new_val = start_value+D[0]
D[0] =  new_val if new_val >0 else 0
for i in range(1,len(D)):
new_val = D[i]+D[i-1]
D[i] = new_val if new_val >0 else 0
df['cumsum_spare_pv'] = D

我也在随机的500万个值上尝试过这个操作,它在3秒内左右完成,所以应该还可以