gpt4 book ai didi

database - SAS:按照几个 proc 过程生成输出数据库

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:04 27 4
gpt4 key购买 nike

我还是 SAS 的新手,我想知道如何才能做到以下几点:

假设我有一个包含以下信息的数据库:

Time_during_the day    date    prices   volume_traded
930am sep02 42 300
10am sep02 41 200
..4pm sep02 40 200
930am sep03 40 500
10am sep03 41 100
..4pm sep03 40 350
.....

我想要的是取每日总交易量的平均值并将该数字除以 50(总是)。所以说 avg.daily vol./50 = V;我想要的是在每个大小为 V 的时间间隔记录价格/时间/日期。现在,假设 V=500,我首先在我的数据库中记录第一个价格、时间和日期,然后记录相同的信息 500后期成交量。有可能某一天交易量为 300,其中一半将覆盖 v=500,另外 150 将用于填补以下间隔。

如何在一个数据库中获取这些信息?谢谢!

最佳答案

假设您的输入数据集名为 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;

future 要牢记的关键 SAS 语言功能是使用 BY , FIRST , 和 RETAIN一起。这使得有状态遍历像这样的数据成为可能。有条件OUTPUT这里也有数字。

请注意,无论何时使用 BY <var> ,数据集必须按包含 <var> 的键排序.在tick_data的情况下和所有中间临时表,它是。

附加:备选方案V

为了使 V 等于(平均每日总交易量/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取总和的平均值。注意怎么没有 BY声明,因为我们是在整个集合上取平均值,而不是按任何分组或桶取平均值。另请注意 MEAN (...) == 之后没有名字.这将使输出变量与输入变量同名。

关于database - SAS:按照几个 proc 过程生成输出数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11011439/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com