{"id":13472490,"url":"https://github.com/georgian-io/pyoats","last_synced_at":"2025-05-08T23:44:35.515Z","repository":{"id":63769115,"uuid":"492021224","full_name":"georgian-io/pyoats","owner":"georgian-io","description":"Quick and Easy Time Series Outlier Detection","archived":false,"fork":false,"pushed_at":"2024-07-15T19:26:01.000Z","size":714272,"stargazers_count":109,"open_issues_count":2,"forks_count":9,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-08T23:44:25.724Z","etag":null,"topics":["anomaly","anomaly-detection","data-science","deep-learning","machine-learning","time-series","timeseries"],"latest_commit_sha":null,"homepage":"","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/georgian-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2022-05-13T19:42:56.000Z","updated_at":"2025-05-06T05:29:03.000Z","dependencies_parsed_at":"2024-03-08T20:44:32.081Z","dependency_job_id":"0a0be954-9e53-4d73-be86-353292b1ba92","html_url":"https://github.com/georgian-io/pyoats","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgian-io%2Fpyoats","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgian-io%2Fpyoats/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgian-io%2Fpyoats/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgian-io%2Fpyoats/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/georgian-io","download_url":"https://codeload.github.com/georgian-io/pyoats/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253166473,"owners_count":21864467,"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":["anomaly","anomaly-detection","data-science","deep-learning","machine-learning","time-series","timeseries"],"created_at":"2024-07-31T16:00:55.083Z","updated_at":"2025-05-08T23:44:35.492Z","avatar_url":"https://github.com/georgian-io.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"\u003c!-- Improved compatibility of back to top link: See: https://github.com/othneildrew/Best-README-Template/pull/73 --\u003e\n\u003ca name=\"readme-top\"\u003e\u003c/a\u003e\n\u003c!--\n*** Thanks for checking out the Best-README-Template. If you have a suggestion\n*** that would make this better, please fork the repo and create a pull request\n*** or simply open an issue with the tag \"enhancement\".\n*** Don't forget to give the project a star!\n*** Thanks again! Now go create something AMAZING! :D\n--\u003e\n\n\n\n\u003c!-- PROJECT SHIELDS --\u003e\n\u003c!--\n*** I'm using markdown \"reference style\" links for readability.\n*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).\n*** See the bottom of this document for the declaration of the reference variables\n*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.\n*** https://www.markdownguide.org/basic-syntax/#reference-style-links\n--\u003e\n[![Contributors][contributors-shield]][contributors-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![Apache 2.0 License][license-shield]][license-url]\n[![Last Commit][last_commit-shield]][last_commit-url]\n\n\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/georgian-io/oats\"\u003e\n    \u003cimg src=\"https://github.com/georgian-io/pyoats/raw/main/static/oats.png\" alt=\"Logo\" width=\"auto\" height=\"80\"\u003e\n  \u003c/a\u003e\n\n\u003ch3 align=\"center\"\u003e OATS\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    Quick and Easy Outlier Detection for Time Series \n    \u003cbr /\u003e\n    \u003ca href=\"https://georgian-io-archive.github.io/pyoats-docs/\"\u003e\u003cstrong\u003eExplore the docs »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://georgian-io.medium.com/time-series-anomaly-detection-a-field-study-d13b35ee4344\"\u003eView Demo\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/georgian-io/pyoats/issues\"\u003eReport Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/georgian-io/pyoats/issues\"\u003eRequest Feature\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#models\"\u003eModels\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contact\"\u003eContact\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#acknowledgments\"\u003eAcknowledgments\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n## About The Project\nAdapting existing outlier detection \u0026 prediction methods into a **time series outlier detection** system is not a simple task. Good news: **OATS** has done the heavy lifting for you! \n\nWe present a straight-forward interface for popular, state-of-the-art detection methods to assist you in your experiments. In addition to the models, we also present different options when it comes to selecting a final threshold for predictions.\n\n**OATS** seamlessly supports both univariate and multivariate time series regardless of the model choice and guarantees the same output shape, enabling a modular approach to time series anoamly detection.\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n### Built With\n[![Python][Python.org]][Python-url] [![Poetry][Python-Poetry.org]][Poetry-url]\n\n[![Pytorch][Pytorch.org]][Torch-url]  [![PytorchLightning][PytorchLightning.ai]][Lightning-url] [![TensorFlow][TensorFlow.org]][TF-url] [![Numpy][Numpy.org]][Numpy-url]\n\n[![Darts][Darts]][Darts-url] [![PyOD][PyOD]][PyOD-url]\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- GETTING STARTED --\u003e\n## Getting Started\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"https://github.com/georgian-io/pyoats/raw/main/static/example-sine_wave.png\" alt=\"Usage Example\" width=\"600\" height=\"auto\"\u003e\n  \u003c/a\u003e\n  \u003c/div\u003e\n\n\n### Prerequisites\n[![Python][Python.org]][Python-url] \u003e=3.8, \u003c3.11\n\n\n#### For Docker Install:\n\n[![Docker][Docker.com]][Docker-url]\n\n#### For Local Install:\n\n[![Poetry][Python-Poetry.org]][Poetry-url]\n\n### Installation\n#### PyPI\n1. Install package via pip\n   ```sh\n   pip install pyoats\n   ```\n   **❗ Installing using an environment manager such as [`conda`](https://docs.conda.io/en/latest/miniconda.html), [`venv`](https://docs.python.org/3/library/venv.html), and [`poetry`](https://python-poetry.org/) is highly encouraged as this package contains deep learning frameworks.**\n  \n#### Docker\n1. Clone the repo\n    ```sh\n    git clone https://github.com/georgian-io/pyoats.git \u0026\u0026 cd pyoats \n    ```\n2. Build image\n    ```sh\n    docker build -t pyoats . \n    ```\n3. Run Container\n    ```sh \n    # CPU Only\n    docker run -it pyoats\n    \n    # with GPU\n    docker run -it --gpus all pyoats\n    ```\n    \n#### Local\n1. Clone the repo\n    ```sh\n    git clone https://github.com/georgian-io/pyoats.git \u0026\u0026 cd pyoats \n    ```\n2. Install via Poetry\n    ```sh \n    poetry install\n    ```\n\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- USAGE EXAMPLES --\u003e\n## Usage\n\n### Quick Start\nFor a quick start, please refer to \u003ca href=\"https://medium.com/@georgian-io/time-series-anomaly-detection-a-field-study-d13b35ee4344\"\u003eour blog\u003c/a\u003e or copy our \u003ca href=\"https://tinyurl.com/pyoats-notebook\"\u003eColab notebook\u003c/a\u003e!\n\n\n### Getting Anomaly Score\n```python \nfrom oats.models import NHiTSModel\n\nmodel = NHiTSModel(window=20, use_gpu=True)\nmodel.fit(train)\nscores = model.get_scores(test)\n```\n### Getting Threshold\n```python \nfrom oats.threshold import QuantileThreshold\n\nt = QuantileThreshold()\nthreshold = t.get_threshold(scores, 0.99)\nanom = scores \u003e threshold\n```\n_For more examples, please refer to the [Documentation](https://georgian-io.github.io/pyoats-docs/)_\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- Models --\u003e\n## Models\n\n\n_For more details about the individual models, please refer to the [Documentation](https://georgian-io.github.io/pyoats-docs/) or \u003ca href=\"https://medium.com/georgian-impact-blog/time-series-anomaly-detection-the-detectives-toolbox-9ef131dddaf9\"\u003ethis blog\u003c/a\u003e for deeper explanation._\n\nModel | Type | Multivariate Support* | Requires Fitting | DL Framework Dependency | Paper | Reference Model\n--- | :---: | :---: | :---: | :---: | :---: |  :---: \n`ARIMA` | Predictive | ⚠️ | ✅ |  | | [`statsmodels.ARIMA`](https://www.statsmodels.org/dev/generated/statsmodels.tsa.arima.model.ARIMA.html)\n`FluxEV` | Predictive | ⚠️ | ✅ |  | [📝](https://dl.acm.org/doi/10.1145/3437963.3441823) | \n`LightGBM` | Predictive | ⚠️ | ✅ |  |  | [`darts.LightGBM`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.gradient_boosted_model.html)\n`Moving Average` | Predictive | ⚠️ |  |  |  | \n`N-BEATS` | Predictive | ✅ | ✅ | [![Pytorch][Pytorch.org]][Torch-url] | [📝](https://openreview.net/forum?id=r1ecqn4YwB) | [`darts.NBEATS`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nbeats.html)\n`N-HiTS` | Predictive | ✅ | ✅ | [![Pytorch][Pytorch.org]][Torch-url] | [📝](https://arxiv.org/abs/2201.12886) | [`darts.NHiTS`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nhits.html)\n`RandomForest` | Predictive | ⚠️ | ✅ | | | [`darts.RandomForest`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.random_forest.html)\n`Regression` | Predictive | ⚠️ | ✅ | | | [`darts.Regression`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.regression_model.html)\n`RNN` | Predictive | ✅ | ✅ | [![Pytorch][Pytorch.org]][Torch-url] | | [`darts.RNN`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.rnn_model.html)\n`Temporal Convolution Network` | Predictive | ✅ | ✅ | [![Pytorch][Pytorch.org]][Torch-url] | [📝](https://arxiv.org/abs/1803.01271) | [`darts.TCN`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tcn_model.html)\n`Temporal Fusion Transformers` | Predictive | ✅ | ✅ | [![Pytorch][Pytorch.org]][Torch-url] | [📝](https://arxiv.org/abs/1912.09363) | [`darts.TFT`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tft_model.html)\n`Transformer` | Predictive | ✅ | ✅ | [![Pytorch][Pytorch.org]][Torch-url] | [📝](https://arxiv.org/abs/1706.03762) | [`darts.Transformer`](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.transformer_model.html)\n`Isolation Forest` | Distance-Based | ✅ | ✅ | || [`pyod.IForest`](https://pyod.readthedocs.io/en/latest/pyod.models.html#module-pyod.models.iforest)\n`Matrix Profile` | Distance-Based | ✅ |  | | [📝](https://www.cs.ucr.edu/~eamonn/MatrixProfile.html) | [`stumpy`](https://github.com/TDAmeritrade/stumpy)\n`TranAD` | Reconstruction-Based | ✅ | ✅ | [![TensorFlow][TensorFlow.org]][Torch-url] | [📝](https://arxiv.org/abs/2201.07284) | [`tranad`](https://github.com/imperial-qore/TranAD)\n`Variational Autoencoder` | Reconstruction-Based | ✅ | ✅ | [![TensorFlow][TensorFlow.org]][Torch-url] |   [📝](https://arxiv.org/abs/1312.6114) | [`pyod.VAE`](https://pyod.readthedocs.io/en/latest/pyod.models.html#module-pyod.models.vae)\n`Quantile` | Rule-Based | ⚠️ |  |  || \n\n\n\n\n\n**\\*** For models with ⚠️, score calculation is done separately along each column. This implicitly assumes independence of covariates, which means that **the resultant anomaly scores do not take into account of inter-variable dependency structures.**\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- ROADMAP --\u003e\n## Roadmap\n\n- [ ] Automatic hyper-parameter tuning\n- [ ] More examples \n- [ ] More preprocessors\n- [ ] More models from `pyod`\n\nSee the [open issues](https://github.com/georgian-io/pyoats/issues) for a full list of proposed features (and known issues).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- CONTRIBUTING --\u003e\n## Contributing\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag \"enhancement\".\n\nDon't forget to give the project a star! Thanks again!\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/amazing_feature`)\n3. Commit your Changes (`git commit -m 'Add some amazing_feature'`)\n4. Push to the Branch (`git push origin feature/amazing_feature`)\n5. Open a Pull Request\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- LICENSE --\u003e\n## License\n\nDistributed under the Apache 2.0 License. See `LICENSE` for more information.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- CONTACT --\u003e\n## Contact\n\n\u003cdiv align=\"left\"\u003e\n  \u003ca href=\"https://www.georgian.io\"\u003e\n    \u003cimg src=\"https://s34372.pcdn.co/wp-content/uploads/2022/03/Georgian_Blue.png\" alt=\"Logo\" width=\"auto\" height=\"80\"\u003e\n  \u003c/a\u003e\n  \u003c/div\u003e\n\n\n|\u003c!-- --\u003e|\u003c!-- --\u003e|\u003c!-- --\u003e|\u003c!-- --\u003e|\n|---|---|---|---|\n| __Benjamin Ye__ | [![Github][BenGithub]][BenLinkedIn-url] | [![LinkedIn][BenLinkedIn]][BenLinkedIn-url] |  [![eMail][eMail]][BenEmail-url] \n\n\nProject Link: [https://github.com/georgian-io/oats](https://github.com/georgian-io/oats)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- ACKNOWLEDGMENTS --\u003e\n## Acknowledgments\nI would like to thank my colleagues from Georgian for all the help and advice provided along the way.\n* [Angeline Yasodhara](mailto:angeline@georgian.io)\n* [Akshay Budhkar](mailto:akshay@georgian.io)\n* [Borna Almasi](mailto:borna@georgian.io)\n* [Parinaz Sobhani](mailto:parinaz@georgian.io)\n* [Rodrigo Ceballos Lentini](mailto:rodrigo@georgian.io)\n\nI'd also like to extend my gratitude to all the contributors at [`Darts`][Darts-url] (for time series predictions) and [`PyOD`][PyOD-url] (for general outlier detection), whose projects have enabled a straight-forward extension into the domain of time series anomaly detection.\n\nFinally, it'll be remiss of me to not mention [DATA Lab @ Rice University](https://cs.rice.edu/~xh37/index.html), whose wonderful [`TODS`][TODS-url] package served as a major inspiration for this project. Please check them out especially if you're looking for AutoML support.\n\n[![Darts][Darts]][Darts-url] [![PyOD][PyOD]][PyOD-url] [![TODS][TODS]][TODS-url]\n\n \n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/georgian-io/oats.svg?style=for-the-badge\n[contributors-url]: https://github.com/georgian-io/pyoats/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/georgian-io/contributors.svg?style=for-the-badge\n[forks-url]: https://github.com/georgian-io/pyoats/network/members\n[stars-shield]: https://img.shields.io/github/stars/georgian-io/oats.svg?style=for-the-badge\n[stars-url]: https://github.com/georgian-io/pyoats/stargazers\n[issues-shield]: https://img.shields.io/github/issues/georgian-io/oats.svg?style=for-the-badge\n[issues-url]: https://github.com/georgian-io/pyoats/issues\n[license-shield]: https://img.shields.io/github/license/georgian-io/oats.svg?style=for-the-badge\n[license-url]: https://github.com/georgian-io/pyoats/blob/master/LICENSE\n[last_commit-shield]: https://img.shields.io/github/last-commit/georgian-io/oats.svg?style=for-the-badge\n[last_commit-url]: https://github.com/georgian-io/pyoats/commits/\n\n\n\n\u003c!-- Deps Links --\u003e\n[Python-Poetry.org]: https://img.shields.io/badge/Poetry-60A5FA?style=for-the-badge\u0026logo=poetry\u0026logoColor=white\n[Poetry-url]: https://www.python-poetry.org/\n[Python.org]: https://img.shields.io/badge/Python-3776AB?style=for-the-badge\u0026logo=python\u0026logoColor=white\n[Python-url]: https://www.python.org/\n[PyTorch.org]: https://img.shields.io/badge/PyTorch-EE4C2C?style=for-the-badge\u0026logo=pytorch\u0026logoColor=white\n[Torch-url]: https://pytorch.org/\n[TensorFlow.org]: https://img.shields.io/badge/TensorFlow-FF6F00?style=for-the-badge\u0026logo=tensorflow\u0026logoColor=white\n[TF-url]: https://www.tensorflow.org/\n[Numpy.org]: https://img.shields.io/badge/Numpy-013243?style=for-the-badge\u0026logo=numpy\u0026logoColor=white\n[Numpy-url]: https://www.numpy.org/\n[Darts]: https://img.shields.io/badge/Repo-Darts-2100FF?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[Darts-url]: https://github.com/unit8co/darts\n[PyOD]: https://img.shields.io/badge/Repo-PyOD-000000?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[PyOD-url]: https://github.com/yzhao062/pyod\n[TODS]: https://img.shields.io/badge/Repo-TODS-29B48C?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[TODS-url]: https://github.com/datamllab/tods\n[Docker.com]: https://img.shields.io/badge/Docker-2496ED?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[Docker-url]: https://docker.com\n[PyTorchLightning.ai]: https://img.shields.io/badge/lightning-792EE5?style=for-the-badge\u0026logo=pytorchlightning\u0026logoColor=white\n[Lightning-url]: https://www.pytorchlightning.ai/\n\n\n\n[BenLinkedIn]: https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\n[BenLinkedIn-url]: https://www.linkedin.com/in/benjaminye/\n\n[eMail]: https://img.shields.io/badge/EMail-EA4335?style=for-the-badge\u0026logo=gmail\u0026logoColor=white\n[BenEmail-url]: mailto:benjamin.ye@georgian.io\n\n[BenGithub]: https://img.shields.io/badge/Profile-14334A?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[BenGithub-url]: https://www.linkedin.com/in/benjaminye/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgian-io%2Fpyoats","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeorgian-io%2Fpyoats","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgian-io%2Fpyoats/lists"}