{"id":319353,"name":"EWDM","description":"Python toolkit for estimating directional wave spectra of ocean waves based on wavelet transform.","url":"https://github.com/dspelaez/extended-wdm","last_synced_at":"2026-05-24T01:00:38.121Z","repository":{"id":246003311,"uuid":"819790869","full_name":"dspelaez/extended-wdm","owner":"dspelaez","description":"Python toolkit for estimating directional wave spectra of ocean waves based on wavelet transform","archived":false,"fork":false,"pushed_at":"2025-05-03T10:12:34.000Z","size":5260,"stargazers_count":16,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-11T19:05:00.527Z","etag":null,"topics":["adcps","directional-spectrum","spotter","wavelets","waves","wavestaffs","wdm"],"latest_commit_sha":null,"homepage":"https://extended-wdm.readthedocs.io/","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dspelaez.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-06-25T07:55:42.000Z","updated_at":"2026-02-23T09:37:39.000Z","dependencies_parsed_at":"2024-06-27T22:40:32.720Z","dependency_job_id":"fec0a4c1-a71b-44da-913c-2bd60b0696dd","html_url":"https://github.com/dspelaez/extended-wdm","commit_stats":null,"previous_names":["dspelaez/extended-wdm"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/dspelaez/extended-wdm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dspelaez","download_url":"https://codeload.github.com/dspelaez/extended-wdm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32997729,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"ssl_error","status_checked_at":"2026-05-13T13:14:51.610Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"dspelaez","name":"Daniel Peláez Zapata","uuid":"6423179","kind":"user","description":"Postdoctoral researcher at ENS Paris-Saclay. I study how the atmosphere and the ocean interact, focusing on the role of ocean surface waves.","email":"","website":"dspelaez.github.io","location":"Paris","twitter":null,"company":"UCD/ENS","icon_url":"https://avatars.githubusercontent.com/u/6423179?u=97ed6f0228e402b6660906d6260fdb3946a702ce\u0026v=4","repositories_count":34,"last_synced_at":"2024-06-08T07:21:06.777Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/dspelaez","funding_links":[],"total_stars":18,"followers":26,"following":47,"created_at":"2022-11-09T08:55:33.520Z","updated_at":"2024-06-08T07:21:08.148Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dspelaez","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dspelaez/repositories"},"packages":[],"commits":{"id":10456556,"full_name":"dspelaez/extended-wdm","default_branch":"main","total_commits":122,"total_committers":6,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":20.333333333333332,"dds":0.5327868852459017,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-05-23T15:56:06.749Z","last_synced_commit":"cb859c3881b67a53c31a9c1a29e390c4c1948f98","created_at":"2025-06-25T00:17:31.261Z","updated_at":"2026-05-23T15:56:03.519Z","committers":[{"name":"Daniel Pelaez-Zapata","email":"daniel.pelaez_zapata@ens-paris-saclay.fr","login":null,"count":57},{"name":"Daniel Pelaez Zapata","email":"dspelaez@gmail.com","login":"dspelaez","count":50},{"name":"Daniel Pelaez-Zapata","email":"daniel.pelaez_zapata@proton.me","login":null,"count":10},{"name":"Romain Caneill","email":"romain.caneill@ens-lyon.org","login":"rcaneill","count":3},{"name":"yangleir","email":"yangleir@qq.com","login":"yangleir","count":1},{"name":"miniufo","email":"miniufo@163.com","login":"miniufo","count":1}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-24T00:00:21.472Z","repositories_count":6239928,"commits_count":884435931,"contributors_count":34901378,"owners_count":1156680,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"dspelaez/extended-wdm","html_url":"https://github.com/dspelaez/extended-wdm","last_synced_at":"2026-05-09T18:03:47.743Z","status":"error","issues_count":7,"pull_requests_count":3,"avg_time_to_close_issue":826740.5714285715,"avg_time_to_close_pull_request":2426890.6666666665,"issues_closed_count":7,"pull_requests_closed_count":3,"pull_request_authors_count":3,"issue_authors_count":2,"avg_comments_per_issue":1.4285714285714286,"avg_comments_per_pull_request":1.0,"merged_pull_requests_count":3,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":7,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":826740.5714285715,"past_year_avg_time_to_close_pull_request":2426890.6666666665,"past_year_issues_closed_count":7,"past_year_pull_requests_closed_count":3,"past_year_pull_request_authors_count":3,"past_year_issue_authors_count":2,"past_year_avg_comments_per_issue":1.4285714285714286,"past_year_avg_comments_per_pull_request":1.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":3,"created_at":"2025-06-25T00:17:33.098Z","updated_at":"2026-05-09T18:03:47.743Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspelaez%2Fextended-wdm/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":6,"CONTRIBUTOR":1},"pull_request_author_associations_count":{"NONE":3,"CONTRIBUTOR":3},"issue_authors":{"rcaneill":5,"miniufo":2},"pull_request_authors":{"rcaneill":2,"miniufo":2,"yangleir":2},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-24T00:00:44.577Z","repositories_count":14679442,"issues_count":34072130,"pull_requests_count":111527619,"authors_count":11272023,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{},"past_year_pull_request_authors":{},"maintainers":[],"active_maintainers":[]},"events":{"total":{"ReleaseEvent":1,"PullRequestEvent":5,"ForkEvent":4,"IssuesEvent":10,"WatchEvent":10,"IssueCommentEvent":7,"PushEvent":51,"CreateEvent":1},"last_year":{"ForkEvent":1,"WatchEvent":3}},"keywords":["adcps","directional-spectrum","spotter","wavelets","waves","wavestaffs","wdm"],"dependencies":[{"ecosystem":"pypi","filepath":"docs/requirements.txt","sha":null,"kind":"manifest","created_at":"2024-06-27T22:40:32.124Z","updated_at":"2024-06-27T22:40:32.124Z","repository_link":"https://github.com/dspelaez/extended-wdm/blob/main/docs/requirements.txt","dependencies":[{"id":18862326523,"package_name":"sphinx","ecosystem":"pypi","requirements":"==7.3.7","direct":true,"kind":"runtime","optional":false},{"id":18862326524,"package_name":"sphinx-rtd-theme","ecosystem":"pypi","requirements":"==2.0.0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2024-06-27T22:40:32.428Z","updated_at":"2024-06-27T22:40:32.428Z","repository_link":"https://github.com/dspelaez/extended-wdm/blob/main/setup.py","dependencies":[{"id":18862326548,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":18862326549,"package_name":"scipy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":18862326550,"package_name":"xarray","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":18862326551,"package_name":"matplotlib","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":18862326552,"package_name":"tqdm","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]}],"score":4.564348191467836,"created_at":"2025-06-25T00:17:29.331Z","updated_at":"2026-05-24T01:00:38.123Z","avatar_url":"https://github.com/dspelaez.png","language":"Jupyter Notebook","category":"Hydrosphere","sub_category":"Waves and Currents","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"[![Documentation Status](https://readthedocs.org/projects/extended-wdm/badge/?version=latest)](https://extended-wdm.readthedocs.io/en/latest/?badge=latest)\n[![Python package](https://github.com/dspelaez/extended-wdm/actions/workflows/python-package.yml/badge.svg)](https://github.com/dspelaez/extended-wdm/actions/workflows/python-package.yml)\n[![PyPI version](https://badge.fury.io/py/ewdm.svg)](https://badge.fury.io/py/ewdm)\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/dspelaez/extended-wdm/HEAD?labpath=notebooks)\n[![DOI](https://zenodo.org/badge/819790869.svg)](https://zenodo.org/doi/10.5281/zenodo.12805994)\n[![status](https://joss.theoj.org/papers/3b59fa36efc62a871bfd48acb056670d/status.svg)](https://joss.theoj.org/papers/3b59fa36efc62a871bfd48acb056670d)\n\n\u003cimg src=\"https://raw.githubusercontent.com/dspelaez/extended-wdm/main/docs/_static/logo.png\" width=\"400\"\u003e\n\n# EWDM: Extended Wavelet Directional Method\n\nWelcome to the GitHub repository for the **Extended Wavelet Directional Method (EWDM)** - a toolkit for estimating directional spectra of ocean waves using the Continuous Wavelet Transform (CWT).\n\nThis package implements the algorithms of the original WDM proposed by [Donelan et al. (1985)](10.1175/1520-0485(1996)026\u003c1901:naotdp\u003e2.0.co;2) that are suitable for spatially-distributed arrays of wave staffs; as well as the algorithms presented by [Peláez-Zapata et al. (2024)](https://doi.org/10.1175/JTECH-D-23-0058.1) for single-point triplets of wave-induced displacements, velocities, accelerations or slopes (see also [Krogstad et al., 2006](https://onepetro.org/IJOPE/article-abstract/28936/Wavelet-And-Local-Directional-Analysis-of-Ocean?redirectedFrom=fulltext)).\n\nTherefore, **EWDM** allows the estimation of the directional wave spectrum for a variety of sources, including GPS-based buoys, pitch-roll-heave buoys, acoustic Doppler current profilers (ADCPs) and sampled points from stereo-imaging recordings.\n\n\n**Key features** of the **EWDM** include:\n\n* Implementation of the wavelet-based algorithms for extracting directional\n  information from wave time series.\n* Tools for processing and visualising directional wave data.\n* Powered by `xarray` labelled multi-dimensional arrays.\n* Helper functions to handle commonly used data sources such as\n  [Spotter buoys](https://www.sofarocean.com/products/spotter) and\n  [CDIP](https://cdip.ucsd.edu/).\n* Documentation, examples, and comparison with conventional methods.\n\n\nWhether you are a researcher, student, or engineer in physical oceanography, **EWDM** provides a powerful, user-friendly toolkit for in-depth analysis of directional ocean wave spectra. We welcome contributions, feedback, and collaboration from the community to further enhance the capabilities of **EWDM**.\n\n\n# Getting Started\n\n## Installation\n\n### Stable release\n\nYou can install EWDM using `pip`. First, make sure you have Python 3.8 or higher installed.\n\n```bash\npip install ewdm\n```\n\nThis is the preferred method to install EWDM, as it will always install the most recent stable release.\n\nIf you don't have `pip` installed, these [Python installation instructions](http://docs.python-guide.org/en/latest/starting/installation/) can guide\nyou through the process.\n\n\n### From sources\n\nThe sources for EWDM can be downloaded from the [Github repo](https://github.com/dspelaez/extended-wdm).\n\nYou can either clone the public repository:\n\n```bash\ngit clone git://github.com/dspelaez/extended-wdm\n```\n\nOr download the [tarball](https://github.com/dspelaez/extended-wdm/tarball/master):\n\n```bash\ncurl -OJL https://github.com/dspelaez/extended-wdm/tarball/master\n```\n\nOnce you have a copy of the source, you can install it with:\n\n```bash\npython setup.py install\n```\n\nOr using `pip`:\n\n```bash\npip install .\n```\n\n\n## Running tests\n\nTo install the necessary packages for development and testing, you can run the following command:\n\n```bash\npip install -e '.[test]'\n```\n\nTo run the tests, you can use the `pytest` framework by executing the following command:\n```bash\npytest tests\n```\n\n\n## Usage\n\nAfter installation, you can import and use the `ewdm` package in your Python code:\n\n```python\nimport ewdm\n```\n\n## Quick example\n\nThis example uses a CDIP buoy time series of wave-induced displacements to estimate the directional wave spectrum.\n\n```python\nimport numpy as np\nimport xarray as xr\nfrom matplotlib import pyplot as plt\n\nimport ewdm\nfrom ewdm.sources import CDIPDataSourceRealTime\nfrom ewdm.plots import plot_directional_spectrum\nplt.ion()\n\ncdip =  CDIPDataSourceRealTime(166)\ndataset = cdip.read_dataset(time_start='2024-06-09T08:30')\nspec = ewdm.Triplets(dataset)\noutput = spec.compute()\n\nfig, ax = plt.subplots()\nplot_directional_spectrum(\n    output[\"directional_spectrum\"], ax=ax, levels=None\n)\n```\n\nThis will produce a plot like this:\n\n\u003cimg src=\"notebooks/ewdm-quick-example.png\" width=\"800\"\u003e\n\n\n## Further examples\n\nFor a curated collection of examples, please refer to the [Gallery](https://extended-wdm.readthedocs.io/en/latest/gallery.html) in the documentation.\n\n\n## Related projects\n\nSeveral tools complement the functionality of **EWDM** in the analysis of ocean\nwave data. Some of the most relevant projects are:\n\n- [`WAFO`](https://www.maths.lth.se/matstat/wafo/) provides advanced statistical\n  and engineering analysis of wave fields and wave-induced loads.\n\n- [`FOWD`](https://github.com/dionhaefner/FOWD) offers a rich dataset of wave\n  parameters tailored for machine learning applications. It also provides\n  routines to compute frequently used wave parameters.\n\n- [`DIWASP`](https://github.com/metocean/diwasp) implements classical\n  Fourier-based methods for directional spectrum estimation.\n\n- Special mention to modern Python packages like\n  [`wavespectra`](https://github.com/wavespectra/wavespectra) and\n  [`oceanwaves-python`](https://github.com/openearth/oceanwaves-python), that\n  support spectral data manipulation and visualization. While these tools do not\n  estimate directional spectra from raw measurements, they can be integrated\n  with **EWDM** to enhance wave data processing workflows.\n\n\n\n## How to cite this work\n\nIf you find this software useful, please cite it using the DOI: [`10.21105/joss.07942`](https://doi.org/10.21105/joss.07942) or copy the following `bibtex` entry:\n\n```\n@article{Pelaez-Zapata2025,\n  doi = {10.21105/joss.07942},\n  url = {https://doi.org/10.21105/joss.07942},\n  year = {2025},\n  publisher = {The Open Journal},\n  volume = {10},\n  number = {109},\n  pages = {7942},\n  author = {Daniel Peláez-Zapata and Frédéric Dias},\n  title = {EWDM: A wavelet-based method for estimating directional spectra of ocean waves},\n  journal = {Journal of Open Source Software}\n}\n```\n\n\n## How to contribute\n\nEWDM is an open-source package and we welcome feedback and contributions.\n\nYou can open an issue in the GitHub issues page if you:\n\n- find a bug in the package;\n- need some new features;\n- want some supports;\n- show your own examples.\n\nPlease refer to the [Contributing guide](https://extended-wdm.readthedocs.io/en/latest/contribute.html) in the documentation for further information.\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.1175/JTECH-D-23-0058.1","https://doi.org/10.21105/joss.07942"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/319353","html_url":"https://ost.ecosyste.ms/projects/319353"}