{"id":13465669,"url":"https://github.com/firmai/atspy","last_synced_at":"2025-05-06T18:20:27.661Z","repository":{"id":39730936,"uuid":"236661502","full_name":"firmai/atspy","owner":"firmai","description":"AtsPy: Automated Time Series Models in Python (by @firmai)","archived":false,"fork":false,"pushed_at":"2022-11-21T21:55:23.000Z","size":811,"stargazers_count":515,"open_issues_count":26,"forks_count":90,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-05-05T02:51:40.022Z","etag":null,"topics":["automated","finance","forecasting","forecasting-models","python","time-series","time-series-analysis"],"latest_commit_sha":null,"homepage":"https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3580631","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/firmai.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}},"created_at":"2020-01-28T05:00:10.000Z","updated_at":"2025-04-20T02:24:20.000Z","dependencies_parsed_at":"2023-01-21T06:00:57.778Z","dependency_job_id":null,"html_url":"https://github.com/firmai/atspy","commit_stats":null,"previous_names":["firmai/automated-time-series"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmai%2Fatspy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmai%2Fatspy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmai%2Fatspy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmai%2Fatspy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/firmai","download_url":"https://codeload.github.com/firmai/atspy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252741700,"owners_count":21797071,"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":["automated","finance","forecasting","forecasting-models","python","time-series","time-series-analysis"],"created_at":"2024-07-31T15:00:33.608Z","updated_at":"2025-05-06T18:20:27.632Z","avatar_url":"https://github.com/firmai.png","language":"Python","readme":"# Automated Time Series Models in Python (AtsPy)\n\n[![Downloads](https://pepy.tech/badge/atspy)](https://pepy.tech/project/atspy)\n\n[![DOI](https://zenodo.org/badge/236661502.svg)](https://zenodo.org/badge/latestdoi/236661502)\n\n---------\n\nFinance Quant Machine Learning\n------------------\n- [ML-Quant.com](https://www.ml-quant.com/)  -  Automated Research Repository \n\n---------\n\n[SSRN Report](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3580631)\n\nEasily develop state of the art time series models to forecast univariate data series. Simply load your data and select which models you want to test. This is the largest repository of automated structural and machine learning time series models. Please get in contact if you want to contribute a model. This is a fledgling project, all advice appreciated. \n\n#### Install\n```\npip install atspy\n```\n\n#### Automated Models\n\n1. ```ARIMA``` - Automated ARIMA Modelling\n1. ```Prophet``` - Modeling Multiple Seasonality With Linear or Non-linear Growth\n1. ```HWAAS``` - Exponential Smoothing With Additive Trend and Additive Seasonality\n1. ```HWAMS``` - Exponential Smoothing with Additive Trend and Multiplicative Seasonality\n1. ```NBEATS``` -  Neural basis expansion analysis (now fixed at 20 Epochs)\n1. ```Gluonts``` - RNN-based Model (now fixed at 20 Epochs)\n1. ```TATS``` - Seasonal and Trend no Box Cox\n1. ```TBAT``` - Trend and Box Cox\n1. ```TBATS1``` - Trend, Seasonal (one), and Box Cox\n1. ```TBATP1``` - TBATS1 but Seasonal Inference is Hardcoded by Periodicity\n1. ```TBATS2``` - TBATS1 With Two Seasonal Periods\n\n#### Why AtsPy?\n\n1. Implements all your favourite automated time series models in a unified manner by simply running ```AutomatedModel(df)```.\n1. Reduce structural model errors with 30%-50% by using LightGBM with TSFresh infused features.  \n1. Automatically identify the seasonalities in your data using singular spectrum analysis, periodograms, and peak analysis.\n1. Identifies and makes accessible the best model for your time series using in-sample validation methods.  \n1. Combines the predictions of all these models in a simple (average) and complex (GBM) ensembles for improved performance.\n1. Where appropriate models have been developed to use GPU resources to speed up the automation process.\n1. Easily access all the models by using ```am.models_dict_in``` for in-sample and ```am.models_dict_out``` for out-of-sample prediction.\n\n#### AtsPy Progress \n\n1. Univariate forecasting only (single column) and only monthly and daily data have been tested for suitability.  \n1. More work ahead; all suggestions and criticisms appreciated, use the issues tab.\n1. **Here** is a **[Google Colab](https://colab.research.google.com/drive/1WzwxUlAKg-WiEm_SleAzBIV6rs5VY_3W)** to run the package in the cloud and **[here you can run all the models](https://colab.research.google.com/drive/14QVrnVtT434s-xYcalHFlQg-o658nekv)**.\n\n\n### Documentation by Example\n\n----------\n#### Load Package\n```python\nfrom atspy import AutomatedModel\n```\n\n#### Pandas DataFrame\n\nThe data requires strict preprocessing, no periods can be skipped and there cannot be any empty values. \n\n```python\nimport pandas as pd\ndf = pd.read_csv(\"https://raw.githubusercontent.com/firmai/random-assets-two/master/ts/monthly-beer-australia.csv\")\ndf.Month = pd.to_datetime(df.Month)\ndf = df.set_index(\"Month\"); df\n```\n\n\u003ctable class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eMegaliters\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eMonth\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1956-01-01\u003c/th\u003e\n      \u003ctd\u003e93.2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1956-02-01\u003c/th\u003e\n      \u003ctd\u003e96.0\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1956-03-01\u003c/th\u003e\n      \u003ctd\u003e95.2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1956-04-01\u003c/th\u003e\n      \u003ctd\u003e77.1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1956-05-01\u003c/th\u003e\n      \u003ctd\u003e70.9\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### AutomatedModel\n\n1. ```AutomatedModel``` - Returns a class instance.\n1. ```forecast_insample``` - Returns an in-sample forcasted dataframe and performance.  \n1. ```forecast_outsample``` - Returns an out-of-sample forcasted dataframe.\n1. ```ensemble``` - Returns the results of three different forms of ensembles.\n1. ```models_dict_in``` - Returns a dictionary of the fully trained in-sample models.\n1. ```models_dict_out``` - Returns a dictionary of the fully trained out-of-sample models.\n\n```python\nfrom atspy import AutomatedModel\nmodel_list = [\"HWAMS\",\"HWAAS\",\"TBAT\"]\nam = AutomatedModel(df = df , model_list=model_list,forecast_len=20 )\n```\n\nOther models to try, **add as many as you like**; note ```ARIMA``` is slow: ```[\"ARIMA\",\"Gluonts\",\"Prophet\",\"NBEATS\", \"TATS\", \"TBATS1\", \"TBATP1\", \"TBATS2\"]```\n\n\n\n#### In-Sample Performance\n```python\nforecast_in, performance = am.forecast_insample(); forecast_in\n```\n\n\u003ctable class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eTarget\u003c/th\u003e\n      \u003cth\u003eHWAMS\u003c/th\u003e\n      \u003cth\u003eHWAAS\u003c/th\u003e\n      \u003cth\u003eTBAT\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eDate\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1985-10-01\u003c/th\u003e\n      \u003ctd\u003e181.6\u003c/td\u003e\n      \u003ctd\u003e161.962148\u003c/td\u003e\n      \u003ctd\u003e162.391653\u003c/td\u003e\n      \u003ctd\u003e148.410071\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1985-11-01\u003c/th\u003e\n      \u003ctd\u003e182.0\u003c/td\u003e\n      \u003ctd\u003e174.688055\u003c/td\u003e\n      \u003ctd\u003e173.191756\u003c/td\u003e\n      \u003ctd\u003e147.999237\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1985-12-01\u003c/th\u003e\n      \u003ctd\u003e190.0\u003c/td\u003e\n      \u003ctd\u003e189.728744\u003c/td\u003e\n      \u003ctd\u003e187.649575\u003c/td\u003e\n      \u003ctd\u003e147.589541\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1986-01-01\u003c/th\u003e\n      \u003ctd\u003e161.2\u003c/td\u003e\n      \u003ctd\u003e155.077205\u003c/td\u003e\n      \u003ctd\u003e154.817215\u003c/td\u003e\n      \u003ctd\u003e147.180980\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1986-02-01\u003c/th\u003e\n      \u003ctd\u003e155.5\u003c/td\u003e\n      \u003ctd\u003e148.054292\u003c/td\u003e\n      \u003ctd\u003e147.477692\u003c/td\u003e\n      \u003ctd\u003e146.773549\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n```python\nperformance\n```\n\n\u003ctable class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eTarget\u003c/th\u003e\n      \u003cth\u003eHWAMS\u003c/th\u003e\n      \u003cth\u003eHWAAS\u003c/th\u003e\n      \u003cth\u003eTBAT\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003ermse\u003c/th\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e17.599400\u003c/td\u003e\n      \u003ctd\u003e18.993827\u003c/td\u003e\n      \u003ctd\u003e36.538009\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003emse\u003c/th\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e309.738878\u003c/td\u003e\n      \u003ctd\u003e360.765452\u003c/td\u003e\n      \u003ctd\u003e1335.026136\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003emean\u003c/th\u003e\n      \u003ctd\u003e155.293277\u003c/td\u003e\n      \u003ctd\u003e142.399639\u003c/td\u003e\n      \u003ctd\u003e140.577496\u003c/td\u003e\n      \u003ctd\u003e126.590412\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### Out-of-Sample Forecast\n\n```python\nforecast_out = am.forecast_outsample(); forecast_out\n```\n\n\u003ctable class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eHWAMS\u003c/th\u003e\n      \u003cth\u003eHWAAS\u003c/th\u003e\n      \u003cth\u003eTBAT\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eDate\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1995-09-01\u003c/th\u003e\n      \u003ctd\u003e137.518755\u003c/td\u003e\n      \u003ctd\u003e137.133938\u003c/td\u003e\n      \u003ctd\u003e142.906275\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1995-10-01\u003c/th\u003e\n      \u003ctd\u003e164.136220\u003c/td\u003e\n      \u003ctd\u003e165.079612\u003c/td\u003e\n      \u003ctd\u003e142.865575\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1995-11-01\u003c/th\u003e\n      \u003ctd\u003e178.671684\u003c/td\u003e\n      \u003ctd\u003e180.009560\u003c/td\u003e\n      \u003ctd\u003e142.827110\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1995-12-01\u003c/th\u003e\n      \u003ctd\u003e184.175954\u003c/td\u003e\n      \u003ctd\u003e185.715043\u003c/td\u003e\n      \u003ctd\u003e142.790757\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1996-01-01\u003c/th\u003e\n      \u003ctd\u003e147.166448\u003c/td\u003e\n      \u003ctd\u003e147.440026\u003c/td\u003e\n      \u003ctd\u003e142.756399\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### Ensemble and Model Validation Performance\n\n```python\nall_ensemble_in, all_ensemble_out, all_performance = am.ensemble(forecast_in, forecast_out)\n```\n\n```python\nall_performance\n```\n\n\u003ctable class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ermse\u003c/th\u003e\n      \u003cth\u003emse\u003c/th\u003e\n      \u003cth\u003emean\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003eensemble_lgb__X__HWAMS\u003c/th\u003e\n      \u003ctd\u003e9.697588\u003c/td\u003e\n      \u003ctd\u003e94.043213\u003c/td\u003e\n      \u003ctd\u003e146.719412\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eensemble_lgb__X__HWAMS__X__HWAMS_HWAAS__X__ensemble_ts__X__HWAAS\u003c/th\u003e\n      \u003ctd\u003e9.875212\u003c/td\u003e\n      \u003ctd\u003e97.519817\u003c/td\u003e\n      \u003ctd\u003e145.250837\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eensemble_lgb__X__HWAMS__X__HWAMS_HWAAS\u003c/th\u003e\n      \u003ctd\u003e11.127326\u003c/td\u003e\n      \u003ctd\u003e123.817378\u003c/td\u003e\n      \u003ctd\u003e142.994374\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eensemble_lgb\u003c/th\u003e\n      \u003ctd\u003e12.748526\u003c/td\u003e\n      \u003ctd\u003e162.524907\u003c/td\u003e\n      \u003ctd\u003e156.487208\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eensemble_lgb__X__HWAMS__X__HWAMS_HWAAS__X__ensemble_ts__X__HWAAS__X__HWAMS_HWAAS_TBAT__X__TBAT\u003c/th\u003e\n      \u003ctd\u003e14.589155\u003c/td\u003e\n      \u003ctd\u003e212.843442\u003c/td\u003e\n      \u003ctd\u003e138.615567\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eHWAMS\u003c/th\u003e\n      \u003ctd\u003e15.567905\u003c/td\u003e\n      \u003ctd\u003e242.359663\u003c/td\u003e\n      \u003ctd\u003e136.951615\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eHWAMS_HWAAS\u003c/th\u003e\n      \u003ctd\u003e16.651370\u003c/td\u003e\n      \u003ctd\u003e277.268110\u003c/td\u003e\n      \u003ctd\u003e135.544299\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eensemble_ts\u003c/th\u003e\n      \u003ctd\u003e17.255107\u003c/td\u003e\n      \u003ctd\u003e297.738716\u003c/td\u003e\n      \u003ctd\u003e163.134079\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eHWAAS\u003c/th\u003e\n      \u003ctd\u003e17.804066\u003c/td\u003e\n      \u003ctd\u003e316.984751\u003c/td\u003e\n      \u003ctd\u003e134.136983\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eHWAMS_HWAAS_TBAT\u003c/th\u003e\n      \u003ctd\u003e23.358758\u003c/td\u003e\n      \u003ctd\u003e545.631579\u003c/td\u003e\n      \u003ctd\u003e128.785846\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eTBAT\u003c/th\u003e\n      \u003ctd\u003e39.003864\u003c/td\u003e\n      \u003ctd\u003e1521.301380\u003c/td\u003e\n      \u003ctd\u003e115.268940\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### Best Performing In-sample\n\n```python\nall_ensemble_in[[\"Target\",\"ensemble_lgb__X__HWAMS\",\"HWAMS\",\"HWAAS\"]].plot()\n```\n![png](atspy_files/insample.png)\n\n\n#### Future Predictions All Models\n\n```python\nall_ensemble_out[[\"ensemble_lgb__X__HWAMS\",\"HWAMS\",\"HWAAS\"]].plot()\n```\n![png](atspy_files/outsample.png)\n\n\n\n#### And Finally Grab the Models\n\n```\nam.models_dict_in\n```\n\n\n\n\n    {'HWAAS': \u003cstatsmodels.tsa.holtwinters.HoltWintersResultsWrapper at 0x7f42f7822d30\u003e,\n     'HWAMS': \u003cstatsmodels.tsa.holtwinters.HoltWintersResultsWrapper at 0x7f42f77fff60\u003e,\n     'TBAT': \u003ctbats.tbats.Model.Model at 0x7f42d3aab048\u003e}\n\n\n\n\n```\nam.models_dict_out\n```\n\n\n\n\n    {'HWAAS': \u003cstatsmodels.tsa.holtwinters.HoltWintersResultsWrapper at 0x7f9c01309278\u003e,\n     'HWAMS': \u003cstatsmodels.tsa.holtwinters.HoltWintersResultsWrapper at 0x7f9c01309cf8\u003e,\n     'TBAT': \u003ctbats.tbats.Model.Model at 0x7f9c08f18ba8\u003e}\n\n\n\n\n\nFollow [this link](https://colab.research.google.com/drive/1WzwxUlAKg-WiEm_SleAzBIV6rs5VY_3W) if you want to run the package in the cloud. \n\n\n#### AtsPy Future Development\n\n1. Additional in-sample validation steps to stop deep learning models from over and underfitting. \n1. Extra performance metrics like MAPE and MAE. \n1. Improved methods to select the window length to use in training and calibrating the model. \n1. Add the ability to accept dirty data, and have the ability to clean it up, interpolation etc. \n1. Add a function to resample to a larger frequency for big datasets.\n1. Add the ability to algorithmically select a good enough chunk of a large dataset to balance performance and time to train. \n1. More internal model optimisation using AIC, BIC an AICC. \n1. Code annotations for other developers to follow and improve on the work being done. \n1. Force seasonality stability between in and out of sample training models.\n1. Make AtsPy less dependency heavy, currently it draws on tensorflow, pytorch and mxnet. \n\n\n\n## Citations\n\nIf you use AtsPy in your research, please consider citing it. I have also written a [small report](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3580631) that can be found on SSRN. \n\nBibTeX entry:\n\n```\n@software{atspy,\n  title = {{AtsPy}: Automated Time Series Models in Python.},\n  author = {Snow, Derek},\n  url = {https://github.com/firmai/atspy/},\n  version = {1.15},\n  date = {2020-02-17},\n}\n```\n\n```\n@misc{atspy,\n  author = {Snow, Derek},\n  title = {{AtsPy}: Automated Time Series Models in Python (1.15).},\n  year  = {2020},\n  url   = {https://github.com/firmai/atspy/},\n}\n```\n\n\n","funding_links":[],"categories":["Python","时间序列"],"sub_categories":["网络服务_其他"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffirmai%2Fatspy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffirmai%2Fatspy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffirmai%2Fatspy/lists"}