{"id":13686422,"url":"https://github.com/nansencenter/DAPPER","last_synced_at":"2025-05-01T09:31:37.037Z","repository":{"id":10431995,"uuid":"62547494","full_name":"nansencenter/DAPPER","owner":"nansencenter","description":"Data Assimilation with Python: a Package for Experimental Research","archived":false,"fork":false,"pushed_at":"2024-10-29T08:17:11.000Z","size":6769,"stargazers_count":346,"open_issues_count":25,"forks_count":122,"subscribers_count":27,"default_branch":"master","last_synced_at":"2024-10-29T09:32:02.305Z","etag":null,"topics":["bayesian-filter","bayesian-methods","chaos","data-assimilation","enkf","kalman","kalman-filtering","particle-filter","state-estimation"],"latest_commit_sha":null,"homepage":"https://nansencenter.github.io/DAPPER","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nansencenter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-07-04T09:01:55.000Z","updated_at":"2024-10-25T09:16:12.000Z","dependencies_parsed_at":"2023-09-23T05:06:23.973Z","dependency_job_id":"a7fc31a3-281e-4371-8f23-34a5a45db699","html_url":"https://github.com/nansencenter/DAPPER","commit_stats":{"total_commits":1538,"total_committers":9,"mean_commits":"170.88888888888889","dds":0.06762028608582571,"last_synced_commit":"75ac46dcfd471ab16750eb10309b5e375dd30ef4"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nansencenter%2FDAPPER","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nansencenter%2FDAPPER/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nansencenter%2FDAPPER/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nansencenter%2FDAPPER/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nansencenter","download_url":"https://codeload.github.com/nansencenter/DAPPER/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224250216,"owners_count":17280522,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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"}},"keywords":["bayesian-filter","bayesian-methods","chaos","data-assimilation","enkf","kalman","kalman-filtering","particle-filter","state-estimation"],"created_at":"2024-08-02T15:00:32.137Z","updated_at":"2024-11-12T09:30:49.185Z","avatar_url":"https://github.com/nansencenter.png","language":"Python","readme":"\n\u003c!--\n!      ___   _   ___ ___ ___ ___\n!     |   \\ /_\\ | _ \\ _ \\ __| _ \\\n!     | |) / _ \\|  _/  _/ _||   /\n!     |___/_/ \\_\\_| |_| |___|_|_\\\n!\n!\n--\u003e\n\n\u003cimg src=\"https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/logo_wtxt.png\" align=\"left\" width=\"250\"/\u003e\n\nDAPPER is a set of templates for **benchmarking** the performance of **data assimilation** (DA) methods.\nThe numerical experiments provide support and guidance for new developments in DA.\nThe typical set-up is a **synthetic (twin) experiment**, where you\nspecify a dynamic model and an observational model,\nand use these to generate a synthetic truth (multivariate time series),\nand then estimate that truth given the models and noisy observations.\n\n\u003c!-- Badges / shields --\u003e\n[![Github CI](https://img.shields.io/github/actions/workflow/status/nansencenter/DAPPER/tests.yml?branch=master\u0026logo=github\u0026style=for-the-badge)](https://github.com/nansencenter/DAPPER/actions)\n[![Coveralls](https://img.shields.io/coveralls/github/nansencenter/DAPPER?style=for-the-badge\u0026logo=coveralls)](https://coveralls.io/github/nansencenter/DAPPER?branch=master)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?style=for-the-badge\u0026logo=pre-commit\u0026logoColor=white)](https://github.com/pre-commit/pre-commit)\n[![PyPI - Version](https://img.shields.io/pypi/v/dapper.svg?style=for-the-badge\u0026logo=pypi\u0026logoColor=white)](https://pypi.python.org/pypi/dapper/)\n[![PyPI - Downloads](https://img.shields.io/pypi/dw/dapper?style=for-the-badge\u0026logo=pypi\u0026logoColor=white)](https://pypi.org/project/dapper)\n\n## Getting started\n\n- Read \u0026 run [examples](examples)/`basic_1.py` and `basic_2.py`,\n  or their corresponding notebooks [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/nansencenter/DAPPER)\n  (requires Google login).\n- This [screencast](https://www.youtube.com/watch?v=YtalK0Zkzvg\u0026t=6475s)\n  provides an overview to DAPPER.\n- [Install](#installation).\n- The [documentation](https://nansencenter.github.io/DAPPER)\n  includes general guidelines and the API reference,\n  but most users must expect to read the code as well.\n- If used towards a publication, please cite as\n  *The experiments used (inspiration from) DAPPER [ref], version 1.6.0*,\n  or similar, where [ref] points to [![DOI](https://joss.theoj.org/papers/10.21105/joss.05150/status.svg)](https://doi.org/10.21105/joss.05150).\n- Also see the interactive [tutorials on DA theory](https://github.com/nansencenter/DA-tutorials) with Python.\n\n## Highlights\n\nDAPPER enables the numerical investigation of [DA methods](#da-methods)\nthrough a variety of typical [test cases](#test-cases-models) and statistics. It\n(a) reproduces numerical benchmarks results reported in the literature, and\n(b) facilitates comparative studies, thus promoting the\n(a) reliability and\n(b) relevance of the results.\nFor example, the figure below is generated by `docs/examples/basic_3.py`,\nreproduces figure 5.7 of [these lecture notes](http://cerea.enpc.fr/HomePages/bocquet/teaching/assim-mb-en.pdf).\nDAPPER is\n(c) open source, written in Python, and\n(d) focuses on readability;\nthis promotes the\n(c) reproduction and\n(d) dissemination of the underlying science,\nand makes it easy to adapt and extend.\n\n![Comparative benchmarks with Lorenz-96 plotted as a function of the ensemble size (N)](https://github.com/nansencenter/DAPPER/raw/master/docs/images/ex3.svg)\n\nDAPPER demonstrates how to parallelise ensemble forecasts (e.g., the QG model),\nlocal analyses (e.g., the LETKF), and independent experiments (e.g., `docs/examples/basic_3.py`).\nIt includes a battery of diagnostics and statistics,\nwhich all get averaged over subdomains (e.g., \"ocean\" and \"land\") and then in time.\nConfidence intervals are computed, including correction for auto-correlations,\nand used for uncertainty quantification, and significant digits printing.\nSeveral diagnostics are included in the on-line \"liveplotting\" illustrated below,\nwhich may be paused for further interactive inspection.\nIn summary, DAPPER is well suited for teaching and fundamental DA research.\nAlso see its [drawbacks](#similar-projects).\n\n![EnKF - Lorenz-96](https://github.com/nansencenter/DAPPER/raw/master/docs/images/ex1.jpg)\n\n\u003c!-- Non-highlighted features:\n- Time sequences use via `tools.chronos.Chronology` and `tools.chronos.Ticker`.\n- Random variables via `tools.randvars.RV`: Gaussian, Student-t, Laplace, Uniform,\n  ..., as well as support for custom sampling functions.\n- Covariance matrices via `tools.matrices.CovMat`:\n  provides input flexibility/overloading,\n  lazy eval that facilitates the use of non-diagonal\n  covariance matrices (whether sparse or full).\n- built-in tools for experiment and result management,\n--\u003e\n\n## Installation\n\nSuccessfully tested on Linux/Mac/Windows.\n\n### Prerequisite: Python\u003e=3.9\n\nIf you're an expert, setup a python environment however you like.\nOtherwise:\nInstall [Anaconda](https://www.anaconda.com/download), then\nopen the [Anaconda terminal](https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html#starting-conda)\nand run the following commands:\n\n```sh\nconda create --yes --name dapper-env python=3.12\nconda activate dapper-env\npython --version\n```\n\nEnsure the printed version is as desired.\n*Keep using the same terminal for the commands below.*\n\n### Install\n\n#### *Either*: Install for development (recommended)\n\n*Do you want the DAPPER code available to play around with?* Then\n\n- Download and unzip (or `git clone`) DAPPER.\n- Move the resulting folder wherever you like,  \n  and `cd` into it *(ensure you're in the folder with a `setup.py` file)*.\n- `pip install -e '.'`  \n\n#### *Or*: Install as library\n\n*Do you just want to run a script that requires DAPPER?* Then\n\n- If the script comes with a `requirements.txt` file that lists DAPPER, then do  \n  `pip install -r path/to/requirements.txt`.\n- If not, hopefully you know the version of DAPPER needed. Run  \n  `pip install dapper==1.6.0` to get version `1.6.0` (as an example).\n\n#### *Finally*: Test the installation\n\nYou should now be able to do run your script with\n`python path/to/script.py`.  \nFor example, if you are in the DAPPER dir,\n\n    python docs/examples/basic_1.py\n\n**PS**: If you closed the terminal (or shut down your computer),\nyou'll first need to run `conda activate dapper-env`\n\n\n## DA methods\n\n\u003c!-- markdownlint-capture --\u003e\n\u003c!-- markdownlint-disable line-length --\u003e\nMethod                                                 | Literature reproduced\n------------------------------------------------------ | ------------------------\nEnKF \u003csup\u003e1\u003c/sup\u003e                                      | [Sakov08](https://nansencenter.github.io/DAPPER/references/#sakov2008b), [Hoteit15](https://nansencenter.github.io/DAPPER/references/#hoteit2015a), [Grudzien2020](https://nansencenter.github.io/DAPPER/references/#grudzien2020a)\nEnKF-N                                                 | [Bocquet12](https://nansencenter.github.io/DAPPER/references/#bocquet2012a), [Bocquet15](https://nansencenter.github.io/DAPPER/references/#bocquet2015)\nEnKS, EnRTS                                            | [Raanes2016](https://nansencenter.github.io/DAPPER/references/#raanes2016thesis)\niEnKS / iEnKF / EnRML / ES-MDA \u003csup\u003e2\u003c/sup\u003e            | [Sakov12](https://nansencenter.github.io/DAPPER/references/#sakov2012a), [Bocquet12](https://nansencenter.github.io/DAPPER/references/#Bocquet12), [Bocquet14](https://nansencenter.github.io/DAPPER/references/#bocquet2014)\nLETKF, local \u0026 serial EAKF                             | [Bocquet11](https://nansencenter.github.io/DAPPER/references/#bocquet2011)\nSqrt. model noise methods                              | [Raanes2014](https://nansencenter.github.io/DAPPER/references/#raanes2014)\nParticle filter (bootstrap) \u003csup\u003e3\u003c/sup\u003e               | [Bocquet10](https://nansencenter.github.io/DAPPER/references/#bocquet2010a)\nOptimal/implicit Particle filter  \u003csup\u003e3\u003c/sup\u003e         | [Bocquet10](https://nansencenter.github.io/DAPPER/references/#bocquet2010a)\nNETF                                                   | [Tödter15](https://nansencenter.github.io/DAPPER/references/#todter2015a), [Wiljes16](https://nansencenter.github.io/DAPPER/references/#wiljes2016)\nRank histogram filter (RHF)                            | [Anderson10](https://nansencenter.github.io/DAPPER/references/#anderson2010)\n4D-Var                                                 |\n3D-Var                                                 |\nExtended KF                                            |\nOptimal interpolation                                  |\nClimatology                                            |\n\u003c!-- markdownlint-restore --\u003e\n\n\u003csup\u003e1\u003c/sup\u003e: Stochastic, DEnKF (i.e. half-update), ETKF (i.e. sym. sqrt.).\nSerial forms are also available.  \nTuned with inflation and \"random, orthogonal rotations\".  \n\u003csup\u003e2\u003c/sup\u003e: Also supports the bundle version,\nand \"EnKF-N\"-type inflation.  \n\u003csup\u003e3\u003c/sup\u003e: Resampling: multinomial\n(including systematic/universal and residual).  \nThe particle filter is tuned with \"effective-N monitoring\",\n\"regularization/jittering\" strength, and more.\n\nFor a list of ready-made experiments with suitable,\ntuned settings for a given method (e.g., the `iEnKS`), use:\n\n```sh\ngrep -r \"xp.*iEnKS\" dapper/mods\n```\n\n\n## Test cases (models)\n\nSimple models facilitate the reliability, reproducibility,\nand interpretability of experiment results.\n\nModel                | Lin | TLM** | PDE?  | Phys.dim. | State len | Lyap≥0 | Implementer\n-----------          | --- | ----- | ----  | --------- | --------- | ------ | ----------\nId                   | Yes | Yes   | No    | N/A       | *         | 0      | Raanes\nLinear Advect. (LA)  | Yes | Yes   | Yes   | 1d        | 1000 *    | 51     | Evensen/Raanes\nDoublePendulum       | No  | Yes   | No    | 0d        | 4         | 2      | Matplotlib/Raanes\nIkeda                | No  | Yes   | No    | 0d        | 2         | 1      | Raanes\nLotkaVolterra        | No  | Yes   | No    | 0d        | 5 *       | 1      | Wikipedia/Raanes\nLorenz63             | No  | Yes   | \"Yes\" | 0d        | 3         | 2      | Sakov\nLorenz84             | No  | Yes   | No    | 0d        | 3         | 2      | Raanes\nLorenz96             | No  | Yes   | No    | 1d        | 40 *      | 13     | Raanes\nLorenz96s            | No  | Yes   | No    | 1d        | 10 *      |  4     | Grudzien\nLorenzUV             | No  | Yes   | No    | 2x 1d     | 256 + 8 * | ≈60    | Raanes\nLorenzIII            | No  | No    | No    | 1d        | 960 *     | ≈164   | Raanes\nVissio-Lucarini 20   | No  | Yes   | No    | 1d        | 36 *      | 10     | Yumeng\nKuramoto-Sivashinsky | No  | Yes   | Yes   | 1d        | 128 *     | 11     | Kassam/Raanes\nQuasi-Geost (QG)     | No  | No    | Yes   | 2d        | 129²≈17k  | ≈140   | Sakov\n\n- `*`: Flexible; set as necessary\n- `**`: Tangent Linear Model included?\n\nThe models are found as subdirectories within `dapper/mods`.\nA model should be defined in a file named `__init__.py`,\nand illustrated by a file named `demo.py`.\nMost other files within a model subdirectory\nare usually named `authorYEAR.py` and define a `HMM` object,\nwhich holds the settings of a specific twin experiment,\nusing that model,\nas detailed in the corresponding author/year's paper.\nA list of these files can be obtained using\n\n```sh\nfind dapper/mods -iname '[a-z]*[0-9]*.py'\n```\n\nSome files contain settings used by several papers.\nMoreover, at the bottom of each such file should be (in comments)\na list of suitable, tuned settings for various DA methods,\nalong with their expected, average `rmse.a` score for that experiment.\nAs mentioned [above](#da-methods), DAPPER reproduces literature results.\nYou will also find results that were not reproduced by DAPPER.\n\n\n## Similar projects\n\nDAPPER is aimed at research and teaching (see discussion up top).\nExample of limitations:\n\n- It is not suited for very big models (\u003e60k unknowns).\n- Non-uniform time sequences.\n\nThe scope of DAPPER is restricted because\n\n![framework_to_language](https://latex.codecogs.com/gif.latex?%5Clim_%7B%5Ctext%7Bflexibility%7D%20%5Crightarrow%20%5Cinfty%7D%20%5Ctext%7Bframework%7D%20%3D%20%5Ctext%7Bprog.%20language%7D)\n\nMoreover, even straying beyond basic configurability appears [unrewarding](https://en.wikipedia.org/wiki/Flexibility%E2%80%93usability_tradeoff)\nwhen already building on a high-level language such as Python.\nIndeed, you may freely fork and modify the code of DAPPER,\nwhich should be seen as a set of templates, and not a framework.\n\nAlso, DAPPER comes with no guarantees/support.\nTherefore, if you have an *operational* or real-world application,\nsuch as WRF, you should look into one of the alternatives,\nsorted by approximate project size.\n\nName               | Developers            | Purpose (approximately)\n------------------ | --------------------- | -----------------------------\n[DART][1]          | NCAR                  | General\n[PDAF][7]          | AWI                   | General\n[JEDI][21]         | JCSDA (NOAA, NASA, ++)| General\n[OpenDA][3]        | TU Delft              | General\n[EMPIRE][4]        | Reading (Met)         | General\n[ERT][2]           | Statoil               | History matching (Petroleum DA)\n[PIPT][14]         | CIPR                  | History matching (Petroleum DA)\n[MIKE][9]          | DHI                   | Oceanographic\n[OAK][10]          | Liège                 | Oceanographic\n[Siroco][11]       | OMP                   | Oceanographic\n[Verdandi][6]      | INRIA                 | Biophysical DA\n[PyOSSE][8]        | Edinburgh, Reading    | Earth-observation DA\n\nBelow is a list of projects with a purpose more similar to DAPPER's\n(research *in* DA, and not so much *using* DA):\n\nName                                 | Developers                | Notes\n------------------------------------ | ----------------------    | ---------------------------------\n[DAPPER][22]                         | Raanes, Chen, Grudzien    | Python\n[SANGOMA][5]                         | Conglomerate*             | Fortran, Matlab\n[hIPPYlib][25]                       | Villa, Petra, Ghattas     | Python, adjoint-based PDE methods\n[FilterPy][12]                       | R. Labbe                  | Python. Engineering oriented.\n[DASoftware][13]                     | Yue Li, Stanford          | Matlab. Large inverse probs.\n[Pomp][18]                           | U of Michigan             | R\n[EnKF-Matlab][15]                    | Sakov                     | Matlab\n[EnKF-C][17]                         | Sakov                     | C. Light-weight, off-line DA\n[pyda][16]                           | Hickman                   | Python\n[PyDA][19]                           | Shady-Ahmed               | Python\n[DasPy][20]                          | Xujun Han                 | Python\n[DataAssim.jl][23]                   | Alexander-Barth           | Julia\n[DataAssimilationBenchmarks.jl][24]  | Grudzien                  | Julia, Python\n[EnsembleKalmanProcesses.jl][26]     | Clim. Modl. Alliance      | Julia, EKI (optim)\nDatum                                | Raanes                    | Matlab\nIEnKS code                           | Bocquet                   | Python\n\nThe `EnKF-Matlab` and `IEnKS` codes have been inspirational\nin the development of DAPPER.\n\n`*`: AWI/Liege/CNRS/NERSC/Reading/Delft\n\n[1]:  https://www.image.ucar.edu/DAReS/DART/\n[2]:  https://github.com/equinor/ert\n[3]:  https://www.openda.org/\n[4]:  https://www.met.reading.ac.uk/~darc/empire/index.php\n[5]:  https://www.data-assimilation.net/\n[6]:  http://verdandi.sourceforge.net/\n[7]:  https://pdaf.awi.de/trac/wiki\n[8]:  https://www.geos.ed.ac.uk/~lfeng/\n[9]:  http://www.dhigroup.com/\n[10]: https://github.com/gher-ulg/OAK\n[11]: https://www5.obs-mip.fr/sirocco/assimilation-tools/sequoia-data-assimilation-platform/\n[12]: https://github.com/rlabbe/filterpy\n[13]: https://github.com/judithyueli/DASoftware\n[14]: http://uni.no/en/uni-cipr/\n[15]: http://enkf.nersc.no/\n[16]: http://hickmank.github.io/pyda/\n[17]: https://github.com/sakov/enkf-c\n[18]: https://github.com/kingaa/pomp\n[19]: https://github.com/Shady-Ahmed/PyDA\n[20]: https://github.com/daspy/daspy\n[21]: https://jointcenterforsatellitedataassimilation-jedi-docs.readthedocs-hosted.com/en/latest/\n[22]: https://github.com/nansencenter/DAPPER\n[23]: https://juliahub.com/docs/DataAssim/qCDwD/0.3.2/\n[24]: https://github.com/cgrudz/DataAssimilationBenchmarks.jl\n[25]: https://hippylib.github.io/\n[26]: https://github.com/CliMA/EnsembleKalmanProcesses.jl\n\n\n## Contributing\n\n### Issues and Pull requests\n\nDo not hesitate to open an issue, whether to report a problem or ask a question.\nIt may take some time for us to get back to you,\nsince DAPPER is primarily a volunteer effort.\nPlease start by perusing the [documentation](https://nansencenter.github.io/DAPPER/dapper.html)\nand searching the issue tracker for similar items.\n\nPull requests are very welcome.\nExamples: adding a new DA method, dynamical models,\nexperimental configuration reproducing literature results,\nor improving the features and capabilities of DAPPER.\nPlease keep in mind the intentional [limitations](https://github.com/nansencenter/DAPPER#similar-projects)\nand read the [developers guidelines](https://nansencenter.github.io/DAPPER/dev_guide).\n\n### Contributors\n\nPatrick N. Raanes,\nYumeng Chen,\nColin Grudzien,\nMaxime Tondeur,\nRemy Dubois\n\nDAPPER is developed and maintained at\nNORCE (Norwegian Research Institute)\nand the Nansen Environmental and Remote Sensing Center (NERSC),\nin collaboration with the University of Reading,\nthe UK National Centre for Earth Observation (NCEO),\nand the Center for Western Weather and Water Extremes (CW3E).\n\n\u003c!-- markdownlint-capture --\u003e\n\u003c!-- markdownlint-disable line-length --\u003e\n![NORCE](https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/norce-logo.png)\n![NERSC](https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/nansen-logo.png)\n\u003cimg src=\"https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/UoR-logo.png?raw=true\" height=\"120\" /\u003e\n\u003cimg src=\"https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/nceologo1000.png?raw=true\" height=\"100\"\u003e\n\u003cimg src=\"https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/CW3E-Logo-Horizontal-FullColor.png?raw=true\" width=\"400\"\u003e\n\u003c!-- markdownlint-restore --\u003e\n\n## Publications\n\n- [Combining data assimilation and machine learning to emulate a dynamical model from sparse and noisy observations: A case study with the Lorenz 96 model](https://doi.org/10.1016/j.jocs.2020.101171)\n- [Adaptive covariance inflation in the ensemble Kalman filter by Gaussian scale mixtures](https://doi.org/10.1002/qj.3386)\n- [Revising the stochastic iterative ensemble smoother](https://doi.org/10.5194/npg-26-325-2019)\n- [p-Kernel Stein Variational Gradient Descent for Data Assimilation and History Matching](https://doi.org/10.1007/s11004-021-09937-x)\n- [Springer book chapter: Data Assimilation for Chaotic Dynamics](https://doi.org/10.1007/978-3-030-77722-7_1)\n\n\n\u003c!-- markdownlint-configure-file\n{\n  \"no-multiple-blanks\": false,\n  \"first-line-h1\": false,\n  \"no-inline-html\": {\n    \"allowed_elements\": [ \"img\", \"sup\" ]\n  },\n  \"code-block-style\": false,\n  \"ul-indent\": { \"indent\": 2 }\n}\n--\u003e\n","funding_links":[],"categories":["Data Assimilation","Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnansencenter%2FDAPPER","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnansencenter%2FDAPPER","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnansencenter%2FDAPPER/lists"}