这个问题与我能找到的其他类似问题不同,因为我试图将回望窗口和阈值组合成一个滚动总和。实际上,我不确定我要做的事情是否可以一步到位:
我有一个带有datetime列和value列的dataframe。我创建了一个列,在滚动时间窗口中对值列(V)求和。但是,我希望这个滚动总和在达到某个阈值后重置为0
我不知道是否有可能在一个列操作步骤中实现这一点,因为在求和的每个步骤中都有两个条件——回望窗口和阈值。如果有人有任何想法,如果这是可能的,我可能会如何实现它,请让我知道。我知道如何迭代执行此操作,但速度非常慢(我的数据帧有>;100万个条目)
例如:
回溯时间: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 |
+---+-----------------------+-------+---------+----------------+
在本例中,sum rulling sum将不考虑行上或之前任何超过(或等于)阈值3的值
下面的方法无论如何都不能节省内存,但它应该比循环更快。它假定时间是连续的,以便委托给numpy方法,否则可以在调用之前包含缺少的时间
把它当作
输出
请注意,在10:05时,它如何输出4,而不是预期输出中的5。根据你的逻辑,应该是4;该窗口包含
[2, 1, 0, 4]
,由于前两个数字和为3,因此该窗口应重置并返回0+4我找不到一种矢量化的方法来在每次达到阈值时重置为0
但是Pandas列的底层容器是一个numpy数组,迭代一个numpy数组需要一段可接受的时间。因此,我想:
它给出:
在我的i5机器上,长度为1000000的数组只需要几秒钟(10000的数组大约需要90秒)
相关问题 更多 >
编程相关推荐