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;
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
@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
merci beaucoup! J'apprécie beaucoup votre aide! – John