{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyP7BhjxVNFgnnbt5zUuYBup"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","source":["# Importar librerías necesarias para la red neuronal y procesamiento\n","import pandas as pd\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import tensorflow as tf\n","from tensorflow.keras import layers, models\n","from sklearn.model_selection import train_test_split\n","from sklearn.preprocessing import StandardScaler"],"metadata":{"id":"3GOnrto36gu_"},"execution_count":null,"outputs":[]},{"cell_type":"code","execution_count":null,"metadata":{"id":"N4TC0oo_6ah6"},"outputs":[],"source":["\n","\n","# Cargar datos (ya cargado en df) y preparar características\n","# Vamos a usar las siguientes columnas: latitude, longitude, depth, mag, nst, gap, dmin, rms, horizontalError, depthError, magError, magNst\n","# Usaremos 'mag' como una de las features, pero la usaremos como target para predecir el valor de magnitud de un terremoto,\n","# dada la hipótesis de que podríamos predecir magnitud a partir de otras características.\n","# Esto es un ejemplo demostrativo: en la realidad, predecir terremotos es muy complejo y requiere muchos factores adicionales.\n","\n","# Seleccionar columnas relevantes\n","cols_features = ['latitude', 'longitude', 'depth', 'nst', 'gap', 'dmin', 'rms', 'horizontalError', 'depthError', 'magError', 'magNst']\n","# Como target usaremos 'mag'\n","\n","# Limpiar datos: eliminar filas con valores nulos en las columnas que usaremos\n","data = df.dropna(subset=cols_features + ['mag']).copy()\n","\n","# Convertir a valores numéricos si es necesario\n","for col in cols_features + ['mag']:\n","    data[col] = pd.to_numeric(data[col], errors='coerce')\n","\n","# Eliminar posibles rows con NaNs resultantes de la conversión\n","data = data.dropna(subset=cols_features + ['mag'])\n","\n","# Separamos características (X) y target (y)\n","X = data[cols_features].values\n","y = data['mag'].values\n","\n","# Dividir en train y test\n","X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n","\n","# Escalar las características\n","scaler = StandardScaler()\n","X_train_scaled = scaler.fit_transform(X_train)\n","X_test_scaled = scaler.transform(X_test)\n","\n","# Crear la red neuronal\n","model = models.Sequential()\n","model.add(layers.Dense(64, activation='relu', input_shape=(X_train_scaled.shape[1],)))\n","model.add(layers.Dense(32, activation='relu'))\n","model.add(layers.Dense(16, activation='relu'))\n","# Salida única para predecir la magnitud\n","model.add(layers.Dense(1))\n","\n","# Compilar el modelo\n","model.compile(optimizer='adam', loss='mse', metrics=['mae'])\n","\n","# Documentación de la arquitectura\n","print('Arquitectura del modelo:')\n","model.summary()\n","\n","# Entrenamiento del modelo con validación\n","history = model.fit(X_train_scaled, y_train, validation_split=0.2, epochs=50, batch_size=32, verbose=1)\n","\n","# Graficar la evolución del entrenamiento\n","plt.figure(figsize=(12,5))\n","\n","# Loss\n","plt.subplot(1,2,1)\n","plt.plot(history.history['loss'], label='Entrenamiento')\n","plt.plot(history.history['val_loss'], label='Validación')\n","plt.title('Pérdida del modelo')\n","plt.xlabel('Época')\n","plt.ylabel('Pérdida (MSE)')\n","plt.legend()\n","\n","# MAE\n","plt.subplot(1,2,2)\n","plt.plot(history.history['mae'], label='Entrenamiento')\n","plt.plot(history.history['val_mae'], label='Validación')\n","plt.title('Error Absoluto Medio (MAE)')\n","plt.xlabel('Época')\n","plt.ylabel('MAE')\n","plt.legend()\n","\n","plt.tight_layout()\n","plt.show()\n","\n","# Evaluar el modelo en el conjunto de test\n","test_loss, test_mae = model.evaluate(X_test_scaled, y_test, verbose=0)\n","print('\\\n","Evaluación en conjunto de prueba:')\n","print('Pérdida (MSE):', test_loss)\n","print('MAE:', test_mae)\n","\n","# Guardar modelo y documentación\n","model.save('earthquake_prediction_model.h5')\n","print('\\\n","El modelo ha sido guardado como earthquake_prediction_model.h5')\n","\n","# Breve documentación del proceso:\n","# 1. Se utilizó el dataset provisto (query.csv) y se prepararon las variables numéricas referentes a la geolocalización 'latitude', 'longitude' y otras características del terremoto.\n","# 2. Se definió la variable objetivo (target) como la magnitud 'mag'.\n","# 3. Se preprocesaron los datos: eliminación de missing values, conversión a numéricos y escalado.\n","# 4. Se definió una red neuronal simple de tres capas densas con activaciones ReLU y una capa de salida para regresión.\n","# 5. Se entrenó el modelo y se evaluó su desempeño en un conjunto de validación y test, mostrando gráficas de la pérdida y del MAE.\n","# Nota: En un escenario real, se podrían agregar datos de fuentes en línea (por ejemplo, series de tiempo de actividad sísmica global, información geológica adicional, variables meteorológicas, etc.) utilizando APIs como la USGS, y se realizarían procesos de ingeniería de características más complejos.\n","\n","print('Proceso completado.')"]}]}