这个问题与我可以找到的其他类似问题不同,因为我试图将回溯窗口和阈值合并为一个滚动总和。我实际上不确定我要做什么可以一步完成:
我有一个带有datetime列和value列的pandas数据框。我创建了一个列,该列将滚动时间窗口内的值列(V)相加。但是,我希望此滚动总和在达到某个阈值时重置为0。
我不知道是否可以在一个列操作步骤中执行此操作,因为总和中的每个步骤都有两个条件在起作用-回溯窗口和阈值。如果有人对这是否可行以及如何实现这一目标有任何想法,请告诉我。我知道如何迭代地执行此操作,但是它非常慢(我的数据框有> 1百万个条目)。
例:
回溯时间:3分钟
阈值:3
+---+-----------------------+-------+--------------------------+
| | myDate | V | rolling | desired_column |
+---+-----------------------+-------+---------+----------------+
| 1 | 2020-04-01 10:00:00 | 0 | 0 | 0 |
| 2 | 2020-04-01 10:01:00 | 1 | 1 | 1 |
| 3 | 2020-04-01 10:02:00 | 2 | 3 | 3 |
| 4 | 2020-04-01 10:03:00 | 1 | 4 | 1 |
| 5 | 2020-04-01 10:04:00 | 0 | 4 | 1 |
| 6 | 2020-04-01 10:05:00 | 4 | 7 | 5 |
| 7 | 2020-04-01 10:06:00 | 1 | 6 | 1 |
| 8 | 2020-04-01 10:07:00 | 1 | 6 | 2 |
| 9 | 2020-04-01 10:08:00 | 0 | 6 | 0 |
| 10| 2020-04-01 10:09:00 | 3 | 5 | 5 |
+---+-----------------------+-------+---------+----------------+
在此示例中,总和舍入总和将不考虑行上(或等于)阈值3的任何值。
最佳答案
我找不到找到每次达到阈值时都重置为0的矢量化方法。
但是,Pandas列的基础容器是一个numpy数组,并且迭代numpy数组需要花费可接受的时间。所以我会:
arr = np.zeros(len(df), dtype='int')
cum = 0
src = df['V'].values
dt = df['myDate'].values
start = 0
for i in range(len(df)):
cum += src[i]
while dt[start] < dt[i] - np.timedelta64(4, 'm'):
cum -= src[start]
start +=1
arr[i] = cum
if cum >=3:
cum = 0
start = i
df['desired_column'] = arr
它给 :
myDate V rolling desired_column
1 2020-04-01 10:00:00 0 0 0
2 2020-04-01 10:01:00 1 1 1
3 2020-04-01 10:02:00 2 3 3
4 2020-04-01 10:03:00 1 4 1
5 2020-04-01 10:04:00 0 4 1
6 2020-04-01 10:05:00 4 7 5
7 2020-04-01 10:06:00 1 6 1
8 2020-04-01 10:07:00 1 6 2
9 2020-04-01 10:08:00 0 6 2
10 2020-04-01 10:09:00 3 5 5
在我的i5机器上,长度为1000000的数组只需要几秒钟(10000秒为90s)
关于python - 创建滚动总和列,一旦达到阈值即会重置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60990784/