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
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: mohammadkord99@gmail.com
📋 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e374294e8b9a30a770522bbae635a4251748cbe1274acc62d4bc0c0f7a9e958
|
|
| MD5 |
d011cd98c07dd30e35058b59ceb2291b
|
|
| BLAKE2b-256 |
24d4079a8040c3ed2b5e6c65fcb549f95d1301143978d9be5a0277e38de70c8a
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ecc38e8800cc46fd8b737a95d61ee81b9b4f68dcac91fe3cda151bece5d5854
|
|
| MD5 |
8a90a508055f6095e3e12332e15b04c5
|
|
| BLAKE2b-256 |
d63e057d24e7db9c2e49cf9eceab7aa5a5bc1adf429f80da1e587f77289f6fd9
|