楼主: tangb
3244 14

谁能帮忙给个思路? 我想批量处理199家公司 的年数据集 [推广有奖]

  • 30关注
  • 0粉丝

svip1

教授

12%

(VIP/贵宾)二级

61%

威望
0
论坛币
11137 个
通用积分
0
学术水平
3 点
热心指数
5 点
信用等级
0 点
经验
13207 点
帖子
437
精华
0
在线时间
1900 小时
注册时间
2009-8-27
最后登录
2024-4-8

300论坛币
我已经搞完了 一个公司的数据处理的程序,其中核心部分是:

1。处理一个公司的一天的数据,
2。然后用宏循环365次(当然,里面很多是没用的,我只是想做得通用些)。

问题出现了,因为一家公司的数据在30万条左右。我走一遍程序需要30分钟。 如果要用这个一个公司的程序,处理199家,意味着我要手工处理199次每次还得等30分钟 简单算 :200*30 约等于100个小时 没日没夜的算还得 一周,加人工干预大致得3个星期。

显然不现实。

我想在这个一个公司一年数据外再加个读数据的循环并形成一个199家公司的加总数据集。

我的问题:

1。是否还得用宏?
2。199家公司的数据集名是否要统一?这些数据集是分别的csv 文件,是否需要用数字代号什么的方式放在硬盘上,方便sas顺序找到他们,读入,并展开运算,形成总结数据集。
3。请给个大致程序。下面的程序节选自我的程序,是开始和结尾部分。我想在外面再进行一个199次的公司循环。

请大家给些思路。谢谢大家。



libname sample 'd:\sas\data\20090819 tanscation data aot2';
run;


data sample.sample;
informat
RIC $9.
date
date10.
/* $10. ddmmyy10.*/
Time $10./* time10.1 */
type $5.
price 4.
Bidprice 4.
askprice 4.
QUALIFIERS $29.
;
infile
'd:\sas\data\2data aot.csv'
firstobs=2
missover
dsd;

input RIC $ DATE $ Time $ type $ PRICE BIDPRICE
Askprice
QUALIFIERS $@;

run;




这里是否可以加一个加总数据集的初始化?这个数据集不是下面一天数据集的简单累加,因为,我需要进行些最大似然类的金融计算,然后对结果累加。






/*建立空的一天数据加总数据集*/

data sample.trades;
set sample.onedaysellbuy;
delete;
run;




...../* 对数据进行前期处理,这里省略*/





/*分离出每日交易 */


%macro sample;

%do k=1 % to 365;

Data
sample.F;


set sample.E;


where num = &k;

run;




.../进入处理一天的数据处理, 这里省略*/



/*这里开始对每一日的数据作年加总*/
proc
append
base = sample.trades data = sample.Onedaysellbuy;
run;


/*最后跳出年循环的宏*/



%end;

%mend;

%sample;



/*因为简单用了365日历天,实际交易日只有250左右,删除有重复纪录的加总的数据集*/


proc
sort
data = sample.trades;
by date;
quit;






data sample.trades;
set
sample.trades;
by date;
if first.date=1;
run;

最佳答案

horace_chen 查看完整内容

1、建议用宏; 2、大致程序思路: libname sample 'd:\sas\data\20090819 tanscation data aot2'; run; /*分离出每日交易 宏*/ /*把宏单独放处理,不要嵌套宏,免得多次编译*/ %macro sample; %do k=1 % to 365; Data sample.F; set sample.E; where num = &k; run; .../进入处理一天的数据处理, 这里省略*/ /*这里开始对每一日的数据作年加总*/ proc append base = sample.trades data = sample ...
关键词:批量处理 数据集 missover informat informa 帮忙 数据集 思路 批量处理

本帖被以下文库推荐

沙发
horace_chen 发表于 2009-8-31 07:22:13 |只看作者 |坛友微信交流群
1、建议用宏;

2、大致程序思路:

libname sample 'd:\sas\data\20090819 tanscation data aot2';
run;


/*分离出每日交易 宏*/
/*把宏单独放处理,不要嵌套宏,免得多次编译*/
%macro sample;
%do k=1 % to 365;
Data sample.F;
        set sample.E;
        where num = &k;
        run;

.../进入处理一天的数据处理, 这里省略*/

/*这里开始对每一日的数据作年加总*/
proc append
        base = sample.trades data = sample.Onedaysellbuy;
        run;

%end;
%mend;

/*统一CSV文件名,从1到199,可以手动修改也可以下个批次修改文件名的小工具*/

%macro Trade;
%local filename;
%do filename=1 %to 199;
data sample.sample;
        informat
        RIC $9.
        date
        date10.
/* $10. ddmmyy10.*/
Time $10./* time10.1 */
type $5.
price 4.
Bidprice 4.
askprice 4.
QUALIFIERS $29.
;
infile
"d:\sas\data\&filename..csv"
firstobs=2
missover
dsd;

input RIC $ DATE $ Time $ type $ PRICE BIDPRICE
Askprice
QUALIFIERS $@;
run;


/*建立空的一天数据加总数据集*/
data sample.trades;
set sample.onedaysellbuy;
delete;
run;

...../* 对数据进行前期处理,这里省略*/

%sample;

proc sort      /*排序后使用FIRST.VAR比较耗时,建议用SQL改写*/
data = sample.trades;
by date;
quit;

data sample.trades;
set sample.trades;
by date;
if first.date=1;
run;

%end;
%mend Trade;

%trade;


文件处理时间比较长,有两个建议:
第一,优化现在的语句;
第二,使用SAS9多线程技术。
   以两个线程处理为例,大概思路:  
  把199个文件分两部分同时处理,
  把SAS程序保存为两个SAS文件trade1.sas和trade2.sas,
  修改%Trade 里面的 %do filename=1 %to 199;
  分别修改为%do filename=1 %to 100;和%do filename=101 %to 199;
  使用命令startsas sysin="SAS文件名""系统选项" 开启两个线程,同时执行trade1.sas和trade2.sas

  仅提供思路参考,没有测试。
  另外因为STARTSAS 是试用功能,可能会导致意外的结果。请谨慎使用~

使用道具

藤椅
sushe1527 发表于 2009-8-31 11:13:29 |只看作者 |坛友微信交流群
公司名字不需要改变,统一导入就可以。
你的意思是说想并行处理省时间吧,把199家公司导入一起处理,然后同时一起按照某种统一处理方式处理完数据然后合并
不过看日志的话 即便是使用宏也是需要遍历的
所以可能不会省时间 顶多省步骤
也可能是我不知道 等候高人。。。

使用道具

板凳
爱萌 发表于 2009-8-31 11:29:05 |只看作者 |坛友微信交流群
宏中宏,里面的宏处理你现在处理的,处理完后清理内存,外面的宏读入数据,
这样可以解决你的问题,也就说所有都是自动化,我记得当时我处理1500图片就是这样处理的,你可以参考我的思维,具体程序我不好给你,因为文章到现在还发表出来,还审稿中
最恨对我说谎或欺骗我的人

使用道具

报纸
tangb 发表于 2009-9-1 06:06:52 |只看作者 |坛友微信交流群
不好意思,昨天有事未回。

sushe1527:  

谢谢。你的建议很可行,但我顾虑程序的通用性,我打算将这个程序作知识管理器。以后看到的新模型就加到这个程序里面,程序也不断的修改以求简练。所以批量倒入还是个手工活。最佳应该最好是开机自动运行,自己接收数据库数据,然后运算,出图。当然这个可能还比较遥远。 但copy- paste总是会有隐患。

无论如何,你的建议确实能解燃眉。感谢!

版主 爱萌:
谢谢你的思路。你帮我进一步确认了宏是方向。进一步请教,你提到:"后清理内存“。 我是否要明确写程序清理内存,还是内部宏执行完隐含就会清除内存? 还有:“外面的宏读入数据”。 是否指的是内部宏处理完了,外部读数据的宏读入下一个公司对吗?谢谢指导!

使用道具

地板
tangb 发表于 2009-9-1 09:21:03 |只看作者 |坛友微信交流群
先感谢一下,初看有几个未懂得问题。消化后再请教。

使用道具

7
tangb 发表于 2009-9-1 10:30:55 |只看作者 |坛友微信交流群
1. 我没吃透宏的编译,我在编写前一个宏的时候,习惯性的把宏看作子程序似的,放在整个代码最后,把一个调用宏的语句放在前面。结果好像不得不中断执行。象下面这样:
%sample;


%macro sample;

.......



   %end;
%mend;

是不是要把所有的宏都放在代码的开始呢?


2。关于间接引用宏变量的问题。

我在引用%sample时,是不是不需要特别的给编译系统指示这是个引用的宏。以上的语法就是对的了,对吧

不象下面的:

        %let data2=y;
                   %macro test;
                   %put &&data;
                %end;
                 。。。。

里面必须用两个&&告诉编译系统。

使用道具

8
asteriod 发表于 2009-9-1 11:04:00 |只看作者 |坛友微信交流群
我有一个建议,不知道是否可行,请大家指点:做好一个公司的数据处理程序(公司名称和路径也是宏变量),把公司名称和路径做成一个excel表,用这个excel表驱动这个数据处理的宏程序,这个excel表的值会依次赋值给这个宏程序。时间不会省,但不用看着,可以自动运行出结果,比写循环快吧。

使用道具

9
asteriod 发表于 2009-9-1 11:06:23 |只看作者 |坛友微信交流群
我有一个建议,不知道是否可行,请大家指点:做好一个公司的数据处理程序(公司名称和路径也是宏变量),把公司名称和路径做成一个excel表,用这个excel表驱动这个数据处理的宏程序,这个excel表的值会依次赋值给这个宏程序。时间不会省,但不用看着,可以自动运行出结果,比写循环快吧。

使用道具

10
buteo 发表于 2009-9-1 11:11:09 |只看作者 |坛友微信交流群
1)宏肯定是需要用的。
2)199家公司的数据文件(csv文件)肯定是需要有规律的,总不能今天数据用数字,明天的数据用文字描述吧,只要统一就好。
程序写的实在是差了点。
3)不知道你的初始数据是什么样的(按公司每天一个?还是一年一个?),只能指出程序需要修改的地方:
/*建立空的一天数据加总数据集*/
proc sql;
create table sample.trades like sample.onedaysellbuy;
quit;

不要用你那个了。

/*因为简单用了365日历天,实际交易日只有250左右,删除有重复纪录的加总的数据集*/
不知道你这个为什么非得用365天,多循环了115天,生生加了50%的时间。

/*这里开始对每一日的数据作年加总*/
proc
append
base = sample.trades data = sample.Onedaysellbuy;
run;

这个就不要用这种append了,重复读写。用set 吧。空间换时间。


使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 14:26