{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Planetas y estrellas anfitrionas\n",
        "\nTrabaja con todos los planetas que cumplen el filtro publicado: detección por tránsito hasta 2024, solución predeterminada, radio y periodo positivos sin banderas de límite. Esta selección permite comparar propiedades; no representa todos los planetas del universo.\n",
        "\n**Pregunta:** ¿Cómo se relacionan el periodo orbital y el radio dentro de esta selección? ¿Cuántas filas representan planetas y cuántas anfitrionas distintas?\n",
        "\nAbre este cuaderno desde el paquete completo del módulo. Ejecuta las celdas en orden en Jupyter o en el editor de cuadernos de tu entorno. Solo las figuras requieren Matplotlib. Estos cuadernos leen los archivos incluidos y no descargan información.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from pathlib import Path\n",
        "import importlib.util\n",
        "import json\n",
        "\n",
        "if 'BASE_MODULO' not in globals():\n",
        "    candidatos = [Path.cwd(), *Path.cwd().parents]\n",
        "    BASE_MODULO = next((p for c in candidatos for p in (c, c / 'materiales/analisis-datos') if (p / 'codigo/analysis_data.py').is_file()), None)\n",
        "    if BASE_MODULO is None:\n",
        "        raise FileNotFoundError('Abre el cuaderno dentro del paquete completo del módulo.')\n",
        "spec = importlib.util.spec_from_file_location('analisis_modulo', BASE_MODULO / 'codigo/analysis_data.py')\n",
        "analisis = importlib.util.module_from_spec(spec)\n",
        "spec.loader.exec_module(analisis)\n",
        "verificacion = analisis.validate_bundle(BASE_MODULO)\n",
        "nombre = 'exoplanetas'\n",
        "filas = analisis.read_csv(BASE_MODULO / 'datos' / (nombre + '.csv'), nombre)\n",
        "fuente = json.loads((BASE_MODULO / 'fuentes.json').read_text(encoding='utf-8'))['datasets'][nombre]\n",
        "print('Filas:', len(filas))\n",
        "print('Consulta:', fuente['url_consulta'])\n",
        "print('Fecha de descarga:', fuente['fecha_descarga'])\n",
        "print('Unidades:', fuente['unidades'])\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Inspecciona antes de interpretar\n",
        "\nCada fila tiene un significado, cada columna una unidad y cada dato una procedencia. La validación anterior compara el CSV con su original y comprueba hashes. Revisa las primeras filas sin inferir que representan estadísticamente toda la selección.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "print(json.dumps(filas[:5], ensure_ascii=False, indent=2))\n",
        "print('Límites de uso:')\n",
        "for limite in fuente['limites']:\n",
        "    print('-', limite)\n",
        "resultado = analisis.summarize(nombre, filas)\n",
        "print(json.dumps(resultado, ensure_ascii=False, indent=2))\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Reproduce una comprobación\n",
        "\nComprueba el resultado con una operación visible. Conserva la unidad y el denominador al describirlo.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "anfitrionas = {}\n",
        "for fila in filas:\n",
        "    anfitrionas.setdefault(fila['hostname'], []).append(fila)\n",
        "repetidas = {nombre: len(grupo) for nombre, grupo in anfitrionas.items() if len(grupo) > 1}\n",
        "print('Anfitrionas con más de un planeta en esta selección:', len(repetidas))\n",
        "print('No conviertas las filas de planetas en observaciones estelares independientes.')\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Genera y examina los gráficos\n",
        "\nLa celda guarda PNG y SVG. Revisa títulos, ejes, unidades, selección y valores faltantes. Usa el CSV como alternativa tabular y describe con palabras el patrón que observas.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "if globals().get('MOSTRAR_FIGURAS', True):\n",
        "    from IPython.display import Image, display\n",
        "    imagenes = analisis.create_figures(BASE_MODULO, only=nombre)\n",
        "    display(Image(filename=str(imagenes[0])))\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Interpreta y contrasta\n",
        "\nPara un gráfico de estrellas, separa una tabla por anfitriona y revisa discrepancias de parámetros entre referencias antes de elegir un valor. No promedies valores incompatibles por comodidad. Las cifras de st_teff y st_rad permiten explorar temperatura y tamaño; no equivalen a un diagrama completo de Hertzsprung–Russell.\n",
        "\nEscribe un hallazgo que pueda comprobarse, una limitación y una pregunta siguiente. Cita la URL, la fecha de descarga y el filtro. Para refrescar datos, ejecuta conscientemente el comando `refrescar` explicado en `codigo/README.md`; el análisis offline conserva la versión descargada.\n"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.11"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
