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;