SSブログ

シーケンス関数 @SINCE [データサイエンス、統計モデル]

PASW Modeler(旧 Clementine)で便利な関数がある。
@SINCE と @THIS を組み合わせる下記にあるような集計を行うことができる。



今、user, date, pv というフィールドがあったとする。
同じユーザで、かつ、日付が1週間以内のPV数の合計を計算したい場合どうするか?

例えば、user = 4, date = 2009-05-24 の時は、同じユーザで1週間以内のPV数は、

と計算できる。

ここでややこしいのは、ユーザが変わる場合と、日付が1週間以内という判定条件において、@OFFSET がレコードごとに異なってくるのが面倒だ。

1つのフィールドノードでも書けるのだが、まずは、二つの条件を別々に考えてみる。

--------------------------------------------------
@SINCE(EXPR): 任意のCLEM 式が真(true) の場合に、EXPR から過ぎたレコード数を返します。

@THIS(FIELD): 現在のレコードのFIELD で指定された名前のフィールドの値を返します。
@SINCE 式でだけ使用されます。

@SUM(FIELD, EXPR): 現在のレコードを含めて、現在のノードが受け取った最後のEXPR レコードまでの、FIELD の値の合計値を返します。
FIELD は数値型フィールドの名前でなければなりません。
EXPR は、0より大きい整数を評価する任意の式を使用できます。
EXPR を省略した場合、またはEXPR の値が、現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの合計が返されます。
INT には、参照する値の最大数を指定します。
この方法は、2 つの引数だけを使用するよりも効率的です。
--------------------------------------------------

Step0: ユーザ、日付でソートしておきます。

Step1: ユーザが変わる部分の OFFSET を探しにいきます。


Step2: 1週間以内という条件の OFFSET を探しにいきます。


Step3: min(since1, since2)で 小さい方の OFFSET を取ってきます。


Step4: @SUM(pv, since)で OFFSET 分だけ合計します。


以上でやりたかった集計ができます。


冒頭でも書いたとおり、Step1~Step4をまとめて書くと


@SUM(pv, @SINCE(user = @THIS(user) and date_days_difference(date, @THIS(date)) >= 7 or date_days_difference(date, @THIS(date)) < 0))

と書ける。

nice!(2) 
共通テーマ:学問

nice! 2