入力データセットが tick_data と呼ばれ、 と の両方でソートされているdate
としtime_during_the_day
ます。次に、私が得たものは次のとおりです。
%LET n = 50;
/* Calculate V - the breakpoint size */
PROC SUMMARY DATA=tick_data;
BY date;
OUTPUT OUT = temp_1
SUM (volume_traded)= volume_traded_agg;
RUN;
DATA temp_2 ;
SET temp_1;
V = volume_traded_agg / &n;
RUN;
/* Merge it into original dataset so that it is available */
DATA temp_3;
MERGE tick_data temp_2;
BY date;
RUN;
/* Final walk through tick data to output at breakpoints */
DATA results
/* Comment out the KEEP to see what is happening under the hood */
(KEEP=date time_during_the_day price volume_traded)
;
SET temp_3;
/* The IF FIRST will not work without the BY below */
BY date;
/* Stateful counters */
RETAIN
volume_cumulative
breakpoint_next
breakpoint_counter
;
/* Reset stateful counters at the beginning of each day */
IF (FIRST.date) THEN DO;
volume_cumulative = 0;
breakpoint_next = V;
breakpoint_counter = 0;
END;
/* Breakpoint test */
volume_cumulative = volume_cumulative + volume_traded;
IF (breakpoint_counter <= &n AND volume_cumulative >= breakpoint_next) THEN DO;
OUTPUT;
breakpoint_next = breakpoint_next + V;
breakpoint_counter = breakpoint_counter + 1;
END;
RUN;
将来のために留意すべき重要な SAS 言語機能はBY
、 、FIRST
、および をRETAIN
一緒に使用することです。これにより、このようなデータのステートフル ウォークが可能になります。条件付きOUTPUT
もここに表示されます。
BY <var>
を使用するときはいつでも、データセットは を含むキーでソートする必要があることに注意してください<var>
。tick_data
およびすべての中間一時テーブルの場合は、そうです。
追加: 代替 V
V を (1 日の平均総ボリューム / n) に等しくするには、上記の一致するコード ブロックを次のコードに置き換えます。
. . . . . .
/* Calculate V - the breakpoint size */
PROC SUMMARY DATA=tick_data;
BY date;
OUTPUT OUT = temp_1
SUM (volume_traded)= volume_traded_agg;
RUN;
PROC SUMMARY DATA = temp_1
OUTPUT OUT = temp_1a
MEAN (volume_traded_agg) =;
RUN;
DATA temp_2 ;
SET temp_1a;
V = volume_traded_agg / &n;
RUN;
/* Merge it into original dataset so that it is available */
DATA temp_3 . . . . . .
. . . . . .
PROC SUMMARY
基本的には、合計の平均を取るために1 秒挿入するだけです。BY
グループやバケットごとではなく、セット全体を平均しているため、ステートメントがないことに注意してください。MEAN (...) =
の後に名前がないことにも注意して=
ください。これにより、出力変数が入力変数と同じ名前になります。