Ir al contenido principal
Todas las coleccionesGuías de usuario
Analítica: fundamentos de variables sintéticas
Analítica: fundamentos de variables sintéticas

Este artículo explica cómo y cuándo usar variables sintéticas en el motor de análisis de Ubidots para calcular ecuaciones complejas.

David Sepúlveda avatar
Escrito por David Sepúlveda
Actualizado hace más de 7 meses


El motor de análisis de Ubidots posee una herramienta de cálculo matemático complejo llamada variables sintéticas. En palabras simples, una variable es cualquier dato bruto dentro de un dispositivo en Ubidots y una variable sintética es el resultado del cálculo de variables brutas.

Esta herramienta te permite extender la funcionalidad de tu aplicación. Por ejemplo, si desarrollas un registrador de temperatura que lee la variable en °C y deseas mostrar los datos tanto en °C como en °F, recuperarías el cambio del sensor y enviarías dos valores a Ubidots: uno en °C y otro en °F. Esto agrega una carga de cálculo innecesaria a tu microcontrolador, pero con el motor de análisis de Ubidots solo necesitas enviar el valor bruto en °C y dejar que Ubidots realice los cálculos necesarios para convertirlo a °F, aliviando los requisitos excesivos de procesamiento del microcontrolador.

°F = ((9/5) * °C) + 32...

Ejemplo de cálculo sintético: De Celsius a Fahrenheit.

Aquí, aprenderás los fundamentos sobre variables sintéticas y las funciones matemáticas y estadísticas disponibles que puedes implementar con esta herramienta.

NOTA IMPORTANTE: La velocidad de cálculo del motor de variables sintéticas está fuertemente influenciada por la complejidad de la expresión sintética, lo que resulta en tiempos de cálculo que van desde unos pocos segundos hasta unos minutos, o incluso una hora. Si tu variable sintética está ligada a una lógica que es crítica para tu negocio, te recomendamos usar otro enfoque para calcularla, como una UbiFunction.

1. Creando una variable sintética

Ubidots almacena dots que provienen de tus dispositivos como variables predeterminadas (brutas) y estos datos tienen marcas de tiempo correspondientes que organizan cada uno de ellos en una lista de series de tiempo, utilizando la siguiente secuencia:

values={[value 1, timestamp 1], [value 2, timestamp 2],... [value n, timestamp n]}

Con el motor de análisis de Ubidots puedes aplicar diferentes operaciones al conjunto de datos de series de tiempo para crear un conjunto de datos paralelo que contenga variables calculadas; estas nuevas variables se llaman variables sintéticas. Para crear una, haz clic en el botón "+ add variable", o pasa el cursor sobre el botón "+", dentro de tu dispositivo y haz clic en "synthetic variable".

2. Lista de expresiones compatibles

Para conocer las funciones compatibles, visita el Centro de Desarrolladores de Ubidots o haz clic aquí para descargar un archivo PDF con la lista.

3. Expresiones matemáticas

Una variable sintética consiste en una operación matemática aplicada a toda la serie de tiempo:

Raw values={[value 1, timestamp 1], [value 2, timestamp 2],... [value n, timestamp n]}Square root values={[√value 1, timestamp 1], [√value 2, timestamp 2],... [√value n, timestamp n]}

En el ejemplo anterior, se aplica una expresión de raíz cuadrada a los datos de la serie de tiempo.

En la siguiente tabla, encontrarás la lista de expresiones matemáticas compatibles:

Sintaxis

Descripción

ceil(x)

Devuelve el número entero redondeado, mayor o igual, para cada elemento en la variable x. La función ceil siempre redondea hacia arriba al número entero más cercano.

floor(x)

Devuelve el valor entero más grande menor o igual a x.

round(x, n steps)

Devuelve el número en punto flotante redondeado a "n" dígitos después del punto decimal.

sin(x)

Devuelve el seno en radianes de cada elemento en la variable x.

cos(x)

Devuelve el coseno en radianes de cada elemento en la variable x.

tan(x)

Devuelve la tangente de cada elemento en la variable x.

arcsin(x)

Devuelve en radianes el arco seno de cada elemento en la variable x.

arccos(x)

Devuelve en radianes el arco coseno de cada elemento en la variable x.

arctan(x)

Devuelve en radianes el arco tangente de cada elemento en la variable x.

arctan2(x, y)

Devuelve en radianes la tangente trigonométrica inversa utilizando las variables de entrada x y y como coordenadas cartesianas.

Nota: Solo realizará la operación entre valores con la misma marca de tiempo.

sinh(x)

Devuelve el seno hiperbólico de cada elemento en la variable x.

cosh(x)

Devuelve el coseno hiperbólico de cada elemento en la variable x.

tanh(x)

Devuelve la tangente hiperbólica de cada elemento en la variable x.

arcsinh(x)

Devuelve en radianes el arco seno hiperbólico de cada elemento en la variable x.

arccosh(x)

Devuelve en radianes el arco coseno hiperbólico de cada elemento en la variable x.

arctanh(x)

Devuelve en radianes el arco tangente hiperbólico de cada elemento en la variable x.

exp(x)

Devuelve la exponencial de cada elemento en la variable x.

log(x, base)

Devuelve el logaritmo de cada elemento en la variable x. Por defecto, la base es el número de Euler.

abs(x)

Devuelve el valor absoluto de cada elemento en la variable x.

sqrt(x)

Devuelve el valor de la raíz cuadrada de cada elemento en la variable x.

Las operaciones aritméticas estándar y las constantes matemáticas también funcionan bien:

  • Suma: +

  • Resta: -

  • División: /

  • Multiplicación: *

  • Exponenciación: **

  • Módulo: %

  • π : pi

  • Número de Euler: e

Ejemplo:

Convirtiendo un valor de temperatura de °C a °F :​

F = ((9 / 5) * variable) + 32

El editor sintético se verá de la siguiente manera:

4. Expresiones de rango de datos

Ubidots te permite crear nuevas variables a partir de tu serie de tiempo basada en datos de rango de fechas; por ejemplo, calcular la temperatura promedio por hora o día, basado en las lecturas de tu sensor usando una variable sintética.

A continuación puedes encontrar las funciones de rango de datos comúnmente utilizadas y la estructura de la fórmula:

Sintaxis

Descripción

max(x, "range")

Devuelve el valor máximo de la variable x en el rango de tiempo especificado.

min(x, "range")

Devuelve el valor mínimo de la variable x en el rango de tiempo especificado.

mean(x, "range")

Devuelve el valor promedio de la variable x en el rango de tiempo especificado.

std(x, "range")

Devuelve la desviación estándar de la variable x en el rango de tiempo especificado.

median(x, "range")

Devuelve el valor mediano de la variable x en el rango de tiempo especificado.

count(x, "range")

Devuelve el número de puntos almacenados en la variable x para el rango de tiempo especificado.

last(x, "range")

Devuelve el último valor de la variable x en el rango de fechas especificado.

first(x, "range")

Devuelve el primer valor de la variable x en el rango de tiempo especificado.

sum(x, "range")

Devuelve la suma de los valores de los puntos almacenados en la variable x en el rango de tiempo especificado.

Rangos de tiempo disponibles:

  • "nT": Cada n minutos.

  • "nH": Cada n horas.

  • "nD": Cada n días.

  • "W": Cada fin de semana.

  • "M": Cada fin de mes.

NOTA IMPORTANTE: El rango seleccionado debe establecerse de manera que divida uniformemente el siguiente rango. Por ejemplo, si se usan minutos ("T"), cualquiera que sea el número, debe dividir uniformemente una hora ("H"). Bajo dicho ejemplo, los valores disponibles para minutos son: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30. Otros valores pueden generar resultados inesperados. Lo mismo se aplica a otros rangos.

Ejemplo:

La temperatura promedio cada 10 minutos en °F:
A = mean( ((9 / 5) * variable) + 32, "10T" )

La expresión se verá de la siguiente manera:

T = ((9/5) * <variable>) + 32mean(t, "10T")

Ejemplo:
Cada n rango de datos comienza su período a las 00:00:00, sin embargo, hay aplicaciones particulares donde el punto de inicio deseado no es 00:00:00, sino más bien 02:00:00 o 00:40:00, dependiendo del rango de datos de entrada. Para aplicar un desfase, las funciones anteriores pueden recibir un tercer parámetro llamado offset, de la siguiente manera:​

A = sum(variable, "8H", offset=6)

El ejemplo anterior corresponde a la suma de la variable calculada cada 8 horas, con un desfase de 6 horas (más allá de 00:00:00), es decir, 06:00:00. En consecuencia, la variable sintética se ejecutará a las 6:00, 14:00 y 22:00 diariamente.

5. Expresiones de rodamiento

Esta función devuelve el valor calculado de una serie de datos dentro de una ventana de tiempo o un número determinado de valores, utilizando uno de los siguientes métodos de agregación: "mean", "sum", "min", "max" o "count".

rolling (variable, aggregation_method, type_range, range, min_periods = 2)

Ejemplo:
Calcular el valor máximo de una muestra de cuatro puntos de datos.
rolling(variable,"max","values",4)

6. Funciones avanzadas

Hay funciones adicionales para operaciones más complejas:

6.1. where ( )

where(condition, operation_if_true, operation_if_false)

Calcula operation_if_true si la condición es verdadera, o operation_if_false si la condición es falsa.


Declaraciones de comparación:

  • Igual a: ==

  • Mayor que: >

  • Menor que: <

  • No igual a: !=

  • Igual a, mayor que: >=

  • Igual a, menor que: <=

Expresiones lógicas (útiles cuando se establecen más de 1 condición):

  • Y: "and"

  • O: "or"

Ejemplos:
Llena la nueva variable sintética con un '1 (verdadero)' si el valor de la temperatura es mayor que 20:​

where(##{{var}} > 20, 1)

Llena la variable sintética con un '1' si el valor de la temperatura es mayor que 20, si no, llena con un valor '0':​

where(##{{var}} > 20, 1, 0)

Almacena la marca de tiempo de las variables si es menor que 20 O mayor que 50:

where(##{{var}} < 20 or ##{{var}} > 50, ##{{var}}.timestamp)

Como puedes ver, el operador punto (.) te permite acceder al atributo de marca de tiempo de la variable.

6.2. diff ( )

Esta función devuelve la diferencia, comenzando en el último elemento de una serie de tiempo y el siguiente, separado por un número específico de pasos.

diff(x, step)

6.3. shift ( )

Esta función devuelve los valores de la variable en la serie de tiempo desplazados por el número dado de pasos.

shift(x,step)

6.4. cumsum ( )

Esta función devuelve la suma acumulativa de una serie de tiempo.

cumsum(x)

6.5. fill_missing ( )

fill_missing(x)

Calcula una expresión que contiene múltiples variables con diferentes marcas de tiempo, llenando cualquier valor de marca de tiempo no igual con el último valor de la variable no igual.


Ejemplo:

fill_missing(3 * var1_id + var2_id)
  • Obtener el valor del contexto de una variable

{YOUR_VARIABLE}.context.context-key

Los datos de contexto solo se pueden usar dentro de tu expresión sintética si el contexto es un número.

  • Obtener la marca de tiempo de una variable

{YOUR_VARIABLE}.timestamp

Similar a recuperar datos de contexto, puedes recuperar la marca de tiempo de una variable usando el operador punto '.'. Para obtener más información sobre funciones avanzadas, consulta este artículo: Analíticas: Variables Sintéticas Avanzadas.

7. Configuración de la zona horaria de las variables sintéticas

El editor de variables sintéticas te permite seleccionar la zona horaria para referenciar las marcas de tiempo exactas de la variable basada en una zona horaria particular. Esto es útil cuando tus clientes se encuentran en un país diferente y necesitan ver los datos en su zona horaria.

Después de hacer clic en el botón "aceptar", la variable sintética calculará los datos en función de la zona horaria seleccionada y los resultados se guardarán automáticamente como una variable de serie de tiempo.

8. Resultados

Ahora estás listo para comenzar a crear análisis y obtener información de tus datos utilizando el motor de análisis de Ubidots y variables sintéticas. Para solucionar problemas adicionales e inquietudes, consulta la Comunidad de Ubidots, donde no solo Ubidots te ayudará, sino también otros usuarios que pueden haber resuelto tus dudas.

¿Ha quedado contestada tu pregunta?