- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个由日期时间索引和 bool 列组成的数据框;是否有一种有效的(非循环)方法来执行以下操作:
对于每一行,查找目标列中的任何 bool 值在接下来的1小时内是否为 True 时间表。
例如:
现在我已经有了一个循环,但如果有任何关于如何改进它的建议,我将不胜感激。
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/
我是一名优秀的程序员,十分优秀!