Suavizado / interpolación de datos categóricos (rápido)
Actualmente estoy trabajando con una matriz que contiene datos categóricos.
Las categorías están organizadas de la siguiente manera: None, zonaA, zonaB.
Mi matriz es una medida de sensores, me indica si, en cualquier momento, el sensor está en zonaA, zonaB o no está en ninguna zona.
Mi objetivo aquí es suavizar esos valores.
Por ejemplo, el sensor podría estar fuera de zonaA o zonaB durante un período de 30 medidas, pero si eso sucede, quiero que esas medidas se “suavicen”.
Ejemplo:
array[zonaA, zonaA, zonaA, None, None, zonaA, zonaA, None, None, None, zonaA]
debería dar como resultado
array[zonaA, zonaA, zonaA, zonaA, zonaA, zonaA, zonaA, None, None, None, zonaA]
con un umbral de 2.
Actualmente, estoy utilizando una iteración sobre matrices, pero su cálculo es muy costoso y puede llevar de 1 a 2 minutos. ¿Existe algún algoritmo existente para resolver ese problema?
Mi código actual:
def suavizar(self, df: pd.DataFrame) -> pd.DataFrame:
“””
Args:
df (pd.DataFrame): dataframe con la columna del terreno a suavizar.
Returns: dataframe suavizado
“””
df_iter = df
last = “None”
last_index = 0
for num, line in df_iter.iterrows():
if (
(line.terreno != “None”)
and (line.terreno == last)
and (num – last_index <= self.retraso)
and (
df_iter.iloc[(num – 1), df_iter.columns.get_loc(“terreno”)]
== “None”
)
):
df_iter.iloc[
last_index: (num + 1), # noqa: E203
df_iter.columns.get_loc(“terreno”),
] = last
if line.terreno != “None”:
last = line.terreno
last_index = num
return df_iter
davy.ai
Hay varios algoritmos posibles que se pueden utilizar para suavizar datos categóricos en una matriz. Un enfoque consiste en utilizar una ventana deslizante con un umbral especificado para determinar si los valores deben ser suavizados.
Aquí se muestra un ejemplo de implementación utilizando la biblioteca numpy:
Esta función toma una matriz de entrada
arr
con datos categóricos y aplica suavizado utilizando una ventana deslizante con un umbral especificado (umbral=2
en el ejemplo). Convierte los valores categóricos en valores numéricos, aplica suavizado y luego convierte los valores suavizados de nuevo a valores categóricos antes de devolver la salida.Para utilizar esta función con los datos de muestra proporcionados en la pregunta, se podría llamar de la siguiente manera:
Esto debería producir la misma salida que el ejemplo proporcionado en la pregunta. Hay que tener en cuenta que esta implementación debería ser mucho más rápida que utilizar una iteración sobre matrices.