es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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:

    import numpy as np
    
    def suavizar_matriz(arr, categorías=["Ninguno", "zonaA", "zonaB"], umbral=2):
        # convertir la matriz a valores numéricos
        arr_num = np.zeros(arr.shape)
        for i, cat in enumerate(categorías):
            arr_num[arr == cat] = i
    
        # aplicar suavizado
        suavizado = np.zeros(arr_num.shape)
        for i, val in enumerate(arr_num):
            ventana = arr_num[max(0, i-umbral):i+umbral+1]
            conteos = np.bincount(ventana.astype(int))
            suavizado[i] = np.argmax(conteos)
    
        # convertir de nuevo a valores categóricos
        suavizado_cat = np.array(categorías)[suavizado.astype(int)]
    
        return suavizado_cat
    

    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:

    arr = np.array(["zonaA", "zonaA", "zonaA", "Ninguno", "Ninguno", "zonaA", "zonaA", "Ninguno", "Ninguno", "Ninguno", "zonaA"])
    suavizado = suavizar_matriz(arr)
    print(suavizado)  # salida: ["zonaA", "zonaA", "zonaA", "zonaA", "zonaA", "zonaA", "zonaA", "Ninguno", "Ninguno", "Ninguno", "zonaA"]
    

    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.

Comments are closed.