这个问题与我可以找到的其他类似问题不同,因为我试图将回溯窗口和阈值合并为一个滚动总和。我实际上不确定我要做什么可以一步完成:

我有一个带有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/

10-13 06:59