¿Cómo multiplico dos tablas juntas?Tengo una tabla de big data y una tabla de factores de normalización.
La tabla de datos se ve así:
| IDENTIFICACIÓN | Tipo | parámetro1 | parámetro2 | parámetro3 |
| 01 | 1 | datos | datos | datos |
| 02 | 1 | datos | datos | datos |
| 03 | 2 | datos | datos | datos |
| 04 | 2 | datos | datos | datos |
La tabla de factores de normalización se ve así:
| Tipo | parámetro1 | parámetro2 | parámetro3 |
| 1 | factor de normalización1 | factor de normalización2 | factor de normalización3 |
| 2 | factor de normalización4 | factor de normalización5 | factor de normalización6 |
¿Cómo puedo multiplicar la primera tabla por la segunda tabla según el tipo y parámetro y obtener una nueva tabla como esta?
| IDENTIFICACIÓN | Tipo | parámetro1 | parámetro2 | parámetro3 |
| 01 | 1 | datos*factor de normalización1 | datos*factor de normalización2 | datos*factor de normalización3 |
| 02 | 1 | datos*factor de normalización1 | datos*factor de normalización2 | datos*factor de normalización3 |
| 03 | 2 | datos*factor de normalización4 | datos*factor de normalización5 | datos*factor de normalización6 |
| 04 | 2 | datos*factor de normalización4 | datos*factor de normalización5 | datos*factor de normalización6 |
Mi tabla de datos sin procesar es enorme tanto en filas como en columnas, por lo que quiero una solución rápida.
Muchas gracias.
Modelado estadístico avanzadoInvestigación de Consumidores y MercadosLa personalización en masaIngeniería de Calidad y ProcesosRe: ¿Cómo multiplico dos tablas juntas?Aquí hay un ejemplo
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;
Aquí hay un ejemplo donde los datos están en tablas de datos.
names default to here(1);
dt1 = data table("one");
dt2 = data table("two");
finalMat=dt1[0,0]*dt2[0,0];Re: ¿Cómo multiplico dos tablas juntas?Hola
Tengo dos matrices para multiplicar, por ejemplo, la primera es una matriz de 3X4 y la segunda es una matriz de 4X2. ¿Alguien puede sugerir cómo se puede realizar esta multiplicación de matrices en JMP Pro 16?
Re: ¿Cómo multiplico dos tablas juntas?Gracias por las actualizaciones, lo intenté y funciona en un conjunto de datos de prueba. Sin embargo, tengo problemas de rendimiento como lo señaló otra persona. Por eso acepté su respuesta como la mejor solución.
Re: ¿Cómo multiplico dos tablas juntas?Hola,
Eché un vistazo a esto y noté un muro de rendimiento una vez que la mesa se acercó al tamaño de la tuya (en realidad, mucho antes de eso). Pude mejorar las cosas un poco una vez que comencé a procesar la tabla en "bloques" de aproximadamente 10K. filas por columnas de 1K. Podrías jugar con el tamaño para ver qué funciona mejor, pero estas dimensiones parecían funcionar bien.
Este método no crea una nueva tabla: sobrescribe la original... por lo que querrás guardar el original y luego guardar el resultado con un nombre diferente.
El siguiente guión hace un par de suposiciones, ya que solo pretende ilustrar el concepto general:
- las columnas correspondientes están en el mismo orden en cada tabla.
- para p parámetros, la tabla principal tiene p+2 columnas y la tabla de factores tiene p+1 columnas. no hay otras columnas en ninguna de las tablas.
El actual Procesando El tiempo para una tabla de 1 millón de filas con mil columnas fue de aproximadamente 40 segundos... cada "bloque" tardó entre 0,3 y 0,4 segundos en procesarse.
La parte de configuración de la mesa, para simular las mesas que tienes, tomó un tiempo... probablemente un par de minutos. Actualmente, el script está configurado para una tabla más pequeña... modifique las líneas debajo del comentario de configuración de tabla // para cambiar esto.
El código no es ni elegante ni compacto, pero se ejecuta más rápido que cualquier otra cosa que se me ocurra (incluido el uso de la multiplicación por elementos en todo el bloque a la vez... por alguna razón, iterar sobre las columnas tomó aproximadamente la mitad del tiempo. ) Sin embargo, no probé el enfoque basado en fórmulas de Craige.
La clasificación inicial es necesaria para evitar tener que buscar filas usando where() (si tienes que hacerlo, ralentiza considerablemente las cosas).
Salud,
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: ¿Cómo multiplico dos tablas juntas?El circuito no es fácil; Creo que esto servirá:
// 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>
- capturar las columnas originales antes de agregar las columnas ocultas con unión virtual
- construye la expresión e usando \!" para escapar de las comillas incrustadas
- use write() para depurar su trabajo, no imprimir
- <
Re: ¿Cómo multiplico dos tablas juntas?Gracias, funciona en un pequeño conjunto de datos. Pero tengo millones de filas en la tabla 1 y sólo dos filas en la tabla 2. Por lo tanto quiero evitar crear otra tabla enorme. Si no puedo encontrar una solución mejor, probaré este método.
Re: ¿Cómo multiplico dos tablas juntas?Gracias por su respuesta. Sin embargo, tengo muchas columnas y los nombres de las columnas son complicados. Por lo tanto, quiero escribir un bucle for para crear nuevas columnas. ¿Puedes explicar más sobre esta afirmación?
Formula( :"parameter1[Type]"n * :parameter1 )
Estoy pensando en escribir un bucle for como este:
</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 ) ));Pero no sé cómo construir la fórmula correctamente. . Me sigue dando errores. ¿Me puedes ayudar?
Gracias.
Re: ¿Cómo multiplico dos tablas juntas?Y si no necesita las fórmulas, podría considerar la multiplicación de matrices por elementos, que pueden ser "mejores" o no. En mi MacBook, el siguiente código tardó unos 15 segundos.
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: ¿Cómo multiplico dos tablas juntas?Podría utilizar una combinación virtual y columnas de fórmula.
Virtual join adds the blue and gold keysVirtual join adds the blue and gold keysLa unión virtual agrega las teclas azul y dorada
Puedes vincularlos de forma interactiva o con JSL.
Esto puede estar usando nombres JMP16 con el :"parámetro3[Tipo]"n sintaxis; es posible que necesites nombre ( "parámetro3[Tipo]" ) en cambio.
// 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>