{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Temperatura y precipitación de una celda NASA POWER\n",
        "\nEl punto de consulta está en Bogotá, pero los valores corresponden a una celda de rejilla. Revisa su elevación y fuente en fuentes.json. El periodo es 2024 completo y los días usan hora solar local (LST).\n",
        "\n**Pregunta:** ¿En qué meses cambia la temperatura diaria y cómo se distribuye la lluvia? ¿Qué parte de la interpretación depende de la resolución espacial?\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 = 'clima'\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": [
        "mensual = {}\n",
        "for fila in filas:\n",
        "    mes = fila['fecha'][:7]\n",
        "    mensual.setdefault(mes, {'temperaturas': [], 'lluvia': []})\n",
        "    if fila['temperatura_c'] != '':\n",
        "        mensual[mes]['temperaturas'].append(fila['temperatura_c'])\n",
        "    if fila['precipitacion_mm'] != '':\n",
        "        mensual[mes]['lluvia'].append(fila['precipitacion_mm'])\n",
        "for mes, valores in mensual.items():\n",
        "    media = sum(valores['temperaturas']) / len(valores['temperaturas']) if valores['temperaturas'] else None\n",
        "    total = sum(valores['lluvia']) if valores['lluvia'] else None\n",
        "    print(mes, 'temperatura media:', media, 'lluvia disponible:', total, 'días con lluvia informada:', len(valores['lluvia']))\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",
        "\nLa precipitación publicada en mm/día se integra sobre cada día completo para expresar mm acumulados del día. Los faltantes permanecen vacíos. Un año permite explorar variación estacional; para tendencias climáticas se necesitan series largas, control de calidad y un método apropiado.\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
}
