Skip to main content

A comprehensive Python toolkit for Empirical Orthogonal Function (EOF) analysis

Project description

EOFtoolkit

A comprehensive Python toolkit for Empirical Orthogonal Function (EOF) analysis, designed for climate scientists, meteorologists, oceanographers, and researchers working with spatiotemporal data analysis.

🌟 Features

  • Fast EOF Decomposition: Efficient computation of EOFs using SVD and eigenvalue decomposition
  • Multiple EOF Methods: Standard EOF, Rotated EOF (REOF), Complex EOF (CEOF), and Extended EOF (EEOF)
  • Statistical Analysis: Significance testing, North's rule of thumb, and Monte Carlo methods
  • Reconstruction Tools: Time series reconstruction and pattern filtering
  • Visualization: Built-in plotting functions for EOF patterns and principal components
  • Data Handling: Support for NetCDF, CSV, and common geospatial data formats
  • Performance Optimized: Leverages NumPy, SciPy, and optional Dask for large datasets

📦 Installation

Via pip (PyPI)

pip install eoftoolkit

Via conda (conda-forge)

conda install -c conda-forge eoftoolkit

Development Installation

git clone https://github.com/yourusername/EOFtoolkit.git
cd EOFtoolkit
pip install -e .

🚀 Quick Start

import numpy as np
from eoftoolkit import EOF, load_sample_data

# Load sample climate data
data = load_sample_data('sst_anomalies')  # Sea surface temperature anomalies

# Initialize EOF analysis
eof_analysis = EOF(data)

# Compute EOFs
eof_analysis.solve()

# Get the first 3 EOF patterns and principal components
patterns = eof_analysis.patterns(neofs=3)
pcs = eof_analysis.pcs(neofs=3)
explained_variance = eof_analysis.explained_variance_ratio(neofs=3)

print(f"Explained variance: {explained_variance}")

# Plot results
eof_analysis.plot_patterns(neofs=3)
eof_analysis.plot_pcs(neofs=3)

📚 Core Functionality

EOF Analysis

from eoftoolkit import EOF

# Standard EOF analysis
eof = EOF(data, weights=None, center=True, ddof=1)
eof.solve()

# Access results
patterns = eof.patterns()           # EOF spatial patterns
pcs = eof.pcs()                    # Principal components (time series)
eigenvalues = eof.eigenvalues()    # Eigenvalues
explained_var = eof.explained_variance_ratio()

Rotated EOF (REOF)

from eoftoolkit import REOF

# Rotated EOF analysis
reof = REOF(data, neofs=10)
reof.solve(method='varimax')

# Get rotated patterns
rotated_patterns = reof.patterns()
rotated_pcs = reof.pcs()

Complex EOF (CEOF)

from eoftoolkit import CEOF

# Complex EOF for oscillatory patterns
ceof = CEOF(data, tau=1)  # tau is the lag
ceof.solve()

# Access complex patterns
amplitude = ceof.amplitude()
phase = ceof.phase()

Statistical Significance

# North's rule of thumb for EOF significance
significant_modes = eof.north_significance_test()

# Monte Carlo significance testing
p_values = eof.monte_carlo_test(n_trials=1000)

🌍 Use Cases

Climate Science

  • ENSO Analysis: Identify El Niño and La Niña patterns in sea surface temperatures
  • NAO/AO Studies: Extract North Atlantic or Arctic Oscillation patterns
  • Precipitation Patterns: Analyze dominant modes of precipitation variability

Meteorology

  • Storm Track Analysis: Identify preferred storm paths and intensity patterns
  • Temperature Trends: Decompose temperature fields into leading modes of variability
  • Pressure Systems: Analyze atmospheric pressure patterns and teleconnections

Oceanography

  • Current Systems: Study dominant patterns in ocean circulation
  • Heat Content: Analyze ocean heat content variability
  • Upwelling Patterns: Identify coastal upwelling modes

🔧 Dependencies

Required

  • Python >= 3.12
  • NumPy >= 1.24.0
  • SciPy >= 1.10.0
  • pandas >= 1.5.0

Optional

  • matplotlib >= 3.6.0 (for plotting)
  • cartopy >= 0.21.0 (for geospatial plotting)
  • xarray >= 2023.1.0 (for NetCDF support)
  • dask >= 2023.1.0 (for large dataset handling)
  • netCDF4 >= 1.6.0 (for NetCDF I/O)

🧪 Examples

Example 1: Sea Surface Temperature Analysis

import xarray as xr
from eoftoolkit import EOF

# Load SST data
sst = xr.open_dataset('sst_data.nc')['sst']

# Prepare data (remove seasonal cycle, etc.)
sst_anomalies = sst.groupby('time.month') - sst.groupby('time.month').mean()

# EOF analysis
eof = EOF(sst_anomalies.values)
eof.solve()

# Plot the first EOF pattern
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.contourf(eof.patterns()[0])
plt.title('First EOF Pattern - SST Anomalies')
plt.colorbar(label='EOF Loading')
plt.show()

Example 2: Significance Testing

# Determine significant EOFs using North's rule
n_significant = eof.north_significance_test()
print(f"Number of significant EOFs: {n_significant}")

# Detailed significance testing
eigenvalues = eof.eigenvalues()
errors = eof.north_errors()

for i in range(min(10, len(eigenvalues))):
    if eigenvalues[i] > errors[i]:
        print(f"EOF {i+1}: Significant (λ={eigenvalues[i]:.3f}, error={errors[i]:.3f})")
    else:
        print(f"EOF {i+1}: Not significant")

Development Setup

git clone https://github.com/yourusername/EOFtoolkit.git
cd EOFtoolkit
pip install -e ".[dev]"

Running Tests

pytest tests/

📞 Support

📋 Changelog

Version 0.0.1 (2025-01-17)

  • Initial release
  • Basic EOF functionality
  • Standard, Rotated, and Complex EOF methods
  • Significance testing capabilities
  • Basic visualization tools

🙏 Acknowledgments

  • Inspired by the eofs package by Andrew Dawson
  • EOF methodology based on Preisendorfer (1988) and North et al. (1982)
  • Thanks to the scientific Python community for excellent foundational packages

📝 License

This project is licensed under the MIT License - see the LICENSE file for details.


Made for my Geoinformatics Project at Politecnico di Milano

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

eoftoolkit-0.1.0.tar.gz (33.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

eoftoolkit-0.1.0-py3-none-any.whl (52.2 kB view details)

Uploaded Python 3

File details

Details for the file eoftoolkit-0.1.0.tar.gz.

File metadata

  • Download URL: eoftoolkit-0.1.0.tar.gz
  • Upload date:
  • Size: 33.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.11.11 Linux/6.8.0-59-generic

File hashes

Hashes for eoftoolkit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7e374294e8b9a30a770522bbae635a4251748cbe1274acc62d4bc0c0f7a9e958
MD5 d011cd98c07dd30e35058b59ceb2291b
BLAKE2b-256 24d4079a8040c3ed2b5e6c65fcb549f95d1301143978d9be5a0277e38de70c8a

See more details on using hashes here.

File details

Details for the file eoftoolkit-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: eoftoolkit-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 52.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.11.11 Linux/6.8.0-59-generic

File hashes

Hashes for eoftoolkit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5ecc38e8800cc46fd8b737a95d61ee81b9b4f68dcac91fe3cda151bece5d5854
MD5 8a90a508055f6095e3e12332e15b04c5
BLAKE2b-256 d63e057d24e7db9c2e49cf9eceab7aa5a5bc1adf429f80da1e587f77289f6fd9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page