如何使用移动时间窗口计算PostgreSQL中时间序列中的条目速率

时间:2016-04-27 13:26:00

标签: 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: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 DataFrame是可行的。 我知道我可以使用Pandas中的TimeGrouper将它们分组,然后计算每个组的计数,但我还有其他问题,包括索引重复,这也会删除信息:

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

1 个答案:

答案 0 :(得分:0)

我认为你不能拥有不同行尺寸的滑动窗户/框架。

这适用于该示例(但非常可怕):

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;

当然,按第二个分区(而不是前面的第二个)将非常简单。