Python 在PostgreSQL中,如何计算具有移动时间窗口的时间序列中的条目数

Python 在PostgreSQL中,如何计算具有移动时间窗口的时间序列中的条目数,python,postgresql,pandas,Python,Postgresql,Pandas,所以我有这样的数据: index price 2015-01-08 07:01:18.601318 10 2015-01-08 07:01:19.100645 10 2015-01-08 07:01:19.600494 24 2015-01-08 07:01:20.101432 22 2015-01-08 07:01:20.102579 235 2015-01-08 07:01:20.600370 1050 2015-01-08 07:01:

所以我有这样的数据:

index                      price
2015-01-08 07:01:18.601318  10
2015-01-08 07:01:19.100645  10
2015-01-08 07:01:19.600494  24
2015-01-08 07:01:20.101432  22
2015-01-08 07:01:20.102579  235
2015-01-08 07:01:20.600370  1050
2015-01-08 07:01:20.603521  100
2015-01-08 07:01:20.800408  50
2015-01-08 07:01:21.100629  10
2015-01-08 07:01:21.601491  12
2015-01-08 07:01:21.601663  97
我想要的是在每个条目后面有一个指定时间长度的移动窗口,比如1秒,并计算该窗口内有多少条条目

结果应该类似于:

index                      price    rate
2015-01-08 07:01:18.601318  10       1
2015-01-08 07:01:19.100645  10       2
2015-01-08 07:01:19.600494  24       3
2015-01-08 07:01:20.101432  22       2
2015-01-08 07:01:20.102579  235      3
2015-01-08 07:01:20.600370  1050     4
2015-01-08 07:01:20.603521  100      4
2015-01-08 07:01:20.800408  50       5
2015-01-08 07:01:21.100629  10       6
2015-01-08 07:01:21.601491  12       4
2015-01-08 07:01:21.601663  97       5
这是为了计算这些条目输入数据库的速率

看起来我需要某种滑动扩展窗口,但我无法让它工作

如果这是可行的熊猫数据帧也将工作。 我知道我可以使用pandas中的TimeGrouper按秒对它们进行分组,并计算每个组的计数,但我在索引复制方面还有其他问题,而且这会删除信息:

df['rate'] = df.groupby(pd.TimeGrouper('1s'))['price'].transform('count')

我认为你不能有不同行大小的滑动窗/框架

对于这个例子来说,这是可行的(但非常可怕):


当然,按秒(而不是前一秒)进行分区是很容易的。

我认为不能有不同行大小的滑动窗口/帧

对于这个例子来说,这是可行的(但非常可怕):


当然,按秒(而不是前一秒)进行分区是很容易的。

当我尝试这样做时,我会找到一条通向高值的路。我认为原因是它创建了一个交叉连接。在进行解释分析时,我从每个表中提取22行,最后删除了208行,留下了许多重复行。好吧,使用distinct和subqueries使其正常工作,不幸的是,我处理的是相当大的数据集,使得这些连接非常耗时。哦,是的,我说这很可怕时是认真的。出于好奇,为什么您需要每个条目的窗口,而不是按秒对它们进行分组(即同一秒中的两个条目具有相同的速率)?我对每个特定条目前一秒发生的情况感兴趣,以便能够分析该条目的延迟。假设每秒有100个条目的突发,分组到该秒的所有条目的速率都将为100,而第一个条目实际上不会受到系统中最终排队的影响。尝试这样做时,我会获得较高的值。我认为原因是它创建了一个交叉连接。在进行解释分析时,我从每个表中提取22行,最后删除了208行,留下了许多重复行。好吧,使用distinct和subqueries使其正常工作,不幸的是,我处理的是相当大的数据集,使得这些连接非常耗时。哦,是的,我说这很可怕时是认真的。出于好奇,为什么您需要每个条目的窗口,而不是按秒对它们进行分组(即同一秒中的两个条目具有相同的速率)?我对每个特定条目前一秒发生的情况感兴趣,以便能够分析该条目的延迟。假设在一秒钟内有100个条目的突发事件,分组到该秒的所有条目的速率将为100,而第一个条目实际上不会受到系统中最终排队的影响。
SELECT t1.index, count(*) AS rate
FROM the_table t1
JOIN the_table t2 ON (t2.index BETWEEN t1.index - interval '1s' AND t1.index)
GROUP BY 1 ORDER BY 1;