将matlab函数应用于按变量分组的大表

时间:2014-12-11 13:06:05

标签: matlab

我在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');

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这可能与表数据结构有关 - 我实际上并不习惯。 考虑使用'OutputFormat','cell',在varfun的调用中,这似乎对我有用。 当然你必须确保varfun的分组程序是稳定的,这样你的日期就不会混淆了。 您可以考虑使用以下方法将每个ID组提取到单独的向量中:

A1 = Lag6days(Data.Price(Data.ID==1));
...

因此,您可以更好地控制日期进行洗牌。

PS:显然,只有当您的价格已经按日期排序并且每天只有一个价格输入时,您的算法才有效。检查这些断言是一种好习惯。