import pandas as pd import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.manifold import TSNE # Función para aplicar Min-Max a cada columna def min_max_normalize(column): return (column - column.min()) / (column.max() - column.min()) # Cargar el archivo de Excel desde la ruta especificada file_path = r"C:\Users\USUARIO\Documents\Indonecia\Rice_Spectral.xlsx" data = pd.read_excel(file_path, sheet_name="Spectral") # Asegurarse de que los valores de "Location" sean numéricos data['Location'] = pd.to_numeric(data['Location'], errors='coerce') # Separar los datos de los números de onda (Wavenumbers) wavenumbers = data['Location'].dropna() # Eliminar posibles NaN en wavenumbers # Filtrar las columnas que pertenecen a Java y Bangka Belitung java_columns = [col for col in data.columns if "Java" in col] belitung_columns = [col for col in data.columns if "Bangka Belitung" in col] # Asegurarse de que todas las columnas de datos sean numéricas data[java_columns] = data[java_columns].apply(pd.to_numeric, errors='coerce') data[belitung_columns] = data[belitung_columns].apply(pd.to_numeric, errors='coerce') # Aplicar normalización Min-Max a cada firma espectral data[java_columns] = data[java_columns].apply(min_max_normalize) data[belitung_columns] = data[belitung_columns].apply(min_max_normalize) # Graficar las firmas espectrales normalizadas plt.figure(figsize=(10, 6)) # Graficar las firmas de Java en un color for column in java_columns: plt.plot(wavenumbers, data[column].dropna(), color='blue', label='Java' if 'Java' in column else "") # Graficar las firmas de Bangka Belitung en otro color for column in belitung_columns: plt.plot(wavenumbers, data[column].dropna(), color='green', label='Bangka Belitung' if 'Bangka Belitung' in column else "") # Etiquetas y título plt.title('Firmas Espectrales Normalizadas (Min-Max) de Muestras de Arroz') plt.xlabel('Número de Onda (Wavenumber)') plt.ylabel('Reflectancia Espectral Normalizada') plt.legend(['Java', 'Bangka Belitung']) # Mostrar la gráfica plt.show() # Preparar los datos para PCA y t-SNE all_columns = java_columns + belitung_columns spectral_data = data[all_columns].dropna().transpose() # Transponer para tener las firmas en filas # PCA: Análisis de Componentes Principales pca = PCA(n_components=2) pca_result = pca.fit_transform(spectral_data) # Graficar PCA plt.figure(figsize=(8, 6)) plt.scatter(pca_result[:len(java_columns), 0], pca_result[:len(java_columns), 1], color='blue', label='Java') plt.scatter(pca_result[len(java_columns):, 0], pca_result[len(java_columns):, 1], color='green', label='Bangka Belitung') plt.title('PCA de Firmas Espectrales') plt.xlabel('Componente Principal 1') plt.ylabel('Componente Principal 2') plt.legend() plt.show() # t-SNE: Embedding de Vecinos Estocásticos Distribuidos tsne = TSNE(n_components=2, random_state=42) tsne_result = tsne.fit_transform(spectral_data) # Graficar t-SNE plt.figure(figsize=(8, 6)) plt.scatter(tsne_result[:len(java_columns), 0], tsne_result[:len(java_columns), 1], color='blue', label='Java') plt.scatter(tsne_result[len(java_columns):, 0], tsne_result[len(java_columns):, 1], color='green', label='Bangka Belitung') plt.title('t-SNE de Firmas Espectrales') plt.xlabel('Componente t-SNE 1') plt.ylabel('Componente t-SNE 2') plt.legend() plt.show()