我在Matlab中有一个包含7个变量和大约200万行的大表。第一列/变量有Ids,第二列有日期,第三列变量有价格。对于每个Id和每个日期,我想检查前6天每个价格是否高于100。我有一个解决方案,但它很慢,所以我想提高速度的想法。我的解决方案如下(带有一些玩具数据):
Data = table(reshape(repmat(1:4,3000,1),12000,1),repmat(datestr(datenum(2001,01,31):1:datenum(2009,04,18)),4,1),normrnd(200,120,12000,1),...
'VariableNames',{'ID','Date','Price'});
function y=Lag6days(x)
y=zeros(size(x));
for i=7:size(x,1)
y(i,1)=sum(x(i-6:i-1,1)>100)==6;
end
end
Func = @Lag6days;
A = varfun(Func,Data,'GroupingVariables',{'ID'},'InputVariables','Price');
有什么建议吗?
答案 0 :(得分:1)
这可能与表数据结构有关 - 我实际上并不习惯。
考虑使用'OutputFormat','cell'
,在varfun
的调用中,这似乎对我有用。
当然你必须确保varfun的分组程序是稳定的,这样你的日期就不会混淆了。
您可以考虑使用以下方法将每个ID组提取到单独的向量中:
A1 = Lag6days(Data.Price(Data.ID==1));
...
因此,您可以更好地控制日期进行洗牌。
PS:显然,只有当您的价格已经按日期排序并且每天只有一个价格输入时,您的算法才有效。检查这些断言是一种好习惯。