我正在尝试创建一个剪裁的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秒内左右完成,所以应该还可以