{"id":49311997,"url":"https://github.com/eserie/wax-ml","last_synced_at":"2026-04-26T13:05:45.636Z","repository":{"id":40431964,"uuid":"370466222","full_name":"eserie/wax-ml","owner":"eserie","description":"A Python library for machine-learning and feedback loops on streaming data","archived":false,"fork":false,"pushed_at":"2023-04-21T22:25:44.000Z","size":10816,"stargazers_count":63,"open_issues_count":0,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-27T04:41:30.510Z","etag":null,"topics":["data-streaming","jax","machine-learning","pandas","python","reinforcement-learning","time-series","xarray"],"latest_commit_sha":null,"homepage":"https://wax-ml.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eserie.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-05-24T19:40:21.000Z","updated_at":"2025-12-15T13:35:14.000Z","dependencies_parsed_at":"2023-11-09T13:05:17.948Z","dependency_job_id":"c523f530-87d0-4008-baa9-3df968c2c454","html_url":"https://github.com/eserie/wax-ml","commit_stats":{"total_commits":167,"total_committers":3,"mean_commits":"55.666666666666664","dds":0.0239520958083832,"last_synced_commit":"d4f7f55ff586030c8cc7d50d12d313833db9d405"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/eserie/wax-ml","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eserie%2Fwax-ml","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eserie%2Fwax-ml/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eserie%2Fwax-ml/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eserie%2Fwax-ml/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eserie","download_url":"https://codeload.github.com/eserie/wax-ml/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eserie%2Fwax-ml/sbom","scorecard":{"id":382456,"data":{"date":"2025-08-11","repo":{"name":"github.com/eserie/wax-ml","commit":"d4f7f55ff586030c8cc7d50d12d313833db9d405"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/docs.yml:1","Warn: no topLevel permission defined: .github/workflows/pypi.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/docs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/docs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/docs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/docs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/pypi.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/pypi.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/pypi.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/pypi.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/tests.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/eserie/wax-ml/tests.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/docs.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/docs.yml:45","Warn: pipCommand not pinned by hash: .github/workflows/docs.yml:46","Warn: pipCommand not pinned by hash: .github/workflows/pypi.yml:18","Warn: pipCommand not pinned by hash: .github/workflows/pypi.yml:21","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:40","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:51","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:52","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   8 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 11 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T15:47:15.250Z","repository_id":40431964,"created_at":"2025-08-18T15:47:15.250Z","updated_at":"2025-08-18T15:47:15.250Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32297961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"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"}},"keywords":["data-streaming","jax","machine-learning","pandas","python","reinforcement-learning","time-series","xarray"],"created_at":"2026-04-26T13:05:44.849Z","updated_at":"2026-04-26T13:05:45.626Z","avatar_url":"https://github.com/eserie.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://github.com/eserie/wax-ml/blob/main/docs/_static/wax_logo.png\" alt=\"logo\" width=\"40%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\n# WAX-ML: A Python library for machine-learning and feedback loops on streaming data\n\n![Continuous integration](https://github.com/eserie/wax-ml/actions/workflows/tests.yml/badge.svg)\n[![Documentation Status](https://readthedocs.org/projects/wax-ml/badge/?version=latest)](https://wax-ml.readthedocs.io/en/latest/)\n[![PyPI version](https://badge.fury.io/py/wax-ml.svg)](https://badge.fury.io/py/wax-ml)\n[![Codecov](https://codecov.io/gh/eserie/wax-ml/branch/main/graph/badge.svg)](https://codecov.io/gh/eserie/wax-ml)\n[![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\n\n\n[**Quickstart**](#quickstart-colab-in-the-cloud)\n| [**Install guide**](#installation)\n| [**Change logs**](https://wax-ml.readthedocs.io/en/latest/changelog.html)\n| [**Reference docs**](https://wax-ml.readthedocs.io/en/latest/)\n\n## Introduction\n\n🌊 Wax is what you put on a surfboard to avoid slipping. It is an essential tool to go\nsurfing ... 🌊\n\nWAX-ML is a research-oriented [Python](https://www.python.org/)  library\nproviding tools to design powerful machine learning algorithms and feedback loops\nworking on streaming data.\n\nIt strives to complement [JAX](https://jax.readthedocs.io/en/latest/)\nwith tools dedicated to time series.\n\nWAX-ML makes JAX-based programs easy to use for end-users working\nwith\n[pandas](https://pandas.pydata.org/) and [xarray](http://xarray.pydata.org/en/stable/)\nfor data manipulation.\n\nWAX-ML provides a simple mechanism for implementing feedback loops, allows the implementation of\n reinforcement learning algorithms with functions, and makes them easy to integrate by\nend-users working with the object-oriented reinforcement learning framework from the\n[Gym](https://gym.openai.com/) library.\n\nTo learn more, you can read our [article on ArXiv](http://arxiv.org/abs/2106.06524)\nor simply access the code in this repository.\n\n## WAX-ML Goal\n\nWAX-ML's goal is to expose \"traditional\" algorithms that are often difficult to find in standard\nPython ecosystem and are related to time-series and more generally to streaming data.\n\nIt aims to make it easy to work with algorithms from very various computational domains such as\nmachine learning, online learning, reinforcement learning, optimal control, time-series analysis,\noptimization, statistical modeling.\n\nFor now, WAX-ML focuses on **time-series** algorithms as this is one of the areas of machine learning\nthat lacks the most dedicated tools.  Working with time series is notoriously known to be difficult\nand often requires very specific algorithms (statistical modeling, filtering, optimal control).\n\n\nEven though some of the modern machine learning methods such as RNN, LSTM, or reinforcement learning\ncan do an excellent job on some specific time-series problems, most of the problems require using\nmore traditional algorithms such as linear and non-linear filters, FFT,\nthe eigendecomposition of matrices (e.g. [[7]](#references)),\nprincipal component analysis (PCA) (e.g. [[8]](#references)), Riccati solvers for\noptimal control and filtering, ...\n\n\nBy adopting a functional approach, inherited from JAX, WAX-ML aims to be an efficient tool to\ncombine modern machine learning approaches with more traditional ones.\n\n\nSome work has been done in this direction in [[2] in References](#references) where transformer encoder\narchitectures are massively accelerated, with limited accuracy costs, by replacing the\nself-attention sublayers with a standard, non-parameterized Fast Fourier Transform (FFT).\n\n\nWAX-ML may also be useful for developing research ideas in areas such as online machine learning\n(see [[1] in References](#references)) and development of control, reinforcement learning,\nand online optimization methods.\n\n## What does WAX-ML do?\n\nWell, building WAX-ML, we have some pretty ambitious design and implementation goals.\n\nTo do things right, we decided to start small and in an open-source design from the beginning.\n\n\nFor now, WAX-ML contains:\n- transformation tools that we call \"unroll\" transformations allowing us to\n  apply any transformation, possibly stateful, on sequential data.  It generalizes the RNN\n  architecture to any stateful transformation allowing the implementation of any kind of \"filter\".\n\n- a \"stream\" module, described in [🌊 Streaming Data 🌊](#-streaming-data-), permitting us to\n  synchronize data streams with different time resolutions.\n\n- some general pandas and xarray \"accessors\" permitting the application of any\n  JAX-functions on pandas and xarray data containers:\n  `DataFrame`, `Series`, `Dataset`, and `DataArray`.\n\n- ready-to-use exponential moving average filter that we exposed with two APIs:\n    - one for JAX users: as Haiku modules (`EWMA`, ... see the complete list in our\n    [API documentation](https://wax-ml.readthedocs.io/en/latest/wax.modules.html)\n    ).\n    - a second one for pandas and xarray users: with drop-in replacement of pandas\n      `ewm` accessor.\n\n- a simple module `OnlineSupervisedLearner` to implement online learning algorithms\n  for supervised machine learning problems.\n\n- building blocks for designing feedback loops in reinforcement learning, and have\n  provided a module called `GymFeedback` allowing the implementation of feedback loop as the\n  introduced in the library [Gym](https://gym.openai.com/), and illustrated this figure:\n\n  \u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/tikz/gymfeedback.png\" alt=\"logo\" width=\"60%\"\u003e\u003c/img\u003e\n  \u003c/div\u003e\n\n### What is JAX?\n\nJAX is a research-oriented computational system implemented in Python that leverages the\nXLA optimization framework for machine learning computations.  It makes XLA usable with\nthe NumPy API and some functional primitives for just-in-time compilation,\ndifferentiation, vectorization, and parallelization.  It allows building higher-level\ntransformations or \"programs\" in a functional programming approach.\nSee  [JAX's page](https://github.com/google/jax) for more details.\n\n\n## Why to use WAX-ML?\n\nIf you deal with time-series and are a pandas or xarray user, b\nut you want to use the impressive\ntools of the JAX ecosystem, then WAX-ML might be the right tool for you,\nas it implements pandas and\nxarray accessors to apply JAX functions.\n\nIf you are a user of JAX, you may be interested in adding WAX-ML to your toolbox to address\ntime-series problems.\n\n## Design\n\n### Research oriented\nWAX-ML is a research-oriented library.  It relies on\n[JAX](https://jax.readthedocs.io/en/latest/notebooks/quickstart.html) and\n[Haiku](https://github.com/deepmind/dm-haiku) functional programming paradigm to ease the\ndevelopment of research ideas.\n\nWAX-ML is a bit like [Flux](https://fluxml.ai/Flux.jl/stable/)\nin [Julia](https://julialang.org/) programming language.\n\n### Functional programming\nIn WAX-ML, we pursue a functional programming approach inherited from JAX.\n\nIn this sense, WAX-ML is not a framework, as most object-oriented libraries offer.  Instead, we\nimplement \"functions\" that must be pure to exploit the JAX ecosystem.\n\n### Haiku modules\nWe use the \"module\" mechanism proposed by the Haiku library to easily generate pure function pairs,\ncalled `init` and `apply` in Haiku, to implement programs that require the management of\nparameters and/or state variables.\nYou can see\n[the Haiku module API](https://dm-haiku.readthedocs.io/en/latest/api.html#modules-parameters-and-state)\nand\n[Haiku transformation functions](https://dm-haiku.readthedocs.io/en/latest/api.html#haiku-transforms)\nfor more details.\n\nIn this way, we can recover all the advantages of\nobject-oriented programming but exposed in the functional programming approach.\nIt permits to ease the development of robust and reusable features and to\ndevelop \"mini-languages\" tailored to specific scientific domains.\n\n\n### WAX-ML works with other libraries\n\nWe want existing machine learning libraries to work well together while trying to leverage their strength.\nThis is facilitated with a functional programming approach.\n\nWAX-ML is not a framework but either a set of tools that aim to complement\n[JAX Ecosystem](https://moocaholic.medium.com/jax-a13e83f49897).\n\n\n# Contents\n* [🚀 Quickstart: Colab in the Cloud 🚀](#-quicksart-colab-in-the-cloud-)\n* [⏱ Synchronize streams ⏱](#-synchronize-streams-)\n* [🌊 Streaming Data 🌊](#-streaming-data-)\n* [Implemented modules](#-implemented-modules-)\n* [♻ Feedback loops ♻](#-feedback-loops-)\n* [Future plans](#future-plans)\n* [⚒ Installation ⚒](#installation)\n* [Disclaimer](#disclaimer)\n* [Development](#development)\n* [References](#references)\n* [License](#license)\n* [Citing WAX-ML](#citing-wax)\n* [Reference documentation](#reference-documentation)\n\n\n## 🚀 Quickstart 🚀\n\nJump right in using a notebook in your browser, connected to a Google Cloud GPU or\nsimply read our notebook in the\n[documentation](https://wax-ml.readthedocs.io/en/latest/).\n\nHere are some starter notebooks:\n- 〰 Compute exponential moving averages with xarray and pandas accessors 〰 : [![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/01_demo_EWMA.ipynb),\n  [Open in Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/01_demo_EWMA.html)\n- ⏱ Synchronize data streams ⏱ : [![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/02_Synchronize_data_streams.ipynb),\n  [Open in Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/02_Synchronize_data_streams.html)\n- 🌡 Binning temperatures 🌡 : [![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/03_ohlc_temperature.ipynb),\n  [Open in Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/03_ohlc_temperature.html)\n- 🎛 The three steps workflow 🎛 : [![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/04_The_three_steps_workflow.ipynb),\n  [Open in Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/04_The_three_steps_workflow.html)\n- 🔭 Reconstructing the light curve of stars with LSTM 🔭: [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/05_reconstructing_the_light_curve_of_stars.ipynb),\n  [Open in Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/05_reconstructing_the_light_curve_of_stars.html)\n- 🦎 Online linear regression with a non-stationary environment 🦎: [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/06_Online_Linear_Regression.ipynb),\n  [Open in Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/06_Online_Linear_Regression.html)\n\n\n## ⏱ Synchronize streams ⏱\n\nPhysicists have brought a solution to the synchronization problem called the Poincaré–Einstein\nsynchronization (See [Poincaré-Einstein synchronization Wikipedia\npage](https://en.wikipedia.org/wiki/Einstein_synchronisation)).  In WAX-ML we have implemented a similar\nmechanism by defining a \"local time\", borrowing Henri Poincaré terminology, to denominate the\ntimestamps of the stream (the \"local stream\") in which the user wants to apply transformations and\nunravel all other streams.  The other streams, which we have called \"secondary streams\", are pushed\nback in the local stream using embedding maps which specify how to convert timestamps from a\nsecondary stream into timestamps in the local stream.\n\nThis synchronization mechanism permits to work with secondary streams having timestamps at\nfrequencies that can be lower or higher than the local stream. The data from these secondary streams\nare represented in the \"local stream\" either with the use of a forward filling mechanism for lower\nfrequencies or with a buffering mechanism for higher frequencies.\n\nNote that this simple synchronization scheme assumes that the different event streams have fixed\nlatencies.\n\nWe have implemented a \"data tracing\" mechanism to optimize access to out-of-sync streams.  This\nmechanism works on in-memory data.  We perform the first pass on the data, without actually\naccessing it, and determine the indices necessary to later access the data. Doing so we are vigilant\nto not let any \"future\" information pass through and thus guaranty a data processing that respects\ncausality.\n\nThe buffering mechanism used in the case of higher frequencies works with a fixed buffer size\n(see the WAX-ML module [`wax.modules.Buffer`](https://wax-ml.readthedocs.io/en/latest/_autosummary/wax.modules.buffer.html#module-wax.modules.buffer)\nto allow the use of JAX / XLA optimizations and efficient processing.\n\n### Example\n\nLet's illustrate with a small example how `wax.stream.Stream` synchronizes data streams.\n\nLet's use the dataset \"air temperature\" with :\n- An air temperature is defined with hourly resolution.\n- A \"fake\" ground temperature is defined with a daily resolution as the air temperature minus 10 degrees.\n\n\n```python\n\nfrom wax.accessors import register_wax_accessors\n\nregister_wax_accessors()\n```\n\n```python\n\nfrom wax.modules import EWMA\n\n\ndef my_custom_function(dataset):\n    return {\n        \"air_10\": EWMA(1.0 / 10.0)(dataset[\"air\"]),\n        \"air_100\": EWMA(1.0 / 100.0)(dataset[\"air\"]),\n        \"ground_100\": EWMA(1.0 / 100.0)(dataset[\"ground\"]),\n    }\n```\n\n```python\nresults, state = dataset.wax.stream(\n    local_time=\"time\", ffills={\"day\": 1}, pbar=True\n).apply(my_custom_function, format_dims=dataset.air.dims)\n```\n\n```python\n_ = results.isel(lat=0, lon=0).drop([\"lat\", \"lon\"]).to_pandas().plot(figsize=(12, 8))\n```\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/_static/synchronize_data_streams.png\" alt=\"logo\" width=\"60%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\n## 🌊 Streaming Data 🌊\n\nWAX-ML may complement JAX ecosystem by adding support for **streaming data**.\n\nTo do this, WAX-ML implements a unique **data tracing** mechanism that prepares for fast\naccess to in-memory data and allows the execution of JAX tractable functions such as\n`jit`, `grad`, `vmap`, or `pmap`.\n\nThis mechanism is somewhat special in that it works with time-series data.\n\nThe `wax.stream.Stream` object implements this idea.  It uses Python generators to\n**synchronize multiple streaming data streams** with potentially different temporal\nresolutions.\n\nThe `wax.stream.Stream` object works on in-memory data stored in\n[`xarray.Dataset`](http://xarray.pydata.org/en/stable/generated/xarray.Dataset.html).\n\nTo work with \"real\" streaming data, it should be possible to implement a buffer\nmechanism running on any Python generator and to use the synchronization and data\ntracing mechanisms implemented in WAX-ML to apply JAX transformations on batches of data\nstored in memory. (See our WEP4 enhancement proposal)\n\n### ⌛ Adding support for time dtypes in JAX ⌛\n\nAt the moment `datetime64` and `string_` dtypes are not supported in JAX.\n\nWAX-ML add support for `datetime64` and `string_` NumPy dtypes in JAX.\nTo do so, WAX-ML implements:\n- an encoding scheme for `datetime64` relying on pairs of 32-bit integers similar to `PRNGKey` in JAX.\n- an encoding scheme for `string_` relying on `LabelEncoder` of [Scikit-learn](https://scikit-learn.org/stable/).\n\nBy providing these two encoding schemes, WAX-ML makes it easy to use JAX algorithms on data of these types.\n\nCurrently, the types of time offsets supported by WAX-ML are quite limited and we\ncollaborate with the pandas, xarray, and [Astropy](https://www.astropy.org/) teams\nto further develop the time manipulation tools in WAX-ML (see \"WEP1\" in `WEP.md`).\n\n### pandas and xarray accessors\n\nWAX-ML implements pandas and xarray accessors to ease the usage of machine-learning\nalgorithms implemented with functions implemented with Haiku modules on high-level data APIs :\n- pandas's `DataFrame` and `Series`\n- xarray's `Dataset` and `DataArray`.\n\nTo load the accessors, run:\n```python\nfrom wax.accessors import register_wax_accessors\nregister_wax_accessors()\n```\n\nThen run the \"one-liner\" syntax:\n```python\n\u003cdata-container\u003e.stream(…).apply(…)\n```\n\n## Implemented modules\n\nWe have some modules (inherited from Haiku modules) ready to be used in `wax.modules`\n(see our [api documentation](https://wax-ml.readthedocs.io/en/latest/wax.modules.html)).\n\nThey can be considered as \"building blocks\" that can be reused to build more advanced programs to run on streaming data.\n\n### Fundamental modules\n\nWe have some \"fundamental\" modules that are specific to time series management,\n- the `Buffer` module which implements the buffering mechanism\n- the `UpdateOnEvent` module which allows to \"freeze\" the computation of a program and\n  to update it on some events in the \"local flow\".\n  To illustrate the use of this module we show how it can be used to compute the opening,\n  high and closing quantities of temperatures recorded during a day,\n  the binning process being reset at each day change.  We show an illustrative graph of the final result:\n\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/_static/trailing_ohlc.png\" alt=\"logo\" width=\"60%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\n### pandas modules\n\nWe have a few more specific modules that aim to reproduce some of the logic that **pandas** users may be familiar with,\nsuch as:\n- `Lag` to implement a delay on the input data\n- `Diff` to compute differences between values over time\n- `PctChange` to compute the relative difference between values over time.\n- `RollingMean` to compute the moving average over time.\n- `EWMA`, `EWMVar`, `EWMCov`, to compute the exponential moving average, variance, covariance of the input data.\n\n### Online learning and reinforcement learning modules\n\nFinally, we implement domain-specific modules for online learning and reinforcement\nlearning such as `OnlineSupervisedLearner` and `GymFeedback` (see dedicated sections).\n\n### accessors\n\nFor now, WAX-ML offers direct access to some modules through specific accessors for pandas and xarray users.\nFor instance, we have an implementation of the \"exponential moving average\" directly\naccessible through the accessor `\u003cdata-container\u003e.ewm(...).mean()` which provides a\ndrop-in replacement for the exponential moving average of pandas.\n\nFor now, WAX-ML offers direct access to some modules through specific accessors for pandas and xarray users.\n\nFor instance, you can see our implementation of the \"exponential moving average\".  This\nis a drop-in replacement for the exponential moving average of pandas.\n\nLet's show how it works on the \"air temperature\" dataset from `xarray.tutorials`:\n\n```python\nimport xarray as xr\nda = xr.tutorial.open_dataset(\"air_temperature\")\ndataframe = da.air.to_series().unstack([\"lon\", \"lat\"])\n```\n\nPandas ewma:\n```python\nair_temp_ewma = dataframe.ewm(alpha=1.0 / 10.0).mean()\n```\n\nWAX-ML ewma:\n```python\nair_temp_ewma = dataframe.wax.ewm(alpha=1.0 / 10.0).mean()\n```\n\n\n### Apply a custom function to a Dataset\n\nNow let's illustrate how WAX-ML accessors work on [xarray datasets](http://xarray.pydata.org/en/stable/generated/xarray.Dataset.html).\n\n```python\nfrom wax.modules import EWMA\n\n\ndef my_custom_function(dataset):\n    return {\n        \"air_10\": EWMA(1.0 / 10.0)(dataset[\"air\"]),\n        \"air_100\": EWMA(1.0 / 100.0)(dataset[\"air\"]),\n    }\n\n\ndataset = xr.tutorial.open_dataset(\"air_temperature\")\noutput, state = dataset.wax.stream().apply(\n    my_custom_function, format_dims=dataset.air.dims\n)\n\n_ = output.isel(lat=0, lon=0).drop([\"lat\", \"lon\"]).to_pandas().plot(figsize=(12, 8))\n```\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/_static/my_custom_function_on_dataset.png\" alt=\"logo\" width=\"60%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\nYou can see our [Documentation](https://wax-ml.readthedocs.io/en/latest/) for examples with\nEWMA or Binning on the air temperature dataset.\n\n\n### ⚡ Performance on big dataframes ⚡\n\nCheck out our [Documentation](https://wax-ml.readthedocs.io/en/latest/) to\nsee how you can use our \"3-step workflow\" to speed things up!\n\n\n### 🔥 Speed 🔥\n\nWAX-ML algorithms are implemented in JAX, so they are fast!\n\nThe use of JAX allows for leveraging hardware accelerators that optimize programs for the CPU, GPU, and TPU.\n\nWith WAX-ML, you can already compute an exponential moving average on a dataframe with 1 million rows with a 3x to 100x speedup\n(depending on the data container you use and speed measurement methodology) compared to\npandas implementation.  (See our notebook in the\n[Quick Start Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/04_The_three_steps_workflow.html)\nor in\n[Colaboratory](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/04_The_three_steps_workflow.ipynb)\n).\n\n## ♻ Feedback loops ♻\n\nFeedback is a fundamental notion in time-series analysis and has a wide history\n(see [Feedback Wikipedia page](https://en.wikipedia.org/wiki/Feedback)  for instance).\nSo, we believe it is important to be able to implement them well in WAX-ML.\n\n\nA fundamental piece in the implementation of feedback loops is the delay operator. We implement it\nwith the delay module `Lag` which is itself implemented with the `Buffer` module, a module\nimplementing the buffering mechanism.\n\nThe linear state-space models used to model linear time-invariant systems in signal theory are a\nwell-known place where feedbacks are used to implement for instance infinite impulse response\nfilters.  This is easily implemented with the WAX-ML tools and will be implemented at\na later time.\n\n\nAnother example is control theory or reinforcement learning.\nIn reinforcement learning setup, an agent and an environment interact with a feedback loop.\nThis generally results in a non-trivial global dynamic.\nIn WAX-ML, we propose a simple module called\n`GymFeedBack` that allows the implementation of reinforcement learning experiments.\nThis is built from an agent and an environment, both possibly having parameters and state:\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/tikz/agent_env.png\" alt=\"logo\" width=\"60%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\n- The agent is in charge of generating an action from observations.\n- The environment is in charge of calculating a reward associated with the agent's action and preparing\n  the next observation from some \"raw observations\" and the agent's action, which it gives back to the\n  agent.\n\nA feedback instance `GymFeedback(agent, env)` is a function that processes the\n\"raw observations\" and returns a reward as represented here:\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/tikz/gymfeedback.png\" alt=\"logo\" width=\"60%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\nEquivalently, we can describe the function `GymFeedback(agent, env)`,\nafter transformation by Haiku transformation, by a pair of pure functions\n`init` and `apply` that we describe here:\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/tikz/gymfeedback_init_apply.png\" alt=\"logo\" width=\"100%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\nWe have made concrete use of this feedback mechanism in this notebook where\nwe give an example of online linear regression in a non-stationary environment:\n- 🦎: [online learning example ![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/eserie/wax-ml/blob/main/docs/notebooks/06_Online_Linear_Regression.ipynb),\n  [Open in Documentation](https://wax-ml.readthedocs.io/en/latest/notebooks/06_Online_Linear_Regression.html) 🦎\n\nHere is an illustrative plot of the final result of the study:\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/_static/online_linear_regression_regret.png\" alt=\"logo\" width=\"100%\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\n- Left: The regret (cumulative sum of losses) first becomes concave, which means that the agent \"learns something\".\n  Then, the regret curve has a bump at step 2000 where it becomes locally linear.\n  It finally ends in a concave regime concave regime, which means that the agent has adapted to the new regime.\n- Right: We see that the weights converge to the correct values in both regimes\n\n### Compatibility with other reinforcement learning frameworks\n\nIn addition, to ensure compatibility with other tools in the Gym ecosystem, we propose a\n*transformation* mechanism to transform functions into standard stateful Python objects\nfollowing the Gym API for *agents* and *environments* implemented in\n[deluca](https://github.com/google/deluca).  These wrappers are in the `wax.gym` package.\n\nWAX-ML implements *callbacks* in the `wax.gym` package.  The callback API was inspired by\nthe one in the one in [dask](https://github.com/dask/dask).\n\nWAX-ML should provide tools for reinforcement learning that should complement well those\nalready existing such as [RLax](https://github.com/deepmind/rlax) or [deluca](https://github.com/google/deluca).\n\n## Future plans\n\n### Feedback loops and control theory\n\nWe would like to implement other types of feedback loops in WAX-ML.\nFor instance, those of the standard control theory toolboxes,\nsuch as those implemented in the SLICOT [SLICOT](http://slicot.org/) library.\n\nMany algorithms in this space are absent from the Python ecosystem and\nwe aim to provide JAX-based implementations and expose them with a simple API.\n\nAn idiomatic example in this field is the\n[Kalman filter](https://fr.wikipedia.org/wiki/Filtre_de_Kalman),\na now-standard algorithm that dates back to the 1950s.\nAfter 30 years of existence, the Python ecosystem has still not integrated\nthis algorithm into widely adopted libraries!\nSome implementations can be found in Python libraries such as\n[python-control](https://github.com/python-control/python-control),\n[stats-models](https://www.statsmodels.org/stable/index.html),\n[SciPy Cookbook](https://scipy-cookbook.readthedocs.io/items/KalmanFiltering.html#).\nAlso, some machine learning libraries have some closed and non-solved issues on this subject\n, see [Scikit-learn#862 issue](https://github.com/scikit-learn/scikit-learn/pull/862)\nor [River#355 issue](https://github.com/online-ml/river/pull/355).\nWhy has the Kalman filter not found its place in these libraries?\nWe think it may be because they have an object-oriented API, which makes\nthem very well suited to the specific problems of modern machine learning but,\non the other hand, prevents them from accommodating additional features such as Kalman filtering.\nWe think the functional approach of WAX-ML, inherited from JAX, could well\nhelp to integrate a Kalman filter implementation in a machine learning ecosystem.\n\nIt turns out that Python code written with JAX is not very far from\n[Fortran](https://fr.wikipedia.org/wiki/Fortran), a mathematical FORmula TRANslating\nsystem.  It should therefore be quite easy and natural to reimplement standard\nalgorithms implemented in Fortran, such as those in the\n[SLICOT](http://slicot.org/) library with JAX.\nIt seems that some questions about the integration of Fortran into\nJAX has already been raised.\nAs noted in\n[this discussion on JAX's Github page](https://github.com/google/jax/discussions/3950),\nit might even be possible to simply wrap Fortran code in JAX.\nThis would avoid a painful rewriting process!\n\n\nAlong with the implementation of good old algorithms,\nwe would like to implement more recent ones from the online learning\nliterature that somehow revisits the filtering and control problems.\nIn particular, we would like to implement the online learning version of the\nARMA model developed in [[3]](#references)\nand some online-learning versions of control theory algorithms,\nan approach called \"the non-stochastic control problem\",\nsuch as the linear quadratic regulator (see [[4]](#references)).\n\n### Optimization\n\n\nThe JAX ecosystem already has a library dedicated to optimization:\n[Optax](https://github.com/deepmind/optax), which we use in WAX-ML.\nWe could complete it by offering\nother first-order algorithms such as the Alternating Direction Multiplier Method\n[(ADMM)](https://stanford.edu/~boyd/admm.html).\nOne can find \"functional\" implementations of proximal algorithms in libraries such\nas\n[proxmin](https://github.com/pmelchior/proxmin)),\n[ProximalOperators](https://kul-forbes.github.io/ProximalOperators.jl/latest/),\nor [COSMO](https://github.com/oxfordcontrol/COSMO.jl),\nwhich could give good reference implementations to start the work.\n\n\nAnother type of work took place around automatic differentiation and optimization.\nIn [[5]](#references) the authors implement differentiable layers based on\nconvex optimization in the library\n[cvxpylayers](https://github.com/cvxgrp/cvxpylayers).\nThey have implemented a JAX API but, at the moment, they cannot use the\n`jit` compilation of JAX yet\n(see [this issue](https://github.com/cvxgrp/cvxpylayers/issues/103)).\nWe would be interested in helping to solve this issue.\n\nFurthermore, in the recent paper [[9]](#references), the authors propose a new\nefficient and modular implicit differentiation technique with a JAX-based implementation that should\nlead to a new open-source optimization library in the JAX ecosystem.\n\n### Other algorithms\n\nThe machine learning libraries [Scikit-learn](https://scikit-learn.org/stable/),\n[River](https://github.com/online-ml/river),\n[ml-numpy](https://github.com/ddbourgin/numpy-ml) implement many \"traditional\" machine\nlearning algorithms that should provide an excellent basis for linking or reimplementing\nin JAX.  WAX-ML could help to build a repository for JAX versions of these algorithms.\n\n### Other APIS\n\n\n\nAs it did for the Gym API, WAX-ML could add support for other high-level object-oriented APIs like\nKeras, Scikit-learn, River ...\n\n\n### Collaborations\n\nThe WAX-ML team is open to discussion and collaboration with contributors from any field who are\n interested in using WAX-ML for their problems on streaming data.  We are looking for use cases\n around data streaming in audio processing, natural language processing, astrophysics, biology,\n finance, engineering ...\n\n We believe that good software design, especially in the scientific domain, requires practical use\n cases and that the more diversified these use cases are, the more the developed functionalities\n will be guaranteed to be well implemented.\n\n By making this software public, we hope to find enthusiasts who aim to develop WAX-ML further!\n\n\n## ⚒ Installation ⚒\n\nYou can install WAX-ML with the command:\n\n```bash\npip install wax-ml\n```\n\nTo install the latest version from source, you can use the command :\n\n```bash\npip install \"wax-ml[dev,complete] @ git+https://github.com/eserie/wax-ml.git\"\n```\n\n## Disclaimer\n\nWAX-ML is in its early stages of development and its features and API are very likely to\nevolve.\n\n\n## Development\n\nYou can contribute to WAX-ML by asking questions, proposing practical use cases, or by contributing to the code or the documentation.  You can have a look at our [Contributing\nGuidelines](https://github.com/eserie/wax-ml/CONTRIBUTING.md) and [Developer\nDocumentation](https://wax-ml.readthedocs.io/en/latest/developer.html) .\n\nWe maintain a \"WAX-ML Enhancement Proposals\" in\n[WEP.md](https://github.com/eserie/wax-ml/WEP.md) file.\n\n\n## References\n\n[1] [Google Princeton AI and Hazan Lab @ Princeton University](https://www.minregret.com/research/)\n\n[2] [FNet: Mixing Tokens with Fourier Transforms, James Lee-Thorp, Joshua Ainslie, Ilya Eckstein, Santiago Ontanon](https://arxiv.org/abs/2105.03824)\n\n[3] [Online Learning for Time Series Prediction, Oren Anava, Elad Hazan, Shie Mannor, Ohad Shamir](http://proceedings.mlr.press/v30/Anava13.html)\n\n[4] [The Nonstochastic Control Problem, Elad Hazan, Sham M. Kakade, Karan Singh](https://arxiv.org/abs/1911.12178)\n\n[5] [Differentiable Convex Optimization Layers, Akshay Agrawal, Brandon Amos, Shane Barratt, Stephen Boyd, Steven Diamond, Zico Kolter](https://arxiv.org/abs/1910.12430)\n\n[6] [Machine learning accelerated computational fluid dynamics, Dmitrii Kochkov, Jamie A. Smith, Ayya Alieva, Qing Wang, Michael P. Brenner, Stephan Hoyer](https://arxiv.org/abs/2102.01010)\n\n[7] [Large dimension forecasting models and random singular value spectra, Jean-Philippe Bouchaud, Laurent Laloux, M. Augusta Miceli, Marc Potters](https://arxiv.org/abs/physics/0512090)\n\n[8] [A novel dynamic PCA algorithm for dynamic data modeling and process monitoring, Yining Dongac and S. JoeQina](https://www.sciencedirect.com/science/article/pii/S095915241730094X)\n\n[9] [Efficient and Modular Implicit Differentiation, Mathieu Blondel, Quentin Berthet, Marco Cuturi, Roy Frostig, Stephan Hoyer, Felipe Llinares-López, Fabian Pedregosa, Jean-Philippe Vert](https://arxiv.org/abs/2105.15183)\n\n## License\n\n```\nCopyright 2021 The WAX-ML Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n\nWAX-ML bundles portions of astropy, dask, deluca, haiku, jax, xarray.\n\nastropy, dask are available under a \"3-clause BSD\" license:\n- dask: `wax/gym/callbacks/callbacks.py`\n- astropy: `CONTRIBUTING.md`\n\ndeluca, haiku, jax and xarray are available under a \"Apache\" license:\n- deluca: `wax/gym/entity.py`\n- haiku: `docs/notebooks/05_reconstructing_the_light_curve_of_stars.*`\n- jax: `docs/conf.py`, `docs/developer.md`\n- xarray: `wax/datasets/generate_temperature_data.py`\n\nThe full text of these `licenses` is included in the licenses directory.\n\n\n## Citing WAX-ML\n\nIf you use WAX-ML, please cite our [paper](http://arxiv.org/abs/2106.06524) using the BibTex entry:\n\n```\n@misc{sérié2021waxml,\n      title={{WAX-ML}: {A} {P}ython library for machine learning and feedback loops on streaming data},\n      author={Emmanuel Sérié},\n      year={2021},\n      eprint={2106.06524},\n      archivePrefix={arXiv},\n      primaryClass={cs.LG},\n      url = {http://arxiv.org/abs/2106.06524},\n}\n```\n\n\n## Reference documentation\n\nFor details about the WAX-ML API, see the\n[reference documentation](https://wax-ml.readthedocs.io/en/latest/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feserie%2Fwax-ml","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feserie%2Fwax-ml","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feserie%2Fwax-ml/lists"}