2016-12-22 1 views
0

I ont les éléments suivants 606 x 274 tableau: see hereComment utiliser la fonction de percentile à des fins de classement? (Matlab)


Objectif:

Pour chaque date Calculons inférieure et supérieure à 20% centiles et, en fonction des résultats, créer 2 nouvelles variables , par exemple «L» pour «inférieur» et «U» pour «supérieur», qui contiennent les noms des téléscripteurs tels qu'ils apparaissent dans l'en-tête de la table.

étape par étape:

% 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; 

Jusqu'à présent, expérimenter avec « prctile » seulement permis d'obtenir des résultats numériques, pour une seule colonne. Exemple:

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

Merci pour votre aide et vos idées! En général

Répondre

0

parlant, si vous avez un tableau de nombres:

a = [4 2 1 8 -2]; 

percentiles peuvent être calculées en premier tri du tableau, puis tenter d'accéder à l'index fourni dans le percentile. Ainsi, la fonctionnalité « prctile(a,20) pourrait en principe être remplacé par

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

Cependant, prctile fait un peu plus de magie fantaisie interpoler le vecteur d'entrée pour obtenir une valeur qui est moins affectée par la taille du tableau. Cependant, vous pouvez utiliser l'idée ci-dessus pour trouver les colonnes de fractionnement centile. Si vous avez choisi de faire comme je l'ai dit ci-dessus, ce que vous voulez faire pour obtenir les en-têtes qui correspondent aux percentiles de 20% et 80% est de faire une boucle dans les lignes, enlever les NaNs, valeurs et obtenir l'indice particulier du percentile 20% ou 80%. Malheureusement, j'ai une ancienne version de Matlab qui ne supporte pas les tables, donc je n'ai pas pu vérifier si les noms d'en-têtes sont retournés correctement, mais l'idée devrait être claire.

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; 

Si vous souhaitez utiliser prctile de Matlab, vous devez trouver l'indice de valeur retournée faire de quelque chose comme ceci:

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; 
+0

Merci beaucoup pour vos entrées, @lucianopaz! Il semble que votre code supérieur fonctionne, mais bizarrement, il ne renvoie que le nom du ticker par nom. Pouvez-vous m'aider à ajuster le code afin qu'il renvoie tous les tickers au-dessus de 80% (et en dessous de 20%) percentile, pour chaque date? Merci d'avance – John

+0

@John, je n'avais pas bien compris et je pensais que vous vouliez seulement obtenir le nom de variable qui avait une valeur égale au percentile 20% ou 80% centile, pas tous les noms avec des valeurs inférieures à 20% et supérieures à 80 % J'ai édité les deux codes pour obtenir la liste des noms de variables. Espérons que cela aide – lucianopaz

+0

merci beaucoup! J'apprécie beaucoup votre aide! – John