Come faccio a moltiplicare due tabelle insieme?Ho una tabella di big data e una tabella dei fattori di normalizzazione.
La tabella dei dati è simile alla seguente:
| ID | Tipo | parametro1 | parametro2 | parametro3 |
| 01 | 1 | dati | dati | dati |
| 02 | 1 | dati | dati | dati |
| 03 | 2 | dati | dati | dati |
| 04 | 2 | dati | dati | dati |
La tabella dei fattori di normalizzazione è simile alla seguente:
| Tipo | parametro1 | parametro2 | parametro3 |
| 1 | fattore di normalizzazione1 | fattore di normalizzazione2 | fattore di normalizzazione3 |
| 2 | fattore di normalizzazione4 | fattore di normalizzazione5 | fattore di normalizzazione6 |
Come posso moltiplicare la prima tabella per la seconda tabella in base al tipo e al parametro e ottenere una nuova tabella come questa:
| ID | Tipo | parametro1 | parametro2 | parametro3 |
| 01 | 1 | dati*fattore di normalizzazione1 | dati*fattore di normalizzazione2 | dati*fattore di normalizzazione3 |
| 02 | 1 | dati*fattore di normalizzazione1 | dati*fattore di normalizzazione2 | dati*fattore di normalizzazione3 |
| 03 | 2 | dati*fattore di normalizzazione4 | dati*fattore di normalizzazione5 | dati*fattore di normalizzazione6 |
| 04 | 2 | dati*fattore di normalizzazione4 | dati*fattore di normalizzazione5 | dati*fattore di normalizzazione6 |
La mia tabella di dati grezzi è enorme sia in righe che in colonne, quindi desidero una soluzione rapida.
Grazie mille.
Modellazione statistica avanzataRicerche sui consumatori e sul mercatoPersonalizzazione di massaIngegneria della qualità e dei processiRe: Come moltiplicare due tabelle tra loro?Ecco un esempio
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;
Ecco un esempio in cui i dati si trovano nelle tabelle dati
names default to here(1);
dt1 = data table("one");
dt2 = data table("two");
finalMat=dt1[0,0]*dt2[0,0];Re: Come moltiplicare due tabelle tra loro?CIAO
Ho due matrici da moltiplicare insieme, ad esempio la prima è la matrice 3X4 e la seconda è la matrice 4X2. Qualcuno può suggerire come eseguire questa moltiplicazione di matrici in JMP Pro 16?
Re: Come moltiplicare due tabelle tra loro?Grazie per gli aggiornamenti, ho provato e funziona su un set di dati di prova. Tuttavia riscontro problemi di prestazioni come sottolineato da un'altra persona. Pertanto ho accettato la sua risposta come la soluzione migliore.
Re: Come moltiplicare due tabelle tra loro?CIAO,
Ho dato un'occhiata a questo e ho notato un muro di prestazioni una volta che il tavolo si è avvicinato alle dimensioni del tuo (in realtà, molto prima). Sono stato in grado di migliorare un po' le cose una volta che ho iniziato a elaborare il tavolo in "blocchi" di circa 10K righe per colonne da 1K. Potresti giocare con le dimensioni per vedere cosa funziona meglio, ma queste dimensioni sembrano funzionare bene.
Questo metodo non crea una nuova tabella: sovrascrive l'originale... quindi ti consigliamo di salvare l'originale, quindi salvare il risultato con un nome diverso.
Lo script seguente fa un paio di presupposti, poiché ha solo lo scopo di illustrare il concetto generale:
- le colonne corrispondenti sono nello stesso ordine in ciascuna tabella.
- per i parametri p, la tabella principale ha p+2 colonne e la tabella dei fattori ha p+1 colonne. non ci sono altre colonne in nessuna delle tabelle.
L'attuale in lavorazione il tempo per una tabella da 1 milione di righe con mille colonne era di circa 40 secondi... ogni "blocco" impiegava circa 0,3 - 0,4 secondi per essere elaborato.
La parte relativa all'impostazione dei tavoli, per simulare i tavoli che hai, ha richiesto un po' di tempo... probabilmente un paio di minuti. Attualmente lo script è impostato per una tabella più piccola... modifica le righe sotto il commento //impostazioni tabella per cambiarlo.
Il codice non è né elegante né compatto, ma funziona più velocemente di qualsiasi altra cosa che potrei inventare (incluso l'uso della moltiplicazione per elemento sull'intero blocco in una volta... per qualche motivo, l'iterazione sulle colonne ha richiesto circa la metà del tempo. ) Tuttavia, non ho provato l'approccio basato su formule di Craige.
L'ordinamento iniziale è necessario per evitare di dover recuperare le righe utilizzando where() (se devi farlo, rallenta notevolmente le cose.)
Saluti,
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: Come moltiplicare due tabelle tra loro?Il giro non è facile; Penso che questo lo farà:
// 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>
- acquisire le colonne originali prima di aggiungere le colonne nascoste con virtual join
- costruire l'espressione e utilizzando \!" per evitare le virgolette incorporate
- usa write() per eseguire il debug del tuo lavoro, non per stampare
- <
Re: Come moltiplicare due tabelle tra loro?Grazie, funziona su un set di dati di piccole dimensioni. Ma ho milioni di righe nella tabella 1 e solo due righe nella tabella 2. Pertanto voglio evitare di creare un'altra tabella enorme. Se non riesco a trovare una soluzione migliore, proverò questo metodo.
Re: Come moltiplicare due tabelle tra loro?Grazie per la risposta. Tuttavia, ho molte colonne e i nomi delle colonne sono complicati. Pertanto voglio scrivere un ciclo for per creare nuove colonne. Puoi spiegare di più su questa affermazione?
Formula( :"parameter1[Type]"n * :parameter1 )
Sto pensando di scrivere un ciclo for come questo:
</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 ) ));Ma non so come costruire correttamente la formula . Continua a darmi errori. Mi potete aiutare?
Grazie.
Re: Come moltiplicare due tabelle tra loro?E se non hai bisogno delle formule, potresti considerare la moltiplicazione delle matrici in termini di elementi che possono o meno essere "migliori". Sul mio MacBook il codice seguente ha impiegato circa 15 secondi.
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: Come moltiplicare due tabelle tra loro?Potresti utilizzare un join virtuale e colonne formula.
Virtual join adds the blue and gold keysVirtual join adds the blue and gold keysL'unione virtuale aggiunge le chiavi blu e oro
Puoi collegarli in modo interattivo o con JSL.
Questo potrebbe utilizzare nomi JMP16 con il file :"parametro3[Tipo]"n sintassi; potresti aver bisogno del nome ( "parametro3[Tipo]" ) Invece.
// 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>