Wed Jun 29, 2022 1:48 pm
Login Register Lost Password? Contact Us

Please Note: The HPCC Systems forums are moving to Stack Overflow. We invite you to post your questions on Stack Overflow utilizing the tag hpcc-ecl (https://stackoverflow.com/search?tab=newest&q=hpcc-ecl). This legacy forum will be active and monitored during our transition to Stack Overflow but will become read only beginning September 1, 2022.



Iterar pelas colunas de um dataset

Fórum em português para questões gerais e suporte relacionados a ECL/HPCC Systems.

Moderator: hwatanuki

Wed Mar 24, 2021 6:06 pm Change Time Zone

Eu tenho um dataset com mais de 30 colunas e gostaria de calcular a correlação entre cada uma delas (e de preferência colocar os resultados em uma matriz de correlação). Existe alguma forma de criar um loop que roda a função CORRELATION() para todos os pares de colunas possíveis?

Um exemplo para deixar mais claro:
Dado um dataset de colunas y, x1, x2 e x3, gostaria de criar a seguinte tabela com as correlações entre cada uma (em anexo).
matriz de correlação.PNG
(12.24 KiB) Not downloaded yet
AndreFB
 
Posts: 3
Joined: Wed Mar 24, 2021 5:51 pm

Thu Mar 25, 2021 1:42 pm Change Time Zone

Olá André.
A abordagem recomendada para problemas nos quais não se pode referenciar diretamente campos do dataset (como linhas, colunas, etc) é utilizando template language: https://hpccsystems.com/training/documentation/ecl-language-reference/html/Templates.html#:~:text=The%20Template%20language%20is%20a,to%20implement%20the%20user's%20choices.

Acredito que o código a seguir seja o que você procura.

Code: Select all
//*****************************
//This is test data -- requirement being #records = # of REAL fields
filelayout := RECORD
  UNSIGNED myid;
  REAL f1;
  REAL f2;
  REAL f3;
  REAL f4;
END;

GFred := DATASET([ {1, 11.0, 12.0, 13.0, 99.0},
                    {2, 21.0, 22.0, 23.0, 24.0},
                    {3, 31.0, 32.0, 33.0, 34.0},
                    {4, 41.0, 42.0, 43.0, 44.0}
                    ],filelayout);
   
// ThisDS := MyMod.Myfile;   
                              
// ****************************
//makes the code not reliant on any specific file/record structure names
ds := 'GFred';                             //constant for the file def name
thislayout := RECORDOF(GFred);    //replace ThisDS with whatever filename is actually used

// ****************************
     #EXPORTXML(Fred,thislayout);
     #DECLARE(outputStr)
     #DECLARE(ProjStr)
     #DECLARE(FldStr)
     #DECLARE (Ndx)
     #SET (Ndx, 0);           
     #FOR (Fred)
      #FOR (Field)
        #SET (Ndx, %Ndx% + 1)
        #IF ( %Ndx% = 1)
           #SET(outputStr,'SetVals := [')
           #SET(ProjStr,'thislayout XF(OneRec L, INTEGER C) := TRANSFORM\n  SELF.' + %'{@label}'% + ' := C;\n')
        #ELSEIF ( %Ndx% = 2)
           #APPEND(outputstr,ds + '.' + %'{@label}'%);
           #APPEND(projstr,'  SELF.' + %'{@label}'% + ' := CORRELATION(' + ds + ',SetVals[C],' + %'{@label}'% + ');\n');
        #ELSE     
           #APPEND(outputstr,',' + ds + '.' + %'{@label}'%);
           #APPEND(projstr,'  SELF.' + %'{@label}'% + ' := CORRELATION(' + ds + ',SetVals[C],' + %'{@label}'% + ');\n');
        #END
      #END
     #END
     #APPEND(outputstr,'];\nOutRecCnt := COUNT(SetVals);\nOneRec := DATASET([{0}],{UNSIGNED1 h});');
     #APPEND(projstr,'END;\n P := NORMALIZE(OneRec,OutRecCnt,XF(LEFT,COUNTER));\n');
     %outputstr%;
     %projstr%;
      
   GenCode := %'outputstr'% + '\n' + %'projstr'%;
    //produces this code:
  // SetVals := [GFred.f1,GFred.f2,GFred.f3,GFred.f4];
      // OutRecCnt := COUNT(SetVals);
      // OneRec := DATASET([{0}],{UNSIGNED1 h});
      // thislayout XF(OneRec L, INTEGER C) := TRANSFORM
         // SELF.myid := C;
         // SELF.f1 := CORRELATION(GFred,SetVals[C],f1);
         // SELF.f2 := CORRELATION(GFred,SetVals[C],f2);
         // SELF.f3 := CORRELATION(GFred,SetVals[C],f3);
         // SELF.f4 := CORRELATION(GFred,SetVals[C],f4);
      // END;
       // P := NORMALIZE(OneRec,OutRecCnt,XF(LEFT,COUNTER));

OUTPUT(GenCode);   
OUTPUT(P);   


Repare que a estrutura record é exportada como XML (#EXPORTXML). Isso permite que seja possível utilizar o #FOR, uma estrutura de loop que percorre o arquivo XML exportado. Caso persistam dúvidas a respeito do trecho de código referente à exportação do arquivo como XML, há esse outro exemplo retirado da própria documentação da linguagem: https://hpccsystems.com/training/documentation/ecl-language-reference/html/_EXPORTXML.html
OlivAl01
 
Posts: 1
Joined: Tue Dec 22, 2020 5:01 pm

Fri Mar 26, 2021 8:42 pm Change Time Zone

O código funcionou muito bem. Muito obrigado!
AndreFB
 
Posts: 3
Joined: Wed Mar 24, 2021 5:51 pm


Return to Português

Who is online

Users browsing this forum: No registered users and 1 guest

cron