Saltar al contenido principal

Limpieza de datos

En ocasiones los datos fuente que cargamos en Qlik Sense no tienen exactamente el formato que deseamos en nuestra app de Qlik Sense. Qlik Sense ofrece una serie de funciones y sentencias que permiten transformar nuestros datos en un formato que nos vaya bien.

La sentencia mapping se puede utilizar en un script de Qlik Sense para reemplazar o modificar valores de campo o nombres cuando se ejecuta el script, así pues mapping puede servir para limpiar los datos y hacer que sean más sistematizados o para reemplazar la totalidad o partes de un valor de campo.

Cuando cargamos datos de distintas tablas, los nombres de los valores de campo no se han asignado siempre de forma sistemática. Esta falta de sistematicidad, aparte de ser molesta, impide también las asociaciones, es decir, que se hace imprescindible resolver el problema. La forma elegante de solucionar esto es creando una tabla de correspondencias que compare los valores de campo.

Tablas de correspondencia

Las tablas cargadas mediante Mapping load o Mapping select se tratan de manera diferente a otras tablas. Se almacenan en un área aparte de la memoria, y se usan solo como tablas de enlace durante la ejecución del script. Tras ejecutarse el script estas tablas se eliminan automáticamente.

Reglas:

  • Una tabla de correspondencia debe tener dos columnas, la primera con los valores de la comparación y la segunda con los valores que se desea enlazar.
  • Las dos columnas deben tener nombre, pero los nombres no tienen importancia por sí mismos. Los nombres de las columnas no tienen conexión con los nombres de campo en las tablas internas regulares.

Funciones y sentencias Mapping

Este tutorial aborda el uso de las siguientes funciones/sentencias de asignación de correspondencias:

• El prefijo Mapping

ApplyMap()

MapSubstring()

• La sentencia Map … Using

• La sentencia Unmap

El prefijo mapping

El prefijo Mapping se usa en un script para crear una tabla de correspondencia. La tabla de correspondencia se puede utilizar después con la función ApplyMap(), la función MapSubstring() o la sentencia Map … Using.

Haga lo siguiente:

  1. Cree una nueva app y asígnele un nombre.
  2. Agregue una nueva sección de script en el Editor de carga de datos.
  3. Denomine a la sección Countries.
  4. Introduzca el siguiente script:
  5. CountryMap: MAPPING LOAD * INLINE [ Country, NewCountry U.S.A., US U.S., US United States, US United States of America, US ];

    La tabla CountryMap almacena dos columnas: Country y NewCountry. La columna Country almacena las diversas formas en que se ha introducido country/país en el campo Country. La columna NewCountry almacena cómo se asignarán los valores. Esta tabla de correspondencia se utilizará para almacenar valores sistemáticos del país US en el campo Country. Por ejemplo, si U.S.A. se almacena en el campo Country, asígnelo como de US.

La función ApplyMap()

Use ApplyMap() para reemplazar datos de un campo basándose en una tabla de correspondencia previamente creada. La tabla de correspondencia debe cargarse previamente para poder utilizar la función ApplyMap(). Los datos en la tabla Data.xlsx que cargará se verán así:

Tabla de datos
ID Nombre País: Código
1 John Black Estados Unidos SDFGBS1DI
2 Steve Johnson EE.UU. 2ABC
3 Mary White USA DJY3DFE34
4 Susan McDaniels u DEF5556
5 Dean Smith US KSD111DKFJ1

Observe que el país se introduce de diversas maneras. Para hacer que el campo país sea consistente, se carga la tabla de correspondencia y después se utiliza la función ApplyMap().

Haga lo siguiente:

  1. Debajo del script que introdujo arriba, seleccione y cargue Data.xlsx, y luego inserte el script.
  2. Inserte lo siguiente sobre la sentencia LOAD recién creada:
  3. Datos:

    Su script debería tener el aspecto siguiente:

    CountryMap: MAPPING LOAD * INLINE [ Country, NewCountry U.S.A., US U.S., US United States, US United States of America, US ]; Data: LOAD ID, Name, Country, Code FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1);

  4. Modifique la línea que contiene Country, de la siguiente manera:
  5. ApplyMap('CountryMap', Country) as Country,

    El primer parámetro de la función ApplyMap() tiene el nombre de enlace entre paréntesis simples. El segundo parámetro es el campo que tiene los datos que se han de reemplazar.

  6. Haga clic en Cargar datos.
  7. La tabla resultante tiene el siguiente aspecto:

    Tabla que muestra los datos cargados usando la función ApplyMap()
    Table showing data loaded using ApplyMap function.

    Las diversas grafías de United States se han modificado por US. Hay un registro que no se escribió correctamente, por lo que la función ApplyMap() no cambió ese valor del campo. Usando la función ApplyMap(), puede usar el tercer parámetro para agregar una expresión predeterminada si la tabla de correspondencia no tiene un valor coincidente.

  8. Añada 'US' como el tercer parámetro de la función ApplyMap(), para manejar tales casos cuando el país se haya introducido incorrectamente:
  9. ApplyMap('CountryMap', Country, 'US') as Country,

    Su script debería tener el aspecto siguiente:

    CountryMap: MAPPING LOAD * INLINE [ Country, NewCountry U.S.A., US U.S., US United States, US United States of America, US ]; Data: LOAD ID, Name, ApplyMap('CountryMap', Country, 'US') as Country, Code FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1);

  10. Haga clic en Cargar datos.
  11. La tabla resultante tiene el siguiente aspecto:

    Tabla que muestra los datos cargados usando la función ApplyMap

Nota informativaSi desea más información sobre ApplyMap(), vea este blog en Qlik Community: No use join - use Applymap en su lugar

La función MapSubstring()

La función MapSubstring() le permite asignar partes de un campo.

En la tabla creada por ApplyMap() ahora queremos que los números se escriban como texto, por lo que la función MapSubstring() se utilizará para reemplazar los datos numéricos por texto.

Para hacer esto debemos crear primero una tabla de correspondencia.

Haga lo siguiente:

  1. Añada las siguientes líneas de script al final de la sección CountryMap, pero antes de la sección Data.
  2. CodeMap: MAPPING LOAD * INLINE [ F1, F2 1, one 2, two 3, three 4, four 5, five 11, eleven ];

    En la tabla CodeMap, los números del 1 al 5, y 11 están enlazados.

  3. En la sección Data del script modifique la sentencia Code de la siguiente manera:
  4. MapSubString('CodeMap', Code) as Code

    Su script debería tener el aspecto siguiente:

    CountryMap: MAPPING LOAD * INLINE [ Country, NewCountry U.S.A., US U.S., US United States, US United States of America, US ]; CodeMap: MAPPING LOAD * INLINE [ F1, F2 1, one 2, two 3, three 4, four 5, five 11, eleven ]; Data: LOAD ID, Name, ApplyMap('CountryMap', Country, 'US') as Country, MapSubString('CodeMap', Code) as Code FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1);

  5. Haga clic en Cargar datos.
  6. La tabla resultante tiene el siguiente aspecto:

    Tabla que muestra los datos cargados usando la función MapSubString
    Table showing data loaded using MapSubString function.

    Los caracteres numéricos fueron reemplazados por texto en el campo Code. Si un número aparece más de una vez como es el caso de ID=3 y ID=4, el texto también se repite. ID=4. Susan McDaniels tenía un 6 en su código. Puesto que 6 no estaba enlazado en la tabla CodeMap, permanece sin modificar. ID=5, Dean Smith, tenía 111 en su código. Esto se ha enlazado como 'elevenone'.

Nota informativaSi desea más información sobre MapSubstring(), vea este blog en Qlik Community: Mapping … and not the geographical kind

Map … Using

La sentencia Map … Using también se puede utilizar para aplicar un mapa a un campo. No obstante, funciona de una manera un poco diferente a ApplyMap(). Mientras que ApplyMap() gestiona la asignación cada vez que se encuentra el nombre del campo, Map … Using trata la asignación cuando el valor se almacena bajo el nombre del campo en la tabla interna.

Echemos un vistazo a un ejemplo. Supongamos que estábamos cargando el campo Country varias veces en el script y queríamos aplicar un mapa cada vez que se cargaba el campo. La función ApplyMap() se puede usar tal como se ilustra anteriormente en este tutorial o se puede usar Map … Using.

Si usamos Map … Using entonces el mapa se aplica al campo cuando el campo se almacena en la tabla interna. Así pues, en el ejemplo a continuación, el mapa se aplica al campo Country de la tabla Data1 pero no se aplicaría al campo Country2 de la tabla Data2. Esto se debe a que la sentencia Map … Using únicamente se aplica a campos denominados Country. Cuando el campo Country2 se almacena en la tabla interna deja de llamarse Country. Si desea que el mapa se aplique a la tabla Country2, debe utilizar la función ApplyMap().

La sentencia Unmap pone fin a la sentencia Map … Using, de modo que si se fuera a cargar Country detrás de la sentencia Unmap, CountryMap no se aplicaría.

Haga lo siguiente:

  1. Reemplace el script de la tabla Data con lo siguiente:
  2. Map Country Using CountryMap;
    Data1:
    LOAD
        ID,
        Name,
        Country
    FROM [lib://DataFiles/Data.xlsx]
    (ooxml, embedded labels, table is Sheet1);
    					
    Data2:
    LOAD
        ID,
        Country as Country2
    FROM [lib://DataFiles/Data.xlsx]
    (ooxml, embedded labels, table is Sheet1);
    UNMAP;

  3. Haga clic en Cargar datos.
  4. La tabla resultante tiene el siguiente aspecto:

    Tabla que muestra los datos cargados usando la función Map … Using
    Table showing data loaded using Map … Using function.