gpt4 book ai didi

python - Pandas - 矢量化 "any element in a column within the next timeframe is True"

转载 作者:行者123 更新时间:2023-11-30 21:51:17 26 4
gpt4 key购买 nike

所以我有一个由日期时间索引和 bool 列组成的数据框;是否有一种有效的(非循环)方法来执行以下操作:

对于每一行,查找目标列中的任何 bool 值在接下来的1小时内是否为 True 时间表。

例如:

enter image description here

现在我已经有了一个循环,但如果有任何关于如何改进它的建议,我将不胜感激。

pd.DataFrame({'target': {Timestamp('2019-03-08 10:02:24.705000'): False,
Timestamp('2019-03-08 12:55:21.586000'): False,
Timestamp('2019-03-08 13:01:36.574000'): True,
Timestamp('2019-03-08 18:13:18.041000'): False,
Timestamp('2019-03-08 18:54:29.286000'): False,
Timestamp('2019-03-09 10:16:55.969000'): False,
Timestamp('2019-03-09 13:00:41.357000'): False,
Timestamp('2019-03-09 15:51:43.340000'): False,
Timestamp('2019-03-09 16:37:31.487000'): True,
Timestamp('2019-03-10 14:20:40.158000'): False,
Timestamp('2019-03-10 15:12:52.386000'): False,
Timestamp('2019-03-11 08:11:57.956000'): False,
Timestamp('2019-03-11 12:17:35.041000'): False,
Timestamp('2019-03-11 13:23:43.058000'): False,
Timestamp('2019-03-11 20:31:03.062000'): False,
Timestamp('2019-03-11 20:55:30.677000'): False,
Timestamp('2019-03-12 10:38:44.177000'): False,
Timestamp('2019-03-12 12:25:37.269000'): False,
Timestamp('2019-03-12 13:40:54.494000'): False,
Timestamp('2019-03-12 18:49:28.487000'): False,
Timestamp('2019-03-13 09:58:23.547000'): True}})

编辑:添加了数据帧示例,以便于复制/粘贴并在 Python 中重新创建它

最佳答案

为了查看向前窗口,您需要使用 Pandas 1.0 中的一项新功能,该功能允许您使用自定义索引器执行rolling(),该索引器将让您选择一个及时前进的窗口。

参见Dynamic window size with rolling functions在这篇 Medium 文章中讨论了 Pandas 1.0 中的新功能。

为了使用此功能,您需要定义 BaseIndexer 的新子类它定义了适当的 get_window_bounds() 方法。

get_window_bounds() 方法应返回一个包含两个数组的元组,第一个数组包含起始偏移量,第二个数组包含结束偏移量,索引中的每一行都有一个元素。

在您的情况下,您可以使用简单的 arange() 作为起始偏移量(从元素本身或以下元素开始。)对于结束偏移量,我使用 searchsorted () 查找 future 1 小时间隔或之前的索引条目。

我实现了对 rolling()lined 参数的处理,因此您可以使用 lined="left" 来考虑当前时间戳在窗口内,close="right" 将 future 一小时内的条目作为窗口的一部分包含在内,lated="both" 将两者都接受为有效。

代码如下:

import pandas as pd
import numpy as np

from pandas.api.indexers import BaseIndexer

class ForwardTimewindowIndexer(BaseIndexer):
def get_window_bounds(
self,
num_values=0,
min_periods=None,
center=None,
closed=None,
):
start = np.arange(0, num_values, dtype='int64')
if closed not in ['left', 'both']:
start += 1
search_side = 'left'
if closed in ['right', 'both']:
search_side='right'
end = self.index_array.searchsorted(
self.index_array + self.window_size,
side=search_side,
).astype('int64')[:num_values]
return (start, end)

您可以将其用于:

indexer = ForwardTimewindowIndexer(
index_array=df.index,
window_size=pd.to_timedelta('1h'),
)
df['required_col'] = df['target'].rolling(indexer).sum().astype(bool)

这应该会产生您所描述的确切结果。

关于python - Pandas - 矢量化 "any element in a column within the next timeframe is True",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60141818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com