我们正在研究MATLAB代码以对股票进行排名。我们没有完整的数据集,因此必须处理一些NaN。但是,在我们用于排序的代码中,NaN排名最高。我们的目的是从排名中排除NaN。怎么做?
请考虑使用SPACEBAR
和Y
以下
stockkid
运行程序会导致:
Y = [1.2 1.3 NaN 0.9 0.95 NaN 0.8 0.7];
stockid = [801 802 803 804 805 806 807 808];
[totalmonths,totalstocks] = size(Y);
nbrstocks = totalstocks - sum(isnan(Y));
[B,I] = sort(Y,'descend');
ncandidates = 4;
idwinner(1:ncandidates) = stockid(I(1:ncandidates));
因此,803对应于NaN,806对应于NaN,802对应于1.3等。
我们的目标应该是:
Y =
1.2000 1.3000 NaN 0.9000 0.9500 NaN 0.8000 0.7000
idwinner =
803 806 802 801
那么,我们如何从排名中排除NaN?
答案 0 :(得分:3)
使用
Y(isnan(Y)) = -inf;
在致电sort
之前。这会将NaN
值更改为-inf
,因此这些值将是最低值。
或者,如果您不想更改Y
中的任何值,可以使用以下中间索引:
Y = [1.2 1.3 NaN 0.9 0.95 NaN 0.8 0.7];
stockid = [801 802 803 804 805 806 807 808];
ind = find(~isnan(Y)); %/ intermediate index that tells which elements are numbers
[B,I] = sort(Y(ind),'descend');
ncandidates = 4;
idwinner(1:ncandidates) = stockid(ind(I(1:ncandidates))); %// apply intermediate index
答案 1 :(得分:0)
在您的sort
语句后,添加以下行:I = I(~isnan(B));
,这将删除与NaN
关联的索引,然后再从stockids
答案 2 :(得分:0)
I = I(~isnan(B));
效果最佳,因为我们不会像使用
那样覆盖NaN Y(isnan(Y)) = -inf;
因为我们后来也必须从具有最低回报的股票中确定失败者投资组合。这对最后一个代码不起作用,因为所有NaN的回报最低而不是具有实际数据的股票。