Correciones para reentrenamiento
This commit is contained in:
16
utils/corrector.py
Normal file
16
utils/corrector.py
Normal 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
96
utils/creator.py
Normal 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
23
utils/graficas.py
Normal 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
103
utils/maker.py
Normal 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
28
utils/merge.py
Normal 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. ✅")
|
Reference in New Issue
Block a user