{ "cells": [ { "cell_type": "markdown", "id": "66e2b034-42ec-4e37-8ebf-d8d2963d2de9", "metadata": {}, "source": [ "# Calculating Extended EOF coupled patterns on SST data using Spy4Cast and Xeofs" ] }, { "cell_type": "markdown", "id": "21028987-45dc-4fc0-9244-6e85739aaa63", "metadata": {}, "source": [ "### We will be estudying ENSO variability and following the example of [Sparse PCA](https://xeofs.readthedocs.io/en/latest/content/user_guide/auto_examples/1single/plot_eof-smode.html) on Xeofs docs" ] }, { "cell_type": "markdown", "id": "e5e799aa-ba38-498b-9df1-1df9561892e0", "metadata": {}, "source": [ "We will be using the package [Xeofs](https://xeofs.readthedocs.io) so it has be installed on your environment" ] }, { "cell_type": "code", "execution_count": 1, "id": "18e6d154-45d0-4d37-adcc-5299b9cfd3ab", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: xeofs in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (3.0.4)\n", "Requirement already satisfied: numpy>=1.24 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from xeofs) (1.24.0)\n", "Requirement already satisfied: pandas>=2 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from xeofs) (2.2.3)\n", "Requirement already satisfied: xarray>=2024.10.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from xeofs) (2024.10.0)\n", "Requirement already satisfied: scikit-learn>=1.0.2 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from xeofs) (1.6.1)\n", "Requirement already satisfied: tqdm>=4.64.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from xeofs) (4.67.1)\n", "Requirement already satisfied: dask>=2023.0.1 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from xeofs) (2025.3.0)\n", "Requirement already satisfied: typing-extensions>=4.8.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from xeofs) (4.12.2)\n", "Requirement already satisfied: click>=8.1 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (8.1.8)\n", "Requirement already satisfied: cloudpickle>=3.0.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (3.1.1)\n", "Requirement already satisfied: fsspec>=2021.09.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (2025.3.0)\n", "Requirement already satisfied: packaging>=20.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (24.2)\n", "Requirement already satisfied: partd>=1.4.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (1.4.2)\n", "Requirement already satisfied: pyyaml>=5.3.1 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (6.0.2)\n", "Requirement already satisfied: toolz>=0.10.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (1.0.0)\n", "Requirement already satisfied: importlib_metadata>=4.13.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from dask>=2023.0.1->xeofs) (8.6.1)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from pandas>=2->xeofs) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from pandas>=2->xeofs) (2025.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from pandas>=2->xeofs) (2025.2)\n", "Requirement already satisfied: scipy>=1.6.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from scikit-learn>=1.0.2->xeofs) (1.8.0)\n", "Requirement already satisfied: joblib>=1.2.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from scikit-learn>=1.0.2->xeofs) (1.4.2)\n", "Requirement already satisfied: threadpoolctl>=3.1.0 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from scikit-learn>=1.0.2->xeofs) (3.6.0)\n", "Requirement already satisfied: zipp>=3.20 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from importlib_metadata>=4.13.0->dask>=2023.0.1->xeofs) (3.21.0)\n", "Requirement already satisfied: locket in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from partd>=1.4.0->dask>=2023.0.1->xeofs) (1.0.0)\n", "Requirement already satisfied: six>=1.5 in /Users/pabloduran/opt/anaconda3/envs/Spy4CastManual/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas>=2->xeofs) (1.16.0)\n" ] } ], "source": [ "!pip install xeofs" ] }, { "cell_type": "markdown", "id": "aee8fa58-de38-4e3a-b873-92e26ef89ab0", "metadata": {}, "source": [ "
<xarray.DataArray (space: 11400, time: 50)> Size: 2MB\n",
"array([[ 0.1218338 , -0.7404156 , -0.37068748, ..., 0.40730476,\n",
" -0.08609772, 0.7360344 ],\n",
" [ 0.12066078, -0.6983509 , -0.50611687, ..., 0.43603134,\n",
" -0.10463333, 0.71489143],\n",
" [ 0.09488487, -0.60853004, -0.47955322, ..., 0.4428997 ,\n",
" -0.08998299, 0.6097183 ],\n",
" ...,\n",
" [-0.04133224, -0.6569271 , 0.27676392, ..., 0.3637085 ,\n",
" 0.08168983, 0.23239326],\n",
" [ 0.08904076, -0.6933708 , 0.30057144, ..., 0.29126167,\n",
" 0.05827522, 0.31897163],\n",
" [ 0.1316433 , -0.65839577, 0.30573654, ..., 0.24592209,\n",
" 0.0136776 , 0.355505 ]], dtype=float32)\n",
"Coordinates:\n",
" * time (time) int64 400B 1970 1971 1972 1973 1974 ... 2016 2017 2018 2019\n",
"Dimensions without coordinates: space