2017-10-24 5 views
0

私はpythonでSQLAlchemyを使って時間の関数として中央値を計算しようとしています。私が探しているのは、指定された日付より下のすべての時間の中央値です。SQLの中央値が指定された日付、月の月よりも小さい

だから、いくつかの例のデータは、私が計算したいことは、その後8月にあるすべての値の中央値は、すべての8月の値と 9月の後、中央値、すべての中央値である

Date  Value 
2017-08-02 0.11 
2017-08-22 0.34 
2017-08-24 0.66 
2017-09-05 1.23 
2017-09-26 0.15 
2017-10-07 0.99 
2017-10-13 1.01 
2017-10-22 0.44 
2017-10-28 0.89 

です8月の値は 9月 10月です。

サンプル出力は次のようになります。

Date  Median 
2017-08-01 0.34 
2017-09-01 0.34 
2017-10-01 0.66 

実際のデータにはより多くの値があるため、中央値は実際に意味があります。私は1ヶ月にどれくらいのエントリーがあるのか​​を事前に知っていません。

ご協力いただければ幸いです。

+0

(1)使用しているデータベースで質問にタグを付けてください。 (2)おそらく基本SQLを使う方が良いでしょう。 –

答えて

0

私はより良い方法が存在することをかなり確信しているが、あなたはあなたのデータから数ヶ月を選択できる - ここのグループで最大日付で表される - その後、別途下記の各月の50パーセンタイルを計算すると:

months = select([func.max(tbl.c.date).label('date')]).\ 
    group_by(func.date_trunc('month', tbl.c.date)).\ 
    alias('months') 

percentiles = select([ 
     func.percentile_cont(0.5). 
      within_group(tbl.c.value). 
      label('median')]).\ 
    where(tbl.c.date <= months.c.date).\ 
    lateral('percentiles') 

query = select([months.c.date,\ 
       percentiles.c.median]).\ 
    order_by(months.c.date) 

結果ビーイング:必要に応じて

In [8]: engine.execute(query).fetchall() 
2017-10-25 16:44:18,637 INFO sqlalchemy.engine.base.Engine SELECT months.date, percentiles.median 
FROM (SELECT max(foo.date) AS date 
FROM foo GROUP BY date_trunc(%(date_trunc_1)s, foo.date)) AS months, LATERAL (SELECT percentile_cont(%(percentile_cont_1)s) WITHIN GROUP (ORDER BY foo.value) AS median 
FROM foo 
WHERE foo.date <= months.date) AS percentiles ORDER BY months.date 
2017-10-25 16:44:18,637 INFO sqlalchemy.engine.base.Engine {'percentile_cont_1': 0.5, 'date_trunc_1': 'month'} 
Out[8]: 
[(datetime.date(2017, 8, 24), 0.34), 
(datetime.date(2017, 9, 26), 0.34), 
(datetime.date(2017, 10, 28), 0.66)] 

月の1日に日付を切捨ては、非常に簡単でなければなりません。 LATERALの代わりにスカラーサブクエリを使用することもできます。

関連する問題