0% encontró este documento útil (0 votos)
9 vistas6 páginas

Codigo

Código para imágenes
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
9 vistas6 páginas

Codigo

Código para imágenes
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

import os

import pandas as pd
import numpy as np
import [Link] as plt
from sklearn.linear_model import LinearRegression
from [Link] import mean_squared_error

# Función para guardar los promedios de bandas y ND en un archivo Excel


def guardar_promedios_en_excel(promedios_bandas_negro, promedios_bandas_blanco,
promedios_nd_negro, promedios_nd_blanco, ruta_guardado):
# Convert dictionaries to DataFrames
df_bandas_negro = [Link]([promedios_bandas_negro])
df_bandas_blanco = [Link]([promedios_bandas_blanco])
df_nd_negro = [Link]([promedios_nd_negro])
df_nd_blanco = [Link]([promedios_nd_blanco])

# Save DataFrames to an Excel file


with [Link]([Link](ruta_guardado,
'promedios_totales_bandas.xlsx')) as writer:
df_bandas_negro.to_excel(writer, sheet_name='Promedios_Bandas_Negro',
index=False)
df_bandas_blanco.to_excel(writer, sheet_name='Promedios_Bandas_Blanco',
index=False)
df_nd_negro.to_excel(writer, sheet_name='Promedios_ND_Negro', index=False)
df_nd_blanco.to_excel(writer, sheet_name='Promedios_ND_Blanco',
index=False)

# Crear el DataFrame de promedios de bandas


df_bandas = [Link]({
'Banda': ['Banda Verde', 'Banda Roja', 'Banda Borde Rojo', 'Banda
Infrarrojo Cercano'],
'Promedio_Negro': [Link](promedios_bandas_negro),
'Promedio_Blanco': [Link](promedios_bandas_blanco)
})

# Crear el DataFrame de promedios ND


df_nd = [Link]({
'Banda': ['Banda Verde', 'Banda Roja', 'Banda Borde Rojo', 'Banda
Infrarrojo Cercano'],
'Promedio_ND_Negro': [Link](promedios_nd_negro),
'Promedio_ND_Blanco': [Link](promedios_nd_blanco)
})

# Guardar los DataFrames en un archivo Excel


with [Link]([Link](ruta_guardado,
'promedios_totales_bandas.xlsx')) as writer:
df_bandas.to_excel(writer, sheet_name='Promedios_Bandas', index=False)
df_nd.to_excel(writer, sheet_name='Promedios_ND', index=False)

# Función para calcular el promedio de reflectancia en cada archivo .TRM


def calcular_promedio_archivos_de_carpeta(carpeta):
columnas = []
primera_columna = None
archivos_trm = [f for f in [Link](carpeta) if [Link]('.TRM')]

if len(archivos_trm) == 0:
print(f"No se encontraron archivos .TRM en la carpeta: {carpeta}")
return None
for idx, archivo in enumerate(archivos_trm):
ruta_archivo = [Link](carpeta, archivo)
with open(ruta_archivo, 'r') as file:
lineas = [Link]()[2:] # Elimina las dos primeras filas

datos_procesados = []
for linea in lineas:
partes = [Link]()
if len(partes) > 1:
datos_procesados.append([float(valor) for valor in partes])
else:
raise ValueError(f"El archivo {archivo} no está correctamente
separado por espacios en la línea: {linea}")

df_temp = [Link](datos_procesados)

if idx == 0:
primera_columna = df_temp.iloc[:, 0]
if df_temp.shape[1] > 1:
[Link](df_temp.iloc[:, 1])
else:
raise ValueError(f"El archivo {archivo} no tiene suficientes
columnas.")

if len(columnas) == 0:
raise ValueError("No hay columnas válidas para promediar")

df_promedio = [Link]()
df_promedio['Longitud_Onda'] = primera_columna
df_promedio['Promedio_Reflectancia'] = [Link](columnas, axis=1).mean(axis=1)

return df_promedio

# Función para guardar los promedios de bandas


def guardar_por_banda(df_promedio, nombre_carpeta, es_objeto_negro=True):
bandas = {
'Verde': (544, 576),
'Roja': (634, 666),
'Borde_Rojo': (714, 746),
'Infrarrojo_Cercano': (834, 886)
}

promedios_banda = {}

for nombre_banda, (min_onda, max_onda) in [Link]():


datos_banda = df_promedio[(df_promedio['Longitud_Onda'] >= min_onda) &
(df_promedio['Longitud_Onda'] <= max_onda)]

if datos_banda.empty:
print(f"Warning: No data found for {nombre_banda} in {nombre_carpeta}.
Skipping...")
promedio_banda = [Link]
else:
promedio_banda = datos_banda['Promedio_Reflectancia'].mean()

promedios_banda[f'Promedio_{nombre_banda}'] = promedio_banda

promedios_banda[nombre_banda] = promedio_banda # Store in dictionary


return promedios_banda # Return the dictionary

# Función para cargar archivos ND y calcular promedios

def cargar_archivo_nd(ruta_archivo, nombre):


df_nd = pd.read_excel(ruta_archivo)

# Asegurarse de que los valores sean numéricos


df_nd['BANDA_1'] = pd.to_numeric(df_nd['BANDA_1'], errors='coerce')
df_nd['BANDA_2'] = pd.to_numeric(df_nd['BANDA_2'], errors='coerce')
df_nd['BANDA_3'] = pd.to_numeric(df_nd['BANDA_3'], errors='coerce')
df_nd['BANDA_4'] = pd.to_numeric(df_nd['BANDA_4'], errors='coerce')

# Calcular los promedios


promedios_nd = {
'Banda_Roja': df_nd['BANDA_1'].mean(),
'Banda_Verde': df_nd['BANDA_2'].mean(),
'Banda_Borde_Rojo': df_nd['BANDA_3'].mean(),
'Banda_Infrarrojo_Cercano': df_nd['BANDA_4'].mean()
}

# Guardar los promedios en un archivo de Excel


directorio_salida = [Link](ruta_archivo)
[Link](directorio_salida, exist_ok=True)

ruta_excel_nd = [Link](directorio_salida, f'Promedios_ND_{nombre}.xlsx')


[Link]([promedios_nd]).to_excel(ruta_excel_nd, index=False)
print(f"Archivo Excel de promedios ND guardado en {ruta_excel_nd}")

return promedios_nd

# Función para generar las gráficas de regresión conjunta


def generar_graficas_regresion_conjunta(ruta_excel, ruta_guardado):
"""Generates linear regression plots and saves equations to Excel."""
try:
# Load data from Excel sheets
df_bandas = pd.read_excel(ruta_excel, sheet_name='Promedios_Bandas')
df_nd = pd.read_excel(ruta_excel, sheet_name='Promedios_ND')

# Create a list to store the equations


ecuaciones = []

# Iterate through each band (row)


for i in range(len(df_bandas)):
# Get data for the current band - SWAPPED x and y
x_vals = [[df_nd.loc[i, 'Promedio_ND_Negro']], [df_nd.loc[i,
'Promedio_ND_Blanco']]] # Nested lists
y_vals = [df_bandas.loc[i, 'Promedio_Negro'], df_bandas.loc[i,
'Promedio_Blanco']]

# Perform linear regression


modelo = LinearRegression()
[Link](x_vals, y_vals)

# Calculate predictions and RMSE


y_pred = [Link](x_vals)
error_rmse = [Link](mean_squared_error(y_vals, y_pred))
# Format equation and RMSE for the legend
ecuacion = f'y = {modelo.coef_[0]:.8f}x + {modelo.intercept_:.8f}'
rmse_str = f'{error_rmse:.2e}'.replace('e', ' x 10^') # Format RMSE

# Append the equation to the list


[Link]({'Banda': df_bandas.loc[i, 'Banda'], 'Ecuacion':
ecuacion})

# Generate and save the plot


[Link]()
[Link](x_vals, y_vals, color='blue', label='Datos Observados')
[Link](x_vals, y_pred, color='red', label=f'{ecuacion}\nRMSE:
{rmse_str}')
[Link]('Valor ND (Negro/Blanco)') # Changed label
[Link]('Reflectancia Promedio (Negro/Blanco)') # Changed label
[Link](f'Regresión para {df_bandas.loc[i, "Banda"]}')
[Link]()
[Link](True)

[Link](ruta_guardado, exist_ok=True)
ruta_grafica = [Link](ruta_guardado,
f'Regresion_{df_bandas.loc[i, "Banda"]}.png')
[Link](ruta_grafica)
[Link]()
print(f"Gráfica de regresión guardada en: {ruta_grafica}")

# Save equations to Excel


df_ecuaciones = [Link](ecuaciones)
ruta_ecuaciones = [Link](ruta_guardado, 'Ecuaciones_Regresion.xlsx')
df_ecuaciones.to_excel(ruta_ecuaciones, index=False)
print(f"Ecuaciones de regresión guardadas en: {ruta_ecuaciones}")

except FileNotFoundError:
print(f"Error: No se encontró el archivo Excel en la ruta: {ruta_excel}")
except Exception as e:
print(f"Error durante la regresión: {e}")

# Función para procesar las subcarpetas


def procesar_subcarpetas(carpeta_raiz, ruta_guardado, ruta_objeto_negro,
ruta_objeto_blanco):
subcarpetas = [f for f in [Link](carpeta_raiz) if
[Link]([Link](carpeta_raiz, f))]

# Find the actual Excel files for ND data


archivos_excel = [f for f in [Link](carpeta_raiz) if [Link]('.xlsx')
and not [Link]('~$')] # Exclude temporary files

# Assuming there are two Excel files, one for negro and one for blanco
if len(archivos_excel) != 2:
raise ValueError("Expected two Excel files (one for negro and one for
blanco) in the root folder.")

# Directly use the provided file paths


promedios_nd_negro = cargar_archivo_nd(ruta_objeto_negro, 'Negro')
promedios_nd_blanco = cargar_archivo_nd(ruta_objeto_blanco, 'Blanco')

# Initialize dictionaries to store average values for each band


promedios_bandas_negro = {} # Initialize as an empty dictionary
promedios_bandas_blanco = {} # Initialize as an empty dictionary

for subcarpeta in subcarpetas:


carpeta_subcarpeta = [Link](carpeta_raiz, subcarpeta)
try: # Add a try-except block to handle potential errors
if 'negro' in [Link]():
df_promedio =
calcular_promedio_archivos_de_carpeta(carpeta_subcarpeta)
if df_promedio is not None: # Check if df_promedio is valid
promedios_bandas_negro = guardar_por_banda(df_promedio,
carpeta_subcarpeta, es_objeto_negro=True)
elif 'blanco' in [Link]():
df_promedio =
calcular_promedio_archivos_de_carpeta(carpeta_subcarpeta)
if df_promedio is not None: # Check if df_promedio is valid
promedios_bandas_blanco = guardar_por_banda(df_promedio,
carpeta_subcarpeta, es_objeto_negro=False)
except (ValueError, FileNotFoundError) as e:
print(f"Error processing subfolder {subcarpeta}: {e}") # Print error
messages for debugging

# Reformatting promedios_bandas_negro and promedios_bandas_blanco before saving


to Excel
bandas = ['Verde', 'Roja', 'Borde_Rojo', 'Infrarrojo_Cercano']
promedios_bandas_negro_reformatted = {f'Promedio_{banda}':
promedios_bandas_negro.get(banda) for banda in bandas}
promedios_bandas_blanco_reformatted = {f'Promedio_{banda}':
promedios_bandas_blanco.get(banda) for banda in bandas}

# Ensure promedios_bandas_negro and promedios_bandas_blanco are defined


if promedios_bandas_negro: # Check if not empty
promedios_bandas_negro_reformatted = {f'Promedio_{banda}':
promedios_bandas_negro.get(banda) for banda in bandas}
if promedios_bandas_blanco: # Check if not empty
promedios_bandas_blanco_reformatted = {f'Promedio_{banda}':
promedios_bandas_blanco.get(banda) for banda in bandas}

# Guardar promedios en Excel using reformatted dictionaries


guardar_promedios_en_excel(promedios_bandas_negro_reformatted,
promedios_bandas_blanco_reformatted, promedios_nd_negro, promedios_nd_blanco,
ruta_guardado)

return promedios_bandas_negro_reformatted, promedios_bandas_blanco_reformatted


# Return reformatted dictionaries
def main():
carpeta_principal = input("Introduce el nombre de la carpeta principal con los
archivos TRM: ")
# Get the full path for the ND files, including file names
ruta_objeto_negro = input("Introduce la ruta completa del archivo ND del objeto
negro (incluyendo nombre del archivo): ")
ruta_objeto_blanco = input("Introduce la ruta completa del archivo ND del
objeto blanco (incluyendo nombre del archivo): ")
ruta_guardado = carpeta_principal
# Cargar archivos ND y calcular promedios
promedios_nd_negro = cargar_archivo_nd(ruta_objeto_negro, 'Negro') # Removed
the extra argument 'Objeto_Negro'
promedios_nd_blanco = cargar_archivo_nd(ruta_objeto_blanco, 'Blanco') #
Removed the extra argument 'Objeto_Blanco'

# Call procesar_subcarpetas with both arguments and assign the returned values
promedios_bandas_negro, promedios_bandas_blanco =
procesar_subcarpetas(carpeta_principal, ruta_guardado, ruta_objeto_negro,
ruta_objeto_blanco) # Pass file paths to procesar_subcarpetas and capture returned
values

# Access the values from the dictionaries


promedios_bandas_negro_values = list(promedios_bandas_negro.values())
promedios_bandas_blanco_values = list(promedios_bandas_blanco.values())

# Verificar los promedios que se están utilizando para la regresión


print("Promedios Bandas Negro:", promedios_bandas_negro)
print("Promedios Bandas Blanco:", promedios_bandas_blanco)
print("Promedios ND Negro:", promedios_nd_negro)
print("Promedios ND Blanco:", promedios_nd_blanco)

# Assign the calculated values from procesar_subcarpetas


# Access the values from the dictionaries
promedios_bandas_negro_values = list(promedios_bandas_negro.values())
promedios_bandas_blanco_values = list(promedios_bandas_blanco.values())

# Verificar los promedios que se están utilizando para la regresión


print("Promedios Bandas Negro:", promedios_bandas_negro)
print("Promedios Bandas Blanco:", promedios_bandas_blanco)
print("Promedios ND Negro:", promedios_nd_negro)
print("Promedios ND Blanco:", promedios_nd_blanco)

# Call the new function for regression


ruta_excel_promedios = [Link](carpeta_principal,
'promedios_totales_bandas.xlsx')
generar_graficas_regresion_conjunta(ruta_excel_promedios, carpeta_principal)

# Guardar los promedios en un archivo Excel


guardar_promedios_en_excel(
list(promedios_bandas_negro.values()), # Convertir en lista
list(promedios_bandas_blanco.values()), # Convertir en lista
list(promedios_nd_negro.values()), # Convertir en lista
list(promedios_nd_blanco.values()), # Convertir en lista
carpeta_principal
)
# Ejecutar el programa principal
if __name__ == "__main__":
main()

También podría gustarte