【问题标题】:How to use the Percentile Function for Ranking purpose? (Matlab)如何使用百分位函数进行排名? (Matlab)
【发布时间】:2017-05-07 23:54:32
【问题描述】:

我有以下 606 x 274 表: see here


目标:

为每个日期计算上下 20% 的百分位数,并根据结果创建 2 个新变量,例如'L' 表示“下”,“U”表示“上”,其中包含在表格标题中看到的代码名称。

一步一步:

% Replace NaNs with 'empty' for the percentile calculation (error: input to be cell array)
     T(cellfun(@isnan,T)) = {[]}
% Change date format
     T.Date=[datetime(T.Date, 'InputFormat', 'eee dd-MMM-yyyy')];
% Take row by row 
     for row=1:606
% If Value is in upper 20% percentile create new variable 'U' that contains the according ticker names.
% If Value is in lower 20% percentile create new variable 'L' that contains the according ticker names.
     end;

到目前为止,对“prctile”的试验仅针对单列产生了数字结果。示例:

Y = prctile(T.A2AIM,20,2);

感谢您的帮助和想法!

【问题讨论】:

    标签: matlab loops for-loop ranking percentile


    【解决方案1】:

    一般来说,如果你有一个数字数组:

    a = [4 2 1 8 -2];
    

    可以通过首先对数组进行排序然后尝试访问百分位数中提供的索引来计算百分位数。所以prctile(a,20)的功能原则上可以替换为

    b = sort(a);
    ind = round(length(b)*20/100);
    if ind==0
        ind = 1;
    end
    b = b(ind);
    % b = -2
    

    然而,prctile 做了一些花哨的魔法插值输入向量以获得受数组大小影响较小的值。但是,您可以使用上面的想法来找到百分位拆分列。如果你选择像我上面说的那样做,你想要得到对应于 20% 和 80% 百分位数的标题是循环遍历行,删除 NaN,获取剩余排序的索引值并获取 20% 或 80% 百分位数的特定索引。很遗憾,我有一个不支持表格的旧版本的 Matlab,所以我无法验证是否正确返回了标题名称,但想法应该很清楚。

    L = cell(size(T,1),1);
    U = cell(size(T,1),1);
    for row=1:size(T,1)
        row_values = T{row,:};
        row_values = row_values(2:end); % Remove date column
        non_nan_indeces = find(~isnan(row_values));
        if not(isempty(non_nan_indeces))
            [row_values,sorted_indeces] = sort(row_values(non_nan_indeces));
            % The +1 is because we removed the date column
            L_ind = non_nan_indeces(sorted_indeces(1:round(0.2*length(row_values))))+1;
            U_ind = non_nan_indeces(sorted_indeces(round(0.8*length(row_values)):end))+1;
            % I am unsure about this part
            L{row} = T.Properties.VariableNames(L_ind);
            U{row} = T.Properties.VariableNames(U_ind);
        else
            L{row} = nan;
            U{row} = nan;
        end
    end;
    

    如果你想使用 matlab 的prctile,你必须像这样找到返回值的索引:

    L = cell(size(T,1),1);
    U = cell(size(T,1),1);
    for row=1:size(T,1)
        row_values = T{row,:};
        row_values = row_values(2:end); % Remove date column
        non_nan_indeces = find(~isnan(row_values));
        if not(isempty(non_nan_indeces))
            [row_values,sorted_indeces] = sort(row_values(non_nan_indeces));
            L_val = prctile(row_values(non_nan_indeces),20);
            U_val = prctile(row_values(non_nan_indeces),80);
            % The +1 is because we removed the date column
            L_ind = non_nan_indeces(sorted_indeces(find(row_values<=L_val)))+1;
            U_ind = non_nan_indeces(sorted_indeces(find(row_values>=U_val)))+1;
            % I am unsure about this part
            L{row} = T.Properties.VariableNames(L_ind);
            U{row} = T.Properties.VariableNames(U_ind);
        else
            L{row} = nan;
            U{row} = nan;
        end
    end;
    

    【讨论】:

    • 非常感谢您的投入,@lucianopaz!看起来您的上层代码正在运行,但奇怪的是它每个日期只返回 一个 代码名称。您能帮我调整代码,使其返回每个日期高于 80%(和低于 20%)百分位的所有代码吗?提前致谢
    • @John,我没有正确理解,并认为您只想获取值等于 20% 或 80% 的变量名称,而不是所有值低于 20 的名称% 和 80% 以上。我编辑了两个代码以获取变量名称列表。希望对你有帮助
    猜你喜欢
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多