2016-04-27 9 views
1

とPostgreSQLの時系列のエントリの割合を計算することができますので、私はこのようなデータを持っている:私が欲しいものはどのように私は移動時間窓

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で実行可能な場合。 私はパンダにTimeGrouperを使用して秒でグループにそれらを私ができる知っていると、各グループの数を計算するが、私は、インデックスの重複であり、他の問題を抱えているし、また、これは情報を削除します。

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

答えて

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; 

パーティションは、もちろん、非常に容易です。

+0

これを試してみると、私は高い値に到達します。理由はクロスジョイントを作成するためです。 Explain分析を実行すると、各テーブルから22行がフェッチされ、208が削除され、多くの重複が残されます。 – Unic0arn

+0

申し訳ありませんが、私は非常に大きなデータセットを処理しているため、これらの結合に非常に時間がかかります。 – Unic0arn

+0

ああ、私がそれが恐ろしいと言ったとき、私はそれを意味しました。好奇心の理由から、2番目にグループ化するのではなく、1つのエントリごとにウィンドウが必要なのはなぜですか(つまり、同じ秒の2つのエントリは同じレートになります)。 – Dmitri

関連する問題