Correciones para reentrenamiento

This commit is contained in:
2025-05-04 20:58:43 +02:00
parent 56991c9f26
commit 721992d6f3
33 changed files with 740951 additions and 240889 deletions

16
utils/corrector.py Normal file
View File

@@ -0,0 +1,16 @@
import pandas as pd
# Volver a leer el archivo OpenBCI asegurando tipos correctos y evitando errores
openbci_df = pd.read_csv("join/merged_openbci.txt", comment="%", skipinitialspace=True, low_memory=False)
# Intentar convertir la columna de timestamp manejando errores
if "Timestamp (Formatted)" in openbci_df.columns:
openbci_df["Timestamp (Formatted)"] = pd.to_datetime(openbci_df["Timestamp (Formatted)"], errors='coerce')
# Verificar si hay valores no convertidos (NaT) y eliminarlos
openbci_df = openbci_df.dropna(subset=["Timestamp (Formatted)"])
# Generar nuevamente el archivo CSV formateado
corrected_csv_path = "/mnt/data/OpenBCI_corrected.csv"
openbci_df.to_csv(corrected_csv_path, index=False, header=True)

96
utils/creator.py Normal file
View File

@@ -0,0 +1,96 @@
import pandas as pd
from datetime import datetime
# Cargar archivo de logs
logs_path = "../join/mergedLog_output.txt"
openbci_path = "../join/mergedData_output.txt"
output_csv_path = "OpenBCI_with_labels.csv"
# Leer los logs y extraer tiempos y etiquetas
with open(logs_path, "r") as logs_file:
logs_data = [log.strip().split(",") for log in logs_file.readlines()]
with open(openbci_path, "r") as openbci_file:
lineas = [linea.strip().split(",") for linea in openbci_file.readlines() if not linea.strip().startswith('%')]
#Convertir los logs en un DataFrame
log_df = pd.DataFrame(logs_data, columns=["Timestamp", "Label"])
columns = "Sample Index, EXG Channel 0, EXG Channel 1, EXG Channel 2, EXG Channel 3, EXG Channel 4, EXG Channel 5, EXG Channel 6, EXG Channel 7, EXG Channel 8, EXG Channel 9, EXG Channel 10, EXG Channel 11, EXG Channel 12, EXG Channel 13, EXG Channel 14, EXG Channel 15, Accel Channel 0, Accel Channel 1, Accel Channel 2, Not Used, Digital Channel 0 (D11), Digital Channel 1 (D12), Digital Channel 2 (D13), Digital Channel 3 (D17), Not Used, Digital Channel 4 (D18), Analog Channel 0, Analog Channel 1, Analog Channel 2, Timestamp, Marker Channel, Timestamp (Formatted)".split(",")
data_df = pd.DataFrame(lineas, columns=columns)
# Buscar la columna correcta de timestamp
timestamp_col = next((col for col in data_df.columns if "Timestamp (Formatted)" in col), None)
if timestamp_col is None:
raise ValueError("No se encontró la columna de Timestamp en OpenBCI.")
# Convertir a formato datetime
data_df[timestamp_col] = pd.to_datetime(data_df[timestamp_col])
log_df["Timestamp"] = pd.to_datetime(log_df["Timestamp"], errors="coerce")
# Crear una nueva columna vacía para la etiqueta
data_df["Movement Label"] = ""
# Asignar etiquetas de acuerdo a los rangos en log_df
for i in range(len(log_df) - 1):
start_time = log_df.loc[i, "Timestamp"]
end_time = log_df.loc[i + 1, "Timestamp"]
label = log_df.loc[i, "Label"]
# Asignar etiqueta a los timestamps en el rango [start_time, end_time)
mask = (data_df[timestamp_col] >= start_time) & (data_df[timestamp_col] < end_time)
# Si el label es "none", "i" o "d", asignar valores numéricos; si es "c", ignorarlo
data_df.loc[mask, "Movement Label"] = label
data_df["Movement Label"] = data_df["Movement Label"].str.strip().str.lower()
# Reemplazar etiquetas con valores numéricos
label_mapping = {"none": 0, "i": 1, "d": 2}
data_df["Movement Label"] = data_df["Movement Label"].map(label_mapping)
# Verificar si hay valores NaN en la columna "Movement Label"
print(f"Valores sin etiquetar: {data_df['Movement Label'].isna().sum()} filas con NaN")
print("🔍 Timestamps en log_df (primeros 5 valores):")
print(log_df["Timestamp"].head())
print("\n🔍 Timestamps en data_df (primeros 5 valores):")
print(data_df[timestamp_col].head())
print("\n🔍 Últimos valores en log_df:")
print(log_df["Timestamp"].tail())
print("\n🔍 Últimos valores en data_df:")
print(data_df[timestamp_col].tail())
log_df["Timestamp"] = log_df["Timestamp"].dt.floor("S") # Redondea a segundos
data_df[timestamp_col] = data_df[timestamp_col].dt.floor("S") # Redondea a segundos
if log_df["Timestamp"].isna().sum() > 0:
print(f"⚠️ Hay {log_df['Timestamp'].isna().sum()} valores NaT en log_df. Eliminando...")
log_df = log_df.dropna(subset=["Timestamp"])
data_df["Movement Label"] = ""
for i in range(len(log_df) - 1):
start_time = log_df.loc[i, "Timestamp"]
end_time = log_df.loc[i + 1, "Timestamp"]
label = log_df.loc[i, "Label"]
print(f"Asignando etiqueta '{label}' a registros entre {start_time} y {end_time}")
mask = (data_df[timestamp_col] >= start_time) & (data_df[timestamp_col] < end_time)
data_df.loc[mask, "Movement Label"] = label
# Eliminar registros con etiqueta 'c'
data_df = data_df[data_df["Movement Label"].notna()]
# Guardar en un archivo CSV
data_df.to_csv("openbci_with_labels_filtered.csv", index=False)

23
utils/graficas.py Normal file
View File

@@ -0,0 +1,23 @@
import matplotlib.pyplot as plt
# Datos de número de esferas y tiempos de ejecución
esferas = [2, 3, 4, 5, 6, 7, 8, 9, 10]
tiempo_sin_opt = [0.000352, 0.000665, 0.001057, 0.001575, 0.002254, 0.003026, 0.003879, 0.004943, 0.006069]
tiempo_con_opt = [0.000415, 0.000782, 0.001290, 0.001933, 0.002772, 0.003041, 0.004010, 0.005100, 0.006061]
# Crear la gráfica
plt.figure(figsize=(8, 5))
plt.plot(esferas, tiempo_sin_opt, marker="o", linestyle="-", label="Tiempo sin optimizar")
plt.plot(esferas, tiempo_con_opt, marker="s", linestyle="--", label="Tiempo optimizado (-O2)")
plt.xlabel("Número de Esferas")
plt.ylabel("Tiempo de ejecución (s)")
plt.title("Comparación de Tiempos de Ejecución con y sin Optimización")
plt.legend()
plt.grid(True)
# Guardar la imagen en el mismo directorio
plt.savefig("comparacion_tiempos.png")
# Mostrar la gráfica
plt.show()

103
utils/maker.py Normal file
View File

@@ -0,0 +1,103 @@
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
def procesar_archivo_txt(ruta_archivo):
try:
ruta = Path(ruta_archivo)
if not ruta.is_file():
raise FileNotFoundError(f"La ruta '{ruta_archivo}' no apunta a un archivo válido.")
# Leer todas las líneas del archivo
with open(ruta, 'r') as archivo:
lineas = archivo.readlines()
# Buscar la cabecera (línea que comienza con 'Sample Index')
for i, linea in enumerate(lineas):
if linea.startswith("Sample Index"):
inicio_datos = i
break
else:
raise ValueError("No se encontró la cabecera en el archivo.")
# Leer los datos desde la cabecera utilizando pandas
datos = pd.read_csv(ruta, skiprows=inicio_datos)
# Convertir columnas a numéricas donde sea posible
for columna in datos.columns:
try:
datos[columna] = pd.to_numeric(datos[columna], errors='coerce')
except Exception as e:
print(f"Error al convertir la columna '{columna}': {e}")
return datos
except FileNotFoundError as e:
print(f"Archivo no encontrado: {e}")
except PermissionError as e:
print(f"Permiso denegado: {e}")
except ValueError as e:
print(f"Error de formato en el archivo: {e}")
except Exception as e:
print(f"Error procesando el archivo: {e}")
# Ruta al archivo
ruta = r"C:\Users\lumon\Desktop\OpenBCI-RAW-2024-10-10_17-56-37.txt"
df = procesar_archivo_txt(ruta)
if df is not None:
print(df.columns)
def graficar_datos(df):
# Eliminar espacios extra en los nombres de las columnas
df.columns = df.columns.str.strip()
# Verificar si la columna 'Timestamp' está presente
if 'Timestamp' not in df.columns:
print("La columna 'Timestamp' no se encuentra en el archivo.")
return
# Si el archivo tiene un Timestamp y lo queremos graficar, convertir a formato datetime
df['Timestamp'] = pd.to_datetime(df['Timestamp'], errors='coerce') # Convertir a datetime
# Graficar algunos canales de EXG en función del tiempo
plt.figure(figsize=(12, 6))
# Graficar EXG Channel 0, 1, 2
plt.plot(df['Timestamp'], df['EXG Channel 0'], label='EXG Channel 0')
plt.plot(df['Timestamp'], df['EXG Channel 1'], label='EXG Channel 1')
plt.plot(df['Timestamp'], df['EXG Channel 2'], label='EXG Channel 2')
plt.plot(df['Timestamp'], df['EXG Channel 3'], label='EXG Channel 3')
plt.plot(df['Timestamp'], df['EXG Channel 4'], label='EXG Channel 4')
plt.plot(df['Timestamp'], df['EXG Channel 5'], label='EXG Channel 5')
plt.plot(df['Timestamp'], df['EXG Channel 6'], label='EXG Channel 6')
plt.plot(df['Timestamp'], df['EXG Channel 7'], label='EXG Channel 7')
plt.plot(df['Timestamp'], df['EXG Channel 8'], label='EXG Channel 8')
plt.plot(df['Timestamp'], df['EXG Channel 9'], label='EXG Channel 9')
plt.plot(df['Timestamp'], df['EXG Channel 10'], label='EXG Channel 10')
plt.plot(df['Timestamp'], df['EXG Channel 11'], label='EXG Channel 11')
plt.plot(df['Timestamp'], df['EXG Channel 12'], label='EXG Channel 12')
plt.plot(df['Timestamp'], df['EXG Channel 13'], label='EXG Channel 13')
plt.plot(df['Timestamp'], df['EXG Channel 14'], label='EXG Channel 14')
plt.plot(df['Timestamp'], df['EXG Channel 15'], label='EXG Channel 15')
# Títulos y etiquetas
plt.title("Señales de Canales EXG a lo largo del Tiempo")
plt.xlabel("Tiempo (Timestamp)")
plt.ylabel("Valor de la señal (µV)")
# Agregar leyenda
plt.legend()
# Mejorar el formato de las fechas en el eje X
plt.xticks(rotation=45)
# Mostrar la gráfica
plt.tight_layout()
plt.show()
# Supongamos que df es el DataFrame procesado anteriormente
if df is not None:
graficar_datos(df)

28
utils/merge.py Normal file
View File

@@ -0,0 +1,28 @@
import os
# Configuración
input_directory = "./data" # Carpeta donde están los archivos TXT
output_file = "../join/mergedData_output.txt" # Nombre del archivo combinado
separator = "" # Separador opcional entre archivos
# Verificar que la carpeta existe
if not os.path.isdir(input_directory):
raise FileNotFoundError(f"La carpeta especificada no existe: {input_directory}")
# Obtener lista de archivos TXT
txt_files = sorted([f for f in os.listdir(input_directory) if f.endswith(".txt")])
if not txt_files:
raise FileNotFoundError("No se encontraron archivos TXT en la carpeta especificada.")
# Combinar archivos en uno solo
with open(output_file, "w", encoding="utf-8") as outfile:
for i, file in enumerate(txt_files):
file_path = os.path.join(input_directory, file)
with open(file_path, "r", encoding="utf-8") as infile:
outfile.write(infile.read())
if i < len(txt_files) - 1: # No agregar separador al final
outfile.write(separator)
print(f"Archivos combinados en '{output_file}' exitosamente. ✅")