Comment multiplier deux tables ensembleJ'ai une table Big Data et une table de facteurs de normalisation.
Le tableau de données ressemble à ceci :
| IDENTIFIANT | Taper | paramètre1 | paramètre2 | paramètre3 |
| 01 | 1 | données | données | données |
| 02 | 1 | données | données | données |
| 03 | 2 | données | données | données |
| 04 | 2 | données | données | données |
Le tableau des facteurs de normalisation ressemble à ceci :
| Taper | paramètre1 | paramètre2 | paramètre3 |
| 1 | facteur de normalisation1 | facteur de normalisation2 | facteur de normalisation3 |
| 2 | facteur de normalisation4 | facteur de normalisation5 | facteur de normalisation6 |
Comment puis-je multiplier la première table par la deuxième table en fonction du type et du paramètre et obtenir une nouvelle table comme celle-ci :
| IDENTIFIANT | Taper | paramètre1 | paramètre2 | paramètre3 |
| 01 | 1 | données*facteur de normalisation1 | données*facteur de normalisation2 | données*facteur de normalisation3 |
| 02 | 1 | données*facteur de normalisation1 | données*facteur de normalisation2 | données*facteur de normalisation3 |
| 03 | 2 | données*facteur de normalisation4 | données*facteur de normalisation5 | données*facteur de normalisation6 |
| 04 | 2 | données*facteur de normalisation4 | données*facteur de normalisation5 | données*facteur de normalisation6 |
Mon tableau de données brutes est énorme en lignes et en colonnes, je veux donc une solution rapide.
Merci beaucoup.
Modélisation statistique avancéeÉtudes de consommation et de marchéPersonnalisation de masseIngénierie Qualité et ProcédésRe : Comment multiplier deux tables ensembleVoici un exemple
mat1 = [ 1 2 3, 4 5 6, 7 8 9, 10 11 12];
mat2 = [1 2 3 4, 5 6 7 8, 9 10 11 12];
finalMat = mat1 * mat2;
Voici un exemple où les données sont dans des tableaux de données
names default to here(1);
dt1 = data table("one");
dt2 = data table("two");
finalMat=dt1[0,0]*dt2[0,0];Re : Comment multiplier deux tables ensembleSalut
J'ai deux matrices à multiplier ensemble, par exemple, la première est une matrice 3X4 et la seconde est une matrice 4X2. Quelqu'un peut-il suggérer comment effectuer cette multiplication matricielle dans JMP Pro 16 ?
Re : Comment multiplier deux tables ensembleMerci pour les mises à jour, j'ai essayé et cela fonctionne sur un jeu de données d'essai. Cependant, je rencontre des problèmes de performances comme l'a souligné une autre personne. J'ai donc accepté sa réponse comme la meilleure solution.
Re : Comment multiplier deux tables ensembleSalut,
J'ai jeté un coup d'œil à cela et j'ai remarqué un mur de performances une fois que la table s'est approchée de la taille de la vôtre (en fait, bien avant cela.) J'ai pu améliorer un peu les choses une fois que j'ai commencé à traiter la table en "blocs" d'environ 10K lignes par 1K colonnes. Vous pourriez jouer avec la taille pour voir ce qui fonctionne le mieux, mais ces dimensions semblaient bien fonctionner.
Cette méthode ne crée pas de nouvelle table - elle écrase l'original... vous voudriez donc enregistrer l'original, puis enregistrer le résultat sous un nom différent.
Le script ci-dessous fait quelques hypothèses, car il est simplement destiné à illustrer le concept global :
- les colonnes correspondantes sont dans le même ordre dans chaque tableau.
- pour p paramètres, la table principale comporte p+2 colonnes, et la table factorielle comporte p+1 colonnes. il n'y a aucune autre colonne dans les deux tableaux.
L'actuel traitement le temps pour une table d'un million de lignes avec un millier de colonnes était d'environ 40 secondes... chaque "bloc" prenait environ 0,3 à 0,4 seconde à traiter.
La partie configuration de la table, pour se moquer des tables que vous avez, a pris un certain temps... probablement quelques minutes. Actuellement, le script est défini pour une table plus petite... modifiez les lignes sous le commentaire //table settings pour changer cela.
Le code n'est ni élégant ni compact, mais il s'exécute plus rapidement que tout ce que j'ai pu proposer (y compris l'utilisation de la multiplication élément par élément sur l'ensemble du bloc à la fois... pour une raison quelconque, l'itération sur les colonnes a pris environ la moitié du temps. ) Cependant, je n'ai pas essayé l'approche basée sur la formule de Craige.
Le tri initial est nécessaire pour éviter d'avoir à récupérer des lignes en utilisantwhere() (si vous devez le faire, cela ralentit considérablement les choses.)
Acclamations,
Brady
Names Default To Here( 1 );
//set limits on block size
blockRowLimit = 1e4;
blockColLimit = 1e3;
// table setup
rowsdt1 = 1e4;
colsdt1 = 1e2;
dt1 = As Table( (1 :: rowsDt1)` || J( rowsDt1, 1, Random Integer( 1, 2 ) ) || J( rowsdt1, colsdt1, Random Uniform() ), <<INVISIBLE></INVISIBLE>
Re : Comment multiplier deux tables ensembleLa boucle n’est pas facile ; Je pense que ceci fera l'affaire :
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
originalColumns = dataDT<<GETCOLUMNNAMES></GETCOLUMNNAMES>
- capturer les colonnes d'origine avant d'ajouter les colonnes cachées avec une jointure virtuelle
- construisez l'expression e en utilisant \!" pour échapper aux guillemets incorporés
- utilisez write() pour déboguer votre travail, pas pour imprimer
- << RunFormulas est important pour la vitesse ; l'évaluation en arrière-plan par défaut des formules de colonnes est beaucoup plus lente
Re : Comment multiplier deux tables ensembleMerci, cela fonctionne sur un petit ensemble de données. Mais j'ai des millions de lignes dans le tableau 1 et seulement deux lignes dans le tableau 2. Par conséquent, je veux éviter de créer une autre table énorme. Si je ne trouve pas de meilleure solution, j'essaierai cette méthode.
Re : Comment multiplier deux tables ensembleMerci pour votre réponse. Cependant, j'ai beaucoup de colonnes et les noms de colonnes sont compliqués. Par conséquent, je veux écrire une boucle for pour créer de nouvelles colonnes. Pouvez-vous expliquer davantage cette déclaration ?
Formula( :"parameter1[Type]"n * :parameter1 )
Je pense écrire une boucle for comme celle-ci :
</CODE></PRE><PRE class="lia-code-sample language-markup"><CODE>colnames = dataDT << Get Column Names();
nc = ncols(dataDT);
DT = New Table("normalized", New Column("ID", values(dataDT:ID << get values)),
New Column("Type", values(dataDT:Type << get values)));
For(i = 3, i<= nc, i++,
DT << New Column( char( colnames[3]), Numeric, "Continuous", Format( "Best", 12 ), Formula( XXXX ) ));Mais je ne sais pas comment construire correctement la formule . Cela continue de me donner des erreurs. Pouvez-vous m'aider?
Merci.
Re : Comment multiplier deux tables ensembleEt si vous n'avez pas besoin des formules, vous pouvez envisager une multiplication par éléments de matrices qui peuvent ou non être « meilleures ». Sur mon MacBook, le code ci-dessous a pris environ 15 secondes.
NamesDefaultToHere(1);
nr = 10000; // Number of rows
nc = 10000; // Number of Columns
dt1 = AsTable(J(nr, nc, RandomInteger(1, 20)));
dt2 = AsTable(J(nr, nc, RandomUniform(0, 1)));
m1 = dt1 << getAsMatrix;
m2 = dt2 << getAsMatrix;
dtFinal = AsTable(m1 :*</img> m2);
Re : Comment multiplier deux tables ensembleVous pouvez utiliser une jointure virtuelle et des colonnes de formule.
Virtual join adds the blue and gold keysVirtual join adds the blue and gold keysLa jointure virtuelle ajoute les touches bleues et dorées
Vous pouvez les lier de manière interactive ou avec JSL.
Cela peut utiliser des noms JMP16 avec le :"paramètre3[Type]"n syntaxe; vous pourriez avoir besoin d'un nom ( "paramètre3[Type]" ) plutôt.
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
// join the tables
factorDT:type << Set Property( "Link ID", 1 );
dataDT:type << Set Property( "Link Reference", Reference Table( "factor.jmp" ) );
// add formula columns
dataDT << New Column( "p 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter1[Type]"n * :parameter1 ) );
dataDT << New Column( "p 2", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter2[Type]"n * :parameter2 ) );
dataDT << New Column( "p 3", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter3[Type]"n * :parameter3 ) );
// force the evaluation to complete
dataDT<<RUNFORMULAS></RUNFORMULAS>