martes, 28 de junio de 2022

Power Query: .ExpandTableColumn vs .Combine

Hay una duda constante a la hora de unir diferentes tablas con Power Query en si es mejor usar Table.Combine o Table.ExpandTableColumn...
Por desgracia, la realidad es que esto no viene nunca solo, y siempre está asociado a otros procesos anexos de transformación que son los que marcan la diferencia de tiempos de ejecución.

Veremos un ejemplo sencillo donde partiendo de tres tablas de 6.000 registros cada una, compararemos ambos métodos y veremos cuál es más ágil.
Nuestras tablas de origen:
Power Query: .ExpandTableColumn vs .Combine

Nota que las tres tablas tienen encabezados diferentes, aunque dos campos siempre en común: Productos, Importes

LLegaremos a dos soluciones idénticas entonces, una con la función Table.Combine y una segunda con Table.ExpandTableColumn:
Power Query: .ExpandTableColumn vs .Combine


Comencemos con el primer método, donde trabajaremos toda la transformación a nivel de fila, en cada elemento de una columna operada.
En primer lugar accederemos al editor de Power Query directamente, ya que la carga de las tablas la realizaremos 'picando' un poco de código.
Dentro del editor buscaremos la opción de añadir una consulta en blanco dentro de la cual, empleando el editor avanzado, escribiremos para el primer intento, empleando:
let
    // recuperamos cualquier tabla, nombre definido, etc del libro de trabajo
    Origen = Excel.CurrentWorkbook(),
    //nos quedamos exclusivamente con aquellas que comienzen por 'Tbl'
    FiltroTBL = Table.SelectRows(Origen, each Text.StartsWith([Name], "Tbl")),

    //paso duro, donde de una vez seleccionamos solo las columnas 'Producto' e 'Importes'
    // para luego aplicar un filtro múltiple de los producto a y b
    // y finalmente añadimos una nueva columna con el contenido de la columan [Name]
    // todo esto dentro de cada elemento de una columna agregada que contiene una Tabla
    TrabajoTablas = Table.AddColumn(FiltroTBL,"Transforma", 
                        each 
                            let cp=[Name],
                                addName=Table.AddColumn(Table.SelectRows(
                                                            Table.SelectColumns([Content],{"Productos","Importes"}),
                                                            each List.Contains({"a","b"},[Productos])),
                                                        "fuente",
                                                        each cp)          
                            in 
                                addName),
    
    //finalmente usamos .Combine para anexar las Tablas resultantes de la columna recién creada
    AnexoTablas=Table.Combine(TrabajoTablas[Transforma])
in
    AnexoTablas

En este caso, se exige que todo el proceso de transformación se haga a nivel de fila, en cada una de las Tablas obtenidas en una nueva columna agregada:
- selección de columnas
- filtro de productos
- añadir nueva columna
todos pasos necesarios previos al anexado de las tablas resultantes.
Power Query: .ExpandTableColumn vs .Combine


Vamos con el segundo método, más clásico, donde la transformación se simplifica al expandir el contenido de una columna, momento en el que elegimos además, las columnas que necesitamos... y en un paso siguiente, aplicamos un filtro de los 'productos' deseados.
Igual que antes, añadimos una consulta en blanco y desde el editor avanzado escribimos:
let
    // recuperamos cualquier tabla, nombre definido, etc del libro de trabajo
    Origen = Excel.CurrentWorkbook(),
    //nos quedamos exclusivamente con aquellas que comienzen por 'Tbl'
    FilasFiltradas = Table.SelectRows(Origen, each Text.StartsWith([Name], "Tbl")),

    //usamos el botón de Expandir columna
    //o llamamos a la función .ExpandTableColumn
    //eligiendo columnas a recuperar
    ExpandimosContent = Table.ExpandTableColumn(FilasFiltradas, "Content", {"Productos", "Importes"}, {"Productos", "Importes"}),

    //por último aplicamos un filtro sobre el campo 'Productos'
    FiltroPdtos = Table.SelectRows(ExpandimosContent, each ([Productos] = "a" or [Productos] = "b"))
in
    FiltroPdtos

Power Query: .ExpandTableColumn vs .Combine

Nota:= este método permitiría emplear las opciones o botones del interfaz para proceder a la transformación... no requiriendo prácticamente nada de código.

Para esta alternativa, ahorrándonos mucho código y pasos, hemos simplificado para que la transformación quede en:
- expandir columna con la tablas contenidas, en cuyo paso, además, seleccionamos las columnas de origen deseadas. Como resultado disponemos de todas las tablas originales listadas...
- último paso para filtrar los productos elegidos sobre la totalidad de registros (+/- 18.000)

Al lanzar uno y otro proceso, no tan curiosamente, es más rápido el segundo (el que emplea Table.ExpandTableColumn), bastante lógico ya que el número de líneas de código generado es mucho menor, más simple y más ágil al no 'retorcer' el código con múltiples acciones (como tuvimos que realizar en el primer intento) para lograr lo que se podía conseguir en una sencila acción.

En definitiva, no se trata por tanto, de .Combine o .ExpandTableColumn, se trata de otros pasos de transformación necesarios para llegar a resultados equivalentes, y que retuercen (o no) en muchos casos nuestros pasos en las consultas que retrasan innecesariamente los tiempos de ejecución.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.