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

标签 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')

最佳答案

我不认为你可以有不同行大小的滑动窗口/框架。

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

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;

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

关于python - 如何使用移动时间窗口计算 PostgreSQL 时间序列中的条目率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36891203/

相关文章:

SQL:一组结果中有两个查询?

node.js - knexjs postgresql 迁移运行不正常

python - 为什么 asyncio 事件循环有时即使遇到 `RuntimeError` 也能完成任务?

python - 如何通过按键组合多个查询集?

sql group by date给出错误的结果

python - 根据每个 DataFrame 行的匹配值将列表的值添加到 pandas DataFrame 列

python - Pandas - 在两列中查找具有匹配值的行并在另一列中乘以值

python - 无法正确读取Python中的SQL表: varchar columns imported as comma-separated characters/tuples

python - 一维数组的形状给出 'tuple' 对象不可调用?

python - 删除python中的所有标点符号