Miguel Escobar Publicada diciembre 7, 2018

Tipos de datos, conversión de datos y tipos de datos asignados en Power Query y Power BI

Power BIPower BIPower QueryPower Query

Como vimos en una publicación anterior, hay muchas cosas que debemos tener en cuenta al manejar archivos de Excel, ya que incluso la extensión de un archivo de Excel puede impactar dramáticamente en tu solución y cómo Power Query interpreta el contenido de ese archivo.

En un sentido más amplio, también debemos tomar en cuenta 3 elementos clave que se aplican a cada uno de los datos que se incluyen en Power Query:

  • Tipos de datos – cada campo/columna puede tener asociado un tipo de datos específico
    • Conversión de tipo de datos – cada campo/columna puede permitir que sus miembros (filas) se conviertan a otro tipo de datos, así como el tipo de datos de su campo/columna puede definirse como un tipo de datos diferente.
    • Asignación de tipos de datos – en lugar de realizar una conversión para cada miembro de un campo/columna, simplemente podemos definir que la columna debe considerarse como un tipo de datos específico sin hacer ninguna conversión. Esto se considera como asignar un tipo de datos.

Es posible que hayas oído hablar de la conversión de tipos de datos, ya que es lo que Power Query hace automáticamente cuando haces clic en el menú desplegable «Tipo de datos» y seleccionas un tipo de datos para una columna, pero también puedes hacer lo que se llama asignar un tipo de datos, donde puedes definir un nuevo tipo de datos para un campo/columna específico sin hacer un proceso de conversión. Este artículo te mostrará cómo hacer esto y cuáles son los beneficios de hacerlo.

Una hoja de referencia para conversión de tipo de datos

Antes de seguir adelante, quiero compartir algo contigo.

En la mayoría de los sistemas de bases de datos y lenguajes de programación, puedes encontrar una sencilla hoja de referencia sobre los tipos de datos disponibles y cuáles son las posibles conversiones entre esos tipos de datos.

No pude encontrar una para el idioma M de Power Query, así que creé la mía que puedes usar como quieras (por favor úsala como está sin hacerle modificaciones). Utiliza todos los tipos de datos posibles que encuentras en el menú desplegable de tipos de datos.

Espero sinceramente que te parezca útil y puedes dejar cualquier comentario/sugerencia en la sección de comentarios que encuentras más adelante.

Haz clic en el botón a continuación para que puedas descargar las muestras que utilizo en este artículo:

Asignar un tipo de datos – Teoría

Imagina que tienes una consulta (Original Data) como la siguiente:

image

Como puedes ver, ninguna de las columnas tiene un tipo de datos definido. Podemos cambiar eso simplemente seleccionando cada una a través de la interfaz de usuario y eso nos dará una tabla que se verá así:

image

Cada columna tiene un tipo de datos definido, excepto la columna de información personal porque la IU no nos lo permite.

¿Cómo podemos asegurarnos de que esta columna de Información personal tenga el tipo de datos correcto? Bueno, para eso, vamos a crear una nueva consulta (FinalTypes) usando el siguiente código:

let
     Query1 = type table [  
       Name = text, 
       Hire Date = date, 
       Level = number,  
       Salary = number,
       Personal Information = record
   ]
in
     Query1

T

Esa consulta se verá así:

image

Esta consulta es esencialmente un tipo que define qué tipo de datos tiene cada columna dentro de una tabla. Nuevamente, esto no es una tabla en sí, sino que en realidad son los tipos de datos de las columnas de una tabla

Los valores que ves como «número», «texto», «fecha» y semejantes son tipos de Primitive Types. Aquí hay una lista de todos los tipos que puedes encontrar en el idioma M::

  • type null, que clasifica el valor nulo
  • type logical, que clasifica los valores verdadero y falso
  • type number, que clasifica los valores numéricos
  • type time, que clasifica los valores de tiempo
  • type date, que clasifica los valores de fecha
  • type datetime, que clasifica los valores de fecha y hora
  • type datetimezone, que clasifica los valores de fecha, hora y zona
  • type duration, que clasifica los valores de duración
  • type text, que clasifica los valores de texto
  • type binary, que clasifica los valores binarios
  • type type, que clasifica los valores de tipo
  • type list, que clasifica los valores de lista
  • type record, que clasifica los valores de registro
  • type table, que clasifica los valores de la tabla
  • type function, que clasifica los valores de función
  • type anynonnull, que clasifica todos los valores excluyendo el nulo

Nuestro siguiente paso es básicamente hacer algo similar a un «Format Painter», pero en este caso vamos a hacer un «Data Type Painter». Para hacer esto, crearemos una nueva consulta y usaremos una función llamada Value.ReplaceType que requiere un valor y luego un tipo. El código de esa consulta será similar al siguiente:

let
     Custom1 = Value.ReplaceType(#"Original Data", FinalTypes)
in
     Custom1

El resultado de esto se verá así:

image

Lo que sucede fundamentalmente es que Value.ReplaceType reemplaza los tipos de datos de la tabla original con los valores que definimos en la consulta FinalTypes. Básicamente, es como hacer un Copiar formato, y es una comparación tan cercana que realmente parece un copiador de formatos, porque al usar el Value.ReplaceType la función no tendrá en cuenta el nombre de las columnas sino la posición ordinal de ellas, por lo que debes asegurarte de que la tabla en la que estás tratando de aplicar este «Copiador de formatos de datos» tenga exactamente la misma cantidad de columnas que tu «tabla de tipos» y que las columnas tengan exactamente la misma posición y nombre, pues si el nombre cambia entonces será reemplazado con el nombre de tu ‘tabla de tipos’.

Asignar un tipo de datos – Ejemplo práctico

Imagina que tienes una consulta que contiene el rendimiento del producto mensual durante los últimos 7 meses. Luego creas una nueva columna que contiene el promedio de todos esos meses y obtienes algo como esto:

image

Digamos que deseas reemplazar todos los valores nulos de las columnas mensuales con los valores que vemos en la columna [Average].

Reemplazar los valores con valores de otra columna

Para hacer eso, usamos una operación de reemplazar valores en las columnas mensuales. Así que seleccionamos esas columnas, hacemos clic derecho y seleccionamos reemplazar valores. Necesitamos encontrar los valores nulos, pero no podemos elegir otra columna para el parámetro ‘Reemplazar con’, por lo que usamos un marcador de posición en su lugar. En nuestro caso ese marcador de posición será el número 0:

image

Luego ajustamos el código de la fórmula y reemplazamos ese marcador de posición 0 con el código each [Average] y se verá así:

image

Presta atención a lo que pasó. Todos los valores nulos se han reemplazado con los valores de la columna [Average]. ¡Eso es genial! Pero hay algunas malas noticias… Acabamos de perder por completo todos los tipos de datos de todas las columnas de nuestra tabla.

¿Cómo podemos arreglarlo? ¡Asignando el tipo de datos!

Asignar tipos de datos al rescate

Sigamos adelante y haz clic en el botón fx que vemos junto a la barra de fórmulas para que podamos crear un paso personalizado. En este nuevo paso usaremos la siguiente fórmula:

= Value.ReplaceType(#"Replaced Value", Value.Type(Source))
image

Observa que también estamos usando otra función con el nombre de Value.Type, y lo que hace esta función es simplemente tomar cualquier valor y generar su tipo de datos. Proporcionamos el valor que teníamos en el paso Source y que nos proporcionó una tabla de tipos con toda la información del tipo de datos para cada una de sus columnas.

Algo a tener en cuenta es que las columnas [1], [2], [3] e incluso la columna [7] tienen los íconos de valores enteros, pero tienen algunas filas con números decimales. Esto se debe a que asignamos los tipos de datos y nunca realizamos una conversión de tipos de datos.

Esto lo hice a propósito para que puedas ver qué hace la asignación de un tipo de datos y qué no. Puedes solucionar esto simplemente asegurándote de que la columna [Average] tenga el tipo de datos correcto antes de realizar la operación de Reemplazar valores y usar ese paso para la función Value.Type dentro de la función Value.ReplaceType.

Power BIPower BIPower QueryPower Query
Subscribe
Notify of
guest
0 Comentario
Inline Feedbacks
View all comments