Python 在给定行的N秒内,我的数据帧中是否有一行?
现在,我想为Python 在给定行的N秒内,我的数据帧中是否有一行?,python,pandas,Python,Pandas,现在,我想为s的每一行创建一个布尔列,指示在接下来的N秒内是否还有另一行 我可以使用itertools,但这不是pandonic,在我想在数据帧上这样做的情况下也不能很好地推广。我想解决的一个相关问题是: population = pd.date_range(periods=1000,start='2015-01-01',freq='s') timestamps = np.random.choice(population,size=16,replace=False) s = pd.Series(
s
的每一行创建一个布尔列,指示在接下来的N秒内是否还有另一行
我可以使用itertools,但这不是pandonic,在我想在数据帧上这样做的情况下也不能很好地推广。我想解决的一个相关问题是:
population = pd.date_range(periods=1000,start='2015-01-01',freq='s')
timestamps = np.random.choice(population,size=16,replace=False)
s = pd.Series(timestamps)
对于此数据帧中的每一行,是否有一行在接下来的N秒内具有相同的id\u col
值
我总是可以编写一个函数,它只需要一行,然后检查整个数据帧,但我觉得可能有更好的方法。想法?我认为这是一个关于连续值之间的时间差的问题(按时间戳排序后):
N='30s'
s_排序=s.排序值()
delta=s_排序-s_排序.shift()
flag=(增量
对于第二个问题,您可以使用相同的方法对id列进行分组。我认为这是一个关于连续值之间的时间差的问题(按时间戳排序后):
N='30s'
s_排序=s.排序值()
delta=s_排序-s_排序.shift()
flag=(增量
对于第二个问题,您可以使用相同的方法对id列进行分组。此方法计算前导窗口计数,其中窗口是从每个事件到未来的秒数。计数包括数据点,因此始终至少为1。如果在
领先窗口秒内发生三个事件,则计数为3
N = '30s'
s_sorted = s.sort_values()
deltas = s_sorted - s_sorted.shift()
flag = (deltas < N) | (deltas.shift(-1) < N)
pd.DataFrame({'s':s_sorted, 'flag':flag})
flag s
7 True 2015-01-01 00:00:04
0 True 2015-01-01 00:00:32
8 True 2015-01-01 00:00:50
4 True 2015-01-01 00:00:58
5 True 2015-01-01 00:01:42
2 True 2015-01-01 00:01:57
1 True 2015-01-01 00:02:15
12 False 2015-01-01 00:03:52
14 True 2015-01-01 00:05:32
6 True 2015-01-01 00:05:57
11 True 2015-01-01 00:08:24
3 True 2015-01-01 00:08:36
13 False 2015-01-01 00:10:07
9 True 2015-01-01 00:13:53
15 True 2015-01-01 00:14:20
10 False 2015-01-01 00:15:14
您的示例代码随机生成事件(不按时间顺序)。我将时间戳的计数增加为1,这样我们就可以对时间窗口内发生的事件数量进行汇总,然后在时间戳上添加一个索引
from datetime import timedelta
def lead_count(s, lead_in_s):
ssort = s.sort_index()
lead = ssort.index + timedelta(seconds=lead_in_s)
inds = np.searchsorted(ssort.index.astype(np.int64), lead.astype(np.int64)) - 1
cs = ssort.cumsum()
return pd.Series(cs[inds].values - cs.values + ssort[inds].values, index=ssort.index)
然后,如果您以30秒的窗口调用lead\u count
>>> s = pd.Series([1]*len(timestamps), index=timestamps)
>>> s
2015-01-01 00:00:26 1
2015-01-01 00:05:15 1
2015-01-01 00:13:57 1
2015-01-01 00:10:45 1
2015-01-01 00:05:46 1
2015-01-01 00:00:01 1
2015-01-01 00:15:00 1
2015-01-01 00:13:12 1
2015-01-01 00:16:23 1
2015-01-01 00:13:18 1
2015-01-01 00:07:56 1
2015-01-01 00:00:47 1
2015-01-01 00:04:23 1
2015-01-01 00:02:58 1
2015-01-01 00:03:24 1
2015-01-01 00:11:34 1
dtype: int64
,它对插入值使用相同的二进制搜索方法来查找滚动累积和,但它着眼于过去(滞后)而不是未来(超前) 此方法计算前导窗口计数,其中窗口是从每个事件到未来的秒数。计数包括数据点,因此始终至少为1。如果在领先窗口秒内发生三个事件,则计数为3
N = '30s'
s_sorted = s.sort_values()
deltas = s_sorted - s_sorted.shift()
flag = (deltas < N) | (deltas.shift(-1) < N)
pd.DataFrame({'s':s_sorted, 'flag':flag})
flag s
7 True 2015-01-01 00:00:04
0 True 2015-01-01 00:00:32
8 True 2015-01-01 00:00:50
4 True 2015-01-01 00:00:58
5 True 2015-01-01 00:01:42
2 True 2015-01-01 00:01:57
1 True 2015-01-01 00:02:15
12 False 2015-01-01 00:03:52
14 True 2015-01-01 00:05:32
6 True 2015-01-01 00:05:57
11 True 2015-01-01 00:08:24
3 True 2015-01-01 00:08:36
13 False 2015-01-01 00:10:07
9 True 2015-01-01 00:13:53
15 True 2015-01-01 00:14:20
10 False 2015-01-01 00:15:14
您的示例代码随机生成事件(不按时间顺序)。我将时间戳的计数增加为1,这样我们就可以对时间窗口内发生的事件数量进行汇总,然后在时间戳上添加一个索引
from datetime import timedelta
def lead_count(s, lead_in_s):
ssort = s.sort_index()
lead = ssort.index + timedelta(seconds=lead_in_s)
inds = np.searchsorted(ssort.index.astype(np.int64), lead.astype(np.int64)) - 1
cs = ssort.cumsum()
return pd.Series(cs[inds].values - cs.values + ssort[inds].values, index=ssort.index)
然后,如果您以30秒的窗口调用lead\u count
>>> s = pd.Series([1]*len(timestamps), index=timestamps)
>>> s
2015-01-01 00:00:26 1
2015-01-01 00:05:15 1
2015-01-01 00:13:57 1
2015-01-01 00:10:45 1
2015-01-01 00:05:46 1
2015-01-01 00:00:01 1
2015-01-01 00:15:00 1
2015-01-01 00:13:12 1
2015-01-01 00:16:23 1
2015-01-01 00:13:18 1
2015-01-01 00:07:56 1
2015-01-01 00:00:47 1
2015-01-01 00:04:23 1
2015-01-01 00:02:58 1
2015-01-01 00:03:24 1
2015-01-01 00:11:34 1
dtype: int64
,它对插入值使用相同的二进制搜索方法来查找滚动累积和,但它着眼于过去(滞后)而不是未来(超前) 你知道,我问的问题你是对的。我忘了问题的一部分。我将编辑它。很抱歉弄混了你能看看如何修改我的答案来得到你想要的吗?提示:试着重新理解标志
行正在做什么。你知道,正如我问的问题,你是对的。我忘了问题的一部分。我将编辑它。很抱歉弄混了你能看看如何修改我的答案来得到你想要的吗?提示:尝试并取消重新理解标志
行正在执行的操作。