{"id":15882759,"url":"https://github.com/chris-santiago/tsfeast","last_synced_at":"2026-05-01T23:39:37.508Z","repository":{"id":47613007,"uuid":"391112552","full_name":"chris-santiago/tsfeast","owner":"chris-santiago","description":"A collection of Scikit-Learn compatible time series transformers and tools.","archived":false,"fork":false,"pushed_at":"2022-10-27T18:19:03.000Z","size":3398,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-26T06:29:56.974Z","etag":null,"topics":["data-science","feature-engineering","python","scikit-learn","time-series","timeseries-features","transformers"],"latest_commit_sha":null,"homepage":"https://chris-santiago.github.io/tsfeast/","language":"Jupyter Notebook","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/chris-santiago.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-07-30T15:32:17.000Z","updated_at":"2022-03-30T02:37:12.000Z","dependencies_parsed_at":"2022-07-21T16:34:41.315Z","dependency_job_id":null,"html_url":"https://github.com/chris-santiago/tsfeast","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/chris-santiago/tsfeast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chris-santiago%2Ftsfeast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chris-santiago%2Ftsfeast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chris-santiago%2Ftsfeast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chris-santiago%2Ftsfeast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chris-santiago","download_url":"https://codeload.github.com/chris-santiago/tsfeast/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chris-santiago%2Ftsfeast/sbom","scorecard":{"id":279143,"data":{"date":"2025-08-11","repo":{"name":"github.com/chris-santiago/tsfeast","commit":"fc746371c4744199cb3e488e93df697a57c0cbd1"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/8 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":"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":"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":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/python-publish.yml:16","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":"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":"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":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/chris-santiago/tsfeast/python-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/chris-santiago/tsfeast/python-publish.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:32","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 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-17T15:17:57.772Z","repository_id":47613007,"created_at":"2025-08-17T15:17:57.772Z","updated_at":"2025-08-17T15:17:57.772Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32517232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-science","feature-engineering","python","scikit-learn","time-series","timeseries-features","transformers"],"created_at":"2024-10-06T04:07:01.522Z","updated_at":"2026-05-01T23:39:37.475Z","avatar_url":"https://github.com/chris-santiago.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tsfeast\n[![image](https://img.shields.io/badge/python-3.6--3.10-blue.svg)](https://www.python.org)\n[![Build Status](https://app.travis-ci.com/chris-santiago/tsfeast.svg?branch=master)](https://app.travis-ci.com/chris-santiago/tsfeast)\n[![codecov](https://codecov.io/gh/chris-santiago/tsfeast/branch/master/graph/badge.svg?token=MSO9ZBH6UD)](https://codecov.io/gh/chris-santiago/tsfeast)\n\nA collection of Scikit-Learn compatible time series transformers and tools.\n\n## Installation\n\nCreate a virtual environment and install:\n\n### From PyPi\n\n```bash\npip install tsfeast\n```\n\n### From this repo\n\n```bash\npip install git+https://github.com/chris-santiago/tsfeast.git\n```\n\n## Use\n\n### Preliminaries\n\nThis example shows both the use of individual transformers and the `TimeSeriesFeatures` convenience class that wraps multiple transformers. Both methods are compatible with Scikit-Learn `Pipeline` objects.\n\n\n```python\nimport warnings\nwarnings.filterwarnings(\"ignore\")  # ignore pandas concat warnings from statsmodels\n\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nfrom sklearn.linear_model import LinearRegression, Lasso, PoissonRegressor\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.feature_selection import SelectKBest\nfrom sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, mean_absolute_error\nfrom sklearn.preprocessing import MinMaxScaler, StandardScaler\nfrom statsmodels.tsa.arima_process import arma_generate_sample\nfrom steps.forward import ForwardSelector\n\nfrom tsfeast.transformers import DateTimeFeatures, InteractionFeatures, LagFeatures\nfrom tsfeast.tsfeatures import TimeSeriesFeatures\nfrom tsfeast.funcs import get_datetime_features\nfrom tsfeast.utils import plot_diag\nfrom tsfeast.models import ARMARegressor\n```\n\n\n```python\ndef make_dummy_data(n=200):\n    n_lags = 2\n    coefs = {'ar': [1, -0.85], 'ma': [1, 0], 'trend': 3.2, 'bdays_in_month': 231, 'marketing': 0.0026}\n    rng = np.random.default_rng(seed=42)\n    \n    sales = pd.DataFrame({\n        'date': pd.date_range(end='2020-08-31', periods=n, freq='M'),\n        'sales_base': rng.poisson(200, n),\n        'sales_ar': arma_generate_sample(ar=coefs['ar'], ma=coefs['ma'], nsample=n, scale=100),\n        'sales_trend': [x * coefs['trend'] + rng.poisson(300) for x in range(1, n+1)],\n    })\n    \n    sales = sales.join(get_datetime_features(sales['date'])[['bdays_in_month', 'quarter']])\n    sales['sales_per_day'] = sales['bdays_in_month'] * coefs['bdays_in_month'] + rng.poisson(100, n)\n    \n    sales['mkt_base'] = rng.normal(1e6, 1e4, n)\n    sales['mkt_trend'] = np.array([x * 5e3 for x in range(1, n+1)]) + rng.poisson(100)\n    sales['mkt_season'] = np.where(sales['quarter'] == 3, sales['mkt_base'] * .35, 0)\n    sales['mkt_total'] = sales.loc[:, 'mkt_base': 'mkt_season'].sum(1) + rng.poisson(100, n)\n    sales['sales_mkting'] = sales['mkt_total'].shift(n_lags) * coefs['marketing']\n    \n    final = pd.DataFrame({\n        'y': sales[['sales_base', 'sales_ar', 'sales_trend', 'sales_per_day', 'sales_mkting']].sum(1).astype(int),\n        'date': sales['date'],\n        'marketing': sales['mkt_total'],\n        'x2': rng.random(n),\n        'x3': rng.normal(loc=320, scale=4, size=n)\n    })\n    return sales.iloc[2:, :], final.iloc[2:, :]\n```\n\n\n```python\ndef get_results(estimator, x_train, x_test, y_train, y_test):\n    return pd.DataFrame(\n        {\n            'training': [\n                mean_absolute_error(y_train, estimator.predict(x_train)), \n                mean_absolute_percentage_error(y_train, estimator.predict(x_train))\n            ],\n            'testing':  [\n                mean_absolute_error(y_test, estimator.predict(x_test)), \n                mean_absolute_percentage_error(y_test, estimator.predict(x_test))\n            ],\n        },\n        index = ['MAE', 'MAPE']\n    )\n```\n\n### Example Data\n\nThe dummy dataset in this example includes trend, seasonal, autoregressive and other factor components. Below, we visualize the individual components (`comps`) and features of the dummy dataset `data`.\n\n\n```python\ncomps, data = make_dummy_data()\n```\n\n#### Sales Components\n\n\n```python\ncomps.head()\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003edate\u003c/th\u003e\n      \u003cth\u003esales_base\u003c/th\u003e\n      \u003cth\u003esales_ar\u003c/th\u003e\n      \u003cth\u003esales_trend\u003c/th\u003e\n      \u003cth\u003ebdays_in_month\u003c/th\u003e\n      \u003cth\u003equarter\u003c/th\u003e\n      \u003cth\u003esales_per_day\u003c/th\u003e\n      \u003cth\u003emkt_base\u003c/th\u003e\n      \u003cth\u003emkt_trend\u003c/th\u003e\n      \u003cth\u003emkt_season\u003c/th\u003e\n      \u003cth\u003emkt_total\u003c/th\u003e\n      \u003cth\u003esales_mkting\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e2004-03-31\u003c/td\u003e\n      \u003ctd\u003e211\u003c/td\u003e\n      \u003ctd\u003e153.620257\u003c/td\u003e\n      \u003ctd\u003e285.6\u003c/td\u003e\n      \u003ctd\u003e23\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e5402\u003c/td\u003e\n      \u003ctd\u003e1.012456e+06\u003c/td\u003e\n      \u003ctd\u003e15128.0\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e2584.285914\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e2004-04-30\u003c/td\u003e\n      \u003ctd\u003e181\u003c/td\u003e\n      \u003ctd\u003e18.958345\u003c/td\u003e\n      \u003ctd\u003e300.8\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e5180\u003c/td\u003e\n      \u003ctd\u003e1.009596e+06\u003c/td\u003e\n      \u003ctd\u003e20128.0\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e2661.116408\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e2004-05-31\u003c/td\u003e\n      \u003ctd\u003e195\u003c/td\u003e\n      \u003ctd\u003e54.420246\u003c/td\u003e\n      \u003ctd\u003e312.0\u003c/td\u003e\n      \u003ctd\u003e20\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e4726\u003c/td\u003e\n      \u003ctd\u003e9.848525e+05\u003c/td\u003e\n      \u003ctd\u003e25128.0\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.010071e+06\u003c/td\u003e\n      \u003ctd\u003e2672.000109\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003e2004-06-30\u003c/td\u003e\n      \u003ctd\u003e206\u003c/td\u003e\n      \u003ctd\u003e31.100042\u003c/td\u003e\n      \u003ctd\u003e326.2\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e5195\u003c/td\u003e\n      \u003ctd\u003e1.008291e+06\u003c/td\u003e\n      \u003ctd\u003e30128.0\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.038529e+06\u003c/td\u003e\n      \u003ctd\u003e2677.570754\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003e2004-07-31\u003c/td\u003e\n      \u003ctd\u003e198\u003c/td\u003e\n      \u003ctd\u003e34.283905\u003c/td\u003e\n      \u003ctd\u003e317.4\u003c/td\u003e\n      \u003ctd\u003e21\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e4952\u003c/td\u003e\n      \u003ctd\u003e1.004049e+06\u003c/td\u003e\n      \u003ctd\u003e35128.0\u003c/td\u003e\n      \u003ctd\u003e351416.992807\u003c/td\u003e\n      \u003ctd\u003e1.390691e+06\u003c/td\u003e\n      \u003ctd\u003e2626.185776\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n\n\n```python\nfor col in comps.columns:\n    print(f'Column: {col}')\n    plt.figure(figsize=(10, 5))\n    plt.plot(comps[col])\n    plt.show()\n```\n\n    Column: date\n\n\n\n    \n![png](_static/output_8_1.png)\n    \n\n\n    Column: sales_base\n\n\n\n    \n![png](_static/output_8_3.png)\n    \n\n\n    Column: sales_ar\n\n\n\n    \n![png](_static/output_8_5.png)\n    \n\n\n    Column: sales_trend\n\n\n\n    \n![png](_static/output_8_7.png)\n    \n\n\n    Column: bdays_in_month\n\n\n\n    \n![png](_static/output_8_9.png)\n    \n\n\n    Column: quarter\n\n\n\n    \n![png](_static/output_8_11.png)\n    \n\n\n    Column: sales_per_day\n\n\n\n    \n![png](_static/output_8_13.png)\n    \n\n\n    Column: mkt_base\n\n\n\n    \n![png](_static/output_8_15.png)\n    \n\n\n    Column: mkt_trend\n\n\n\n    \n![png](_static/output_8_17.png)\n    \n\n\n    Column: mkt_season\n\n\n\n    \n![png](_static/output_8_19.png)\n    \n\n\n    Column: mkt_total\n\n\n\n    \n![png](_static/output_8_21.png)\n    \n\n\n    Column: sales_mkting\n\n\n\n    \n![png](_static/output_8_23.png)\n    \n\n\n#### Dummy Dataset\n\n\n```python\ndata.head()\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ey\u003c/th\u003e\n      \u003cth\u003edate\u003c/th\u003e\n      \u003cth\u003emarketing\u003c/th\u003e\n      \u003cth\u003ex2\u003c/th\u003e\n      \u003cth\u003ex3\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e8636\u003c/td\u003e\n      \u003ctd\u003e2004-03-31\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e8341\u003c/td\u003e\n      \u003ctd\u003e2004-04-30\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e7959\u003c/td\u003e\n      \u003ctd\u003e2004-05-31\u003c/td\u003e\n      \u003ctd\u003e1.010071e+06\u003c/td\u003e\n      \u003ctd\u003e0.361299\u003c/td\u003e\n      \u003ctd\u003e324.917503\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003e8435\u003c/td\u003e\n      \u003ctd\u003e2004-06-30\u003c/td\u003e\n      \u003ctd\u003e1.038529e+06\u003c/td\u003e\n      \u003ctd\u003e0.852623\u003c/td\u003e\n      \u003ctd\u003e316.776026\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003e8127\u003c/td\u003e\n      \u003ctd\u003e2004-07-31\u003c/td\u003e\n      \u003ctd\u003e1.390691e+06\u003c/td\u003e\n      \u003ctd\u003e0.571951\u003c/td\u003e\n      \u003ctd\u003e314.425310\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n\n\n```python\nfor col in data.columns:\n    print(f'Column: {col}')\n    plt.figure(figsize=(10, 5))\n    plt.plot(data[col])\n    plt.show()\n```\n\n    Column: y\n\n\n\n    \n![png](_static/output_11_1.png)\n    \n\n\n    Column: date\n\n\n\n    \n![png](_static/output_11_3.png)\n    \n\n\n    Column: marketing\n\n\n\n    \n![png](_static/output_11_5.png)\n    \n\n\n    Column: x2\n\n\n\n    \n![png](_static/output_11_7.png)\n    \n\n\n    Column: x3\n\n\n\n    \n![png](_static/output_11_9.png)\n    \n\n\n\n```python\nX = data.iloc[:, 1:]\ny = data.iloc[:, 0]\nx_train, x_test = X.iloc[:-40, :], X.iloc[-40:, :]\ny_train, y_test = y.iloc[:-40], y.iloc[-40:]\n```\n\n### Individual Transformers\n\n`tsfeast` provides individual time series transformers that can be used by themselves or within Scikit-Learn `Pipeline` objects:\n\n|Transformer|Parameters|Description|\n|-----------|----------|-----------|\n|`OriginalFeatures`|None|Passes original features through pipeline.|\n|`Scaler`|None|Wraps Scikit-Learn `StandardScaler` to maintain DataFrame columns.|\n|`DateTimeFeatures`|date_col: `str`, dt_format: `str`, freq: `str`|Generates datetime features from a given date column.|\n|`LaggedFeatures`|n_lags: `int`, fillna: `bool`|Generate lag features.|\n|`RollingFeatures`|window_lengths: `List[int]`, fillna: `bool`|Generate rolling features (mean, std, min, max) for each specified window length.|\n|`EwmaFeatures`|window_lengths: `List[int]`, fillna: `bool`|Generate exponentially-weighted moving average for each specified window length.|\n|`ChangeFeatures`|period_lengths: `List[int]`, fillna: `bool`|Generate percent change for all features for each specified period length.|\n|`DifferenceFeatures`|n_diffs: `int`, fillna: `bool`|Generate `n` differences for all features.|\n|`PolyFeatures`|degree: `int`|Generate polynomial features.|\n|`InteractionFeatures`|None|Wraps Scikit-Learn `PolynomialFeatures` to generate interaction features and maintain DataFrame columns.|\n\n\n#### Notes on Pipeline Use\n\nBehavior of Scikit-Learn `Pipeline` objects is appropriate and intended for **independent** data observations, but not necessarily appropriate for the **temporal dependencies** inherent in time series.\n\nScikit-Learn pipelines only call the `.transform()` method during the `.predict()` method, which is appropriate to prevent data leakage in predictions.  However, most of the transformers in this package take a set of features and generate new features; there's no inherent method to transform some time series features given a fitted estimator.\n\nFor time series lags, changes, etc., we have access to past data for feature generation without risk of data leakage; certain features (e.g. lags) require this to avoid NaNs or zeros. This behavior is appropriate for time series transformations, only.\n\n#### Generate DateTime Features\n\n\n```python\ndt = DateTimeFeatures(date_col='date')\ndt.fit_transform(X, y)\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eyear\u003c/th\u003e\n      \u003cth\u003equarter\u003c/th\u003e\n      \u003cth\u003emonth\u003c/th\u003e\n      \u003cth\u003edays_in_month\u003c/th\u003e\n      \u003cth\u003ebdays_in_month\u003c/th\u003e\n      \u003cth\u003eleap_year\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e2004\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e31\u003c/td\u003e\n      \u003ctd\u003e23\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e2004\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n      \u003ctd\u003e30\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e2004\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e5\u003c/td\u003e\n      \u003ctd\u003e31\u003c/td\u003e\n      \u003ctd\u003e20\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003e2004\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e30\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003e2004\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e7\u003c/td\u003e\n      \u003ctd\u003e31\u003c/td\u003e\n      \u003ctd\u003e21\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e...\u003c/th\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e195\u003c/th\u003e\n      \u003ctd\u003e2020\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n      \u003ctd\u003e30\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e196\u003c/th\u003e\n      \u003ctd\u003e2020\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e5\u003c/td\u003e\n      \u003ctd\u003e31\u003c/td\u003e\n      \u003ctd\u003e20\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e197\u003c/th\u003e\n      \u003ctd\u003e2020\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e30\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e198\u003c/th\u003e\n      \u003ctd\u003e2020\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e7\u003c/td\u003e\n      \u003ctd\u003e31\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e199\u003c/th\u003e\n      \u003ctd\u003e2020\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e8\u003c/td\u003e\n      \u003ctd\u003e31\u003c/td\u003e\n      \u003ctd\u003e21\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e198 rows × 6 columns\u003c/p\u003e\n\u003c/div\u003e\n\n\n\n#### Generate Interaction Features\n\n\n```python\nfeat = LagFeatures(n_lags=4)\nfeat.fit_transform(X.iloc[:, 1:], y)  # skipping date column\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003emarketing_lag_1\u003c/th\u003e\n      \u003cth\u003ex2_lag_1\u003c/th\u003e\n      \u003cth\u003ex3_lag_1\u003c/th\u003e\n      \u003cth\u003emarketing_lag_2\u003c/th\u003e\n      \u003cth\u003ex2_lag_2\u003c/th\u003e\n      \u003cth\u003ex3_lag_2\u003c/th\u003e\n      \u003cth\u003emarketing_lag_3\u003c/th\u003e\n      \u003cth\u003ex2_lag_3\u003c/th\u003e\n      \u003cth\u003ex3_lag_3\u003c/th\u003e\n      \u003cth\u003emarketing_lag_4\u003c/th\u003e\n      \u003cth\u003ex2_lag_4\u003c/th\u003e\n      \u003cth\u003ex3_lag_4\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003e1.010071e+06\u003c/td\u003e\n      \u003ctd\u003e0.361299\u003c/td\u003e\n      \u003ctd\u003e324.917503\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003e1.038529e+06\u003c/td\u003e\n      \u003ctd\u003e0.852623\u003c/td\u003e\n      \u003ctd\u003e316.776026\u003c/td\u003e\n      \u003ctd\u003e1.010071e+06\u003c/td\u003e\n      \u003ctd\u003e0.361299\u003c/td\u003e\n      \u003ctd\u003e324.917503\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e...\u003c/th\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e195\u003c/th\u003e\n      \u003ctd\u003e1.971301e+06\u003c/td\u003e\n      \u003ctd\u003e0.420222\u003c/td\u003e\n      \u003ctd\u003e313.911203\u003c/td\u003e\n      \u003ctd\u003e1.968782e+06\u003c/td\u003e\n      \u003ctd\u003e0.648398\u003c/td\u003e\n      \u003ctd\u003e327.288221\u003c/td\u003e\n      \u003ctd\u003e1.973312e+06\u003c/td\u003e\n      \u003ctd\u003e0.860346\u003c/td\u003e\n      \u003ctd\u003e319.932653\u003c/td\u003e\n      \u003ctd\u003e1.967943e+06\u003c/td\u003e\n      \u003ctd\u003e0.216269\u003c/td\u003e\n      \u003ctd\u003e317.692606\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e196\u003c/th\u003e\n      \u003ctd\u003e1.981624e+06\u003c/td\u003e\n      \u003ctd\u003e0.188104\u003c/td\u003e\n      \u003ctd\u003e324.110324\u003c/td\u003e\n      \u003ctd\u003e1.971301e+06\u003c/td\u003e\n      \u003ctd\u003e0.420222\u003c/td\u003e\n      \u003ctd\u003e313.911203\u003c/td\u003e\n      \u003ctd\u003e1.968782e+06\u003c/td\u003e\n      \u003ctd\u003e0.648398\u003c/td\u003e\n      \u003ctd\u003e327.288221\u003c/td\u003e\n      \u003ctd\u003e1.973312e+06\u003c/td\u003e\n      \u003ctd\u003e0.860346\u003c/td\u003e\n      \u003ctd\u003e319.932653\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e197\u003c/th\u003e\n      \u003ctd\u003e1.977056e+06\u003c/td\u003e\n      \u003ctd\u003e0.339024\u003c/td\u003e\n      \u003ctd\u003e315.926738\u003c/td\u003e\n      \u003ctd\u003e1.981624e+06\u003c/td\u003e\n      \u003ctd\u003e0.188104\u003c/td\u003e\n      \u003ctd\u003e324.110324\u003c/td\u003e\n      \u003ctd\u003e1.971301e+06\u003c/td\u003e\n      \u003ctd\u003e0.420222\u003c/td\u003e\n      \u003ctd\u003e313.911203\u003c/td\u003e\n      \u003ctd\u003e1.968782e+06\u003c/td\u003e\n      \u003ctd\u003e0.648398\u003c/td\u003e\n      \u003ctd\u003e327.288221\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e198\u003c/th\u003e\n      \u003ctd\u003e1.978757e+06\u003c/td\u003e\n      \u003ctd\u003e0.703778\u003c/td\u003e\n      \u003ctd\u003e320.409889\u003c/td\u003e\n      \u003ctd\u003e1.977056e+06\u003c/td\u003e\n      \u003ctd\u003e0.339024\u003c/td\u003e\n      \u003ctd\u003e315.926738\u003c/td\u003e\n      \u003ctd\u003e1.981624e+06\u003c/td\u003e\n      \u003ctd\u003e0.188104\u003c/td\u003e\n      \u003ctd\u003e324.110324\u003c/td\u003e\n      \u003ctd\u003e1.971301e+06\u003c/td\u003e\n      \u003ctd\u003e0.420222\u003c/td\u003e\n      \u003ctd\u003e313.911203\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e199\u003c/th\u003e\n      \u003ctd\u003e2.332540e+06\u003c/td\u003e\n      \u003ctd\u003e0.204360\u003c/td\u003e\n      \u003ctd\u003e319.029524\u003c/td\u003e\n      \u003ctd\u003e1.978757e+06\u003c/td\u003e\n      \u003ctd\u003e0.703778\u003c/td\u003e\n      \u003ctd\u003e320.409889\u003c/td\u003e\n      \u003ctd\u003e1.977056e+06\u003c/td\u003e\n      \u003ctd\u003e0.339024\u003c/td\u003e\n      \u003ctd\u003e315.926738\u003c/td\u003e\n      \u003ctd\u003e1.981624e+06\u003c/td\u003e\n      \u003ctd\u003e0.188104\u003c/td\u003e\n      \u003ctd\u003e324.110324\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e198 rows × 12 columns\u003c/p\u003e\n\u003c/div\u003e\n\n\n\n### TimeSeriesFeatures Class\n\n`tsfeast` also includes a `TimeSeriesFeatures` class that generates multiple time series features in one transformer. The only required parameter is the column of datetimes; the optional parameters control what additional transformers are included.\n\n|Parameter|Type|Description|\n|---------|----|-----------|\n|datetime|str|Column that holds datetime information|\n|trend|str|Trend to include, options are {'n': no trend, 'c': constant only, 't': linear trend, 'ct': constant and linear trend, 'ctt': constant, linear and quadratric trend}; defaults to no trend| \n|lags|int|Number of lags to include (optional).|\n|rolling|List[int]|Number of rolling windows to include (optional).|\n|ewma|List[int]|Number of ewma windows to include (optional).|\n|pct_chg|List[int]|Periods to use for percent change features (optional).|\n|diffs|int|Number of differences to include (optional).|\n|polynomial|int|Polynomial(s) to include (optional).|\n|interactions|bool|Whether to include interactions of original featutes; deault True.|\n|fillna|bool|Whether to fill NaN values with zero; default True.|\n\n\n\n\n```python\nfeat = TimeSeriesFeatures(\n    datetime='date',\n    trend='t',\n    lags=4,\n    interactions=False,\n    polynomial=3\n)\nfeatures = feat.fit_transform(X, y)\n```\n\n\n```python\nfeatures.head()\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003etrend\u003c/th\u003e\n      \u003cth\u003eoriginal__marketing\u003c/th\u003e\n      \u003cth\u003eoriginal__x2\u003c/th\u003e\n      \u003cth\u003eoriginal__x3\u003c/th\u003e\n      \u003cth\u003edatetime__year\u003c/th\u003e\n      \u003cth\u003edatetime__quarter\u003c/th\u003e\n      \u003cth\u003edatetime__month\u003c/th\u003e\n      \u003cth\u003edatetime__days_in_month\u003c/th\u003e\n      \u003cth\u003edatetime__bdays_in_month\u003c/th\u003e\n      \u003cth\u003edatetime__leap_year\u003c/th\u003e\n      \u003cth\u003e...\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x3_lag_3\u003c/th\u003e\n      \u003cth\u003efeatures__lags__marketing_lag_4\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x2_lag_4\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x3_lag_4\u003c/th\u003e\n      \u003cth\u003efeatures__polynomial__marketing^2\u003c/th\u003e\n      \u003cth\u003efeatures__polynomial__x2^2\u003c/th\u003e\n      \u003cth\u003efeatures__polynomial__x3^2\u003c/th\u003e\n      \u003cth\u003efeatures__polynomial__marketing^3\u003c/th\u003e\n      \u003cth\u003efeatures__polynomial__x2^3\u003c/th\u003e\n      \u003cth\u003efeatures__polynomial__x3^3\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e23.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.056152e+12\u003c/td\u003e\n      \u003ctd\u003e0.513733\u003c/td\u003e\n      \u003ctd\u003e100102.615631\u003c/td\u003e\n      \u003ctd\u003e1.085399e+18\u003c/td\u003e\n      \u003ctd\u003e0.368219\u003c/td\u003e\n      \u003ctd\u003e3.167146e+07\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e4.0\u003c/td\u003e\n      \u003ctd\u003e30.0\u003c/td\u003e\n      \u003ctd\u003e22.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.060560e+12\u003c/td\u003e\n      \u003ctd\u003e0.217631\u003c/td\u003e\n      \u003ctd\u003e101620.756699\u003c/td\u003e\n      \u003ctd\u003e1.092202e+18\u003c/td\u003e\n      \u003ctd\u003e0.101527\u003c/td\u003e\n      \u003ctd\u003e3.239468e+07\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e1.010071e+06\u003c/td\u003e\n      \u003ctd\u003e0.361299\u003c/td\u003e\n      \u003ctd\u003e324.917503\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e5.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e20.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.020244e+12\u003c/td\u003e\n      \u003ctd\u003e0.130537\u003c/td\u003e\n      \u003ctd\u003e105571.383672\u003c/td\u003e\n      \u003ctd\u003e1.030520e+18\u003c/td\u003e\n      \u003ctd\u003e0.047163\u003c/td\u003e\n      \u003ctd\u003e3.430199e+07\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e4.0\u003c/td\u003e\n      \u003ctd\u003e1.038529e+06\u003c/td\u003e\n      \u003ctd\u003e0.852623\u003c/td\u003e\n      \u003ctd\u003e316.776026\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e6.0\u003c/td\u003e\n      \u003ctd\u003e30.0\u003c/td\u003e\n      \u003ctd\u003e22.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e1.078543e+12\u003c/td\u003e\n      \u003ctd\u003e0.726966\u003c/td\u003e\n      \u003ctd\u003e100347.050373\u003c/td\u003e\n      \u003ctd\u003e1.120098e+18\u003c/td\u003e\n      \u003ctd\u003e0.619827\u003c/td\u003e\n      \u003ctd\u003e3.178754e+07\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e5.0\u003c/td\u003e\n      \u003ctd\u003e1.390691e+06\u003c/td\u003e\n      \u003ctd\u003e0.571951\u003c/td\u003e\n      \u003ctd\u003e314.425310\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e7.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e21.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e1.934020e+12\u003c/td\u003e\n      \u003ctd\u003e0.327128\u003c/td\u003e\n      \u003ctd\u003e98863.275608\u003c/td\u003e\n      \u003ctd\u003e2.689624e+18\u003c/td\u003e\n      \u003ctd\u003e0.187101\u003c/td\u003e\n      \u003ctd\u003e3.108512e+07\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e5 rows × 28 columns\u003c/p\u003e\n\u003c/div\u003e\n\n\n\n\n```python\n[x for x in features.columns]\n```\n\n\n\n\n    ['trend',\n     'original__marketing',\n     'original__x2',\n     'original__x3',\n     'datetime__year',\n     'datetime__quarter',\n     'datetime__month',\n     'datetime__days_in_month',\n     'datetime__bdays_in_month',\n     'datetime__leap_year',\n     'features__lags__marketing_lag_1',\n     'features__lags__x2_lag_1',\n     'features__lags__x3_lag_1',\n     'features__lags__marketing_lag_2',\n     'features__lags__x2_lag_2',\n     'features__lags__x3_lag_2',\n     'features__lags__marketing_lag_3',\n     'features__lags__x2_lag_3',\n     'features__lags__x3_lag_3',\n     'features__lags__marketing_lag_4',\n     'features__lags__x2_lag_4',\n     'features__lags__x3_lag_4',\n     'features__polynomial__marketing^2',\n     'features__polynomial__x2^2',\n     'features__polynomial__x3^2',\n     'features__polynomial__marketing^3',\n     'features__polynomial__x2^3',\n     'features__polynomial__x3^3']\n\n\n\n### Pipeline Example\n\nThe `TimeSeriesFeatures` class can be used as a feature generation step within a Scikit-Learn `Pipeline`. Given the temporal nature of the data and models, this may not be appropriate for all use cases-- though the class remains *fully compatible* with `Pipeline` objects.\n\nWe'll instantiate a `TimeSeriesFeatures` object with a linear trend, four lags and no interactions.  Our pipeline will include feature generation, feature scaling and feature selection steps, before modeling with ordinary least squares. \n\n*Note: the `ForwardSelector` class is available in the `step-select` package (https://pypi.org/project/step-select/).*\n\nThe pipeline creates a total of 22 features, before selecting only four to use in the final model. Note that 3 of the 4 final features corresponed with features from our \"true model\" that created the dummy dataset ('trend', 'datetime__bdays_in_month' and 'marketing_lag_2').\n\nRegression diagnostic plots show evidence of slightly non-normal residuals and (1) autoregressive term (again, as specified in the \"true model\").  We'll address the autoregressive term in the next example.\n\n\n```python\nfeat = TimeSeriesFeatures(\n    datetime='date',\n    trend='t',\n    lags=4,\n    interactions=False\n)\n\npl = Pipeline([\n    ('feature_extraction', feat),\n    ('scaler', StandardScaler()),\n    ('feature_selection', ForwardSelector(metric='bic')),\n    ('regression', LinearRegression())\n])\n\npl.fit(x_train, y_train)\n```\n\n\n\n\n    Pipeline(steps=[('feature_extraction',\n                     TimeSeriesFeatures(datetime='date', interactions=False, lags=4,\n                                        trend='t')),\n                    ('scaler', StandardScaler()),\n                    ('feature_selection', ForwardSelector(metric='bic')),\n                    ('regression', LinearRegression())])\n\n\n\n\n```python\npl.named_steps.feature_extraction.output_features_\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003etrend\u003c/th\u003e\n      \u003cth\u003eoriginal__marketing\u003c/th\u003e\n      \u003cth\u003eoriginal__x2\u003c/th\u003e\n      \u003cth\u003eoriginal__x3\u003c/th\u003e\n      \u003cth\u003edatetime__year\u003c/th\u003e\n      \u003cth\u003edatetime__quarter\u003c/th\u003e\n      \u003cth\u003edatetime__month\u003c/th\u003e\n      \u003cth\u003edatetime__days_in_month\u003c/th\u003e\n      \u003cth\u003edatetime__bdays_in_month\u003c/th\u003e\n      \u003cth\u003edatetime__leap_year\u003c/th\u003e\n      \u003cth\u003e...\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x3_lag_1\u003c/th\u003e\n      \u003cth\u003efeatures__lags__marketing_lag_2\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x2_lag_2\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x3_lag_2\u003c/th\u003e\n      \u003cth\u003efeatures__lags__marketing_lag_3\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x2_lag_3\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x3_lag_3\u003c/th\u003e\n      \u003cth\u003efeatures__lags__marketing_lag_4\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x2_lag_4\u003c/th\u003e\n      \u003cth\u003efeatures__lags__x3_lag_4\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e23.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e4.0\u003c/td\u003e\n      \u003ctd\u003e30.0\u003c/td\u003e\n      \u003ctd\u003e22.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e1.010071e+06\u003c/td\u003e\n      \u003ctd\u003e0.361299\u003c/td\u003e\n      \u003ctd\u003e324.917503\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e5.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e20.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e4.0\u003c/td\u003e\n      \u003ctd\u003e1.038529e+06\u003c/td\u003e\n      \u003ctd\u003e0.852623\u003c/td\u003e\n      \u003ctd\u003e316.776026\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e6.0\u003c/td\u003e\n      \u003ctd\u003e30.0\u003c/td\u003e\n      \u003ctd\u003e22.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e324.917503\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n      \u003ctd\u003e0.000000e+00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e5.0\u003c/td\u003e\n      \u003ctd\u003e1.390691e+06\u003c/td\u003e\n      \u003ctd\u003e0.571951\u003c/td\u003e\n      \u003ctd\u003e314.425310\u003c/td\u003e\n      \u003ctd\u003e2004.0\u003c/td\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e7.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e21.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e316.776026\u003c/td\u003e\n      \u003ctd\u003e1.010071e+06\u003c/td\u003e\n      \u003ctd\u003e0.361299\u003c/td\u003e\n      \u003ctd\u003e324.917503\u003c/td\u003e\n      \u003ctd\u003e1.029835e+06\u003c/td\u003e\n      \u003ctd\u003e0.466509\u003c/td\u003e\n      \u003ctd\u003e318.780107\u003c/td\u003e\n      \u003ctd\u003e1.027692e+06\u003c/td\u003e\n      \u003ctd\u003e0.716752\u003c/td\u003e\n      \u003ctd\u003e316.389974\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e...\u003c/th\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e153\u003c/th\u003e\n      \u003ctd\u003e154.0\u003c/td\u003e\n      \u003ctd\u003e1.752743e+06\u003c/td\u003e\n      \u003ctd\u003e0.060631\u003c/td\u003e\n      \u003ctd\u003e322.823879\u003c/td\u003e\n      \u003ctd\u003e2016.0\u003c/td\u003e\n      \u003ctd\u003e4.0\u003c/td\u003e\n      \u003ctd\u003e12.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e21.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e312.156618\u003c/td\u003e\n      \u003ctd\u003e1.750890e+06\u003c/td\u003e\n      \u003ctd\u003e0.537173\u003c/td\u003e\n      \u003ctd\u003e319.820019\u003c/td\u003e\n      \u003ctd\u003e2.110972e+06\u003c/td\u003e\n      \u003ctd\u003e0.368344\u003c/td\u003e\n      \u003ctd\u003e324.492379\u003c/td\u003e\n      \u003ctd\u003e2.127929e+06\u003c/td\u003e\n      \u003ctd\u003e0.320161\u003c/td\u003e\n      \u003ctd\u003e322.674221\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e154\u003c/th\u003e\n      \u003ctd\u003e155.0\u003c/td\u003e\n      \u003ctd\u003e1.782890e+06\u003c/td\u003e\n      \u003ctd\u003e0.368878\u003c/td\u003e\n      \u003ctd\u003e313.360448\u003c/td\u003e\n      \u003ctd\u003e2017.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e20.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e322.823879\u003c/td\u003e\n      \u003ctd\u003e1.762560e+06\u003c/td\u003e\n      \u003ctd\u003e0.296868\u003c/td\u003e\n      \u003ctd\u003e312.156618\u003c/td\u003e\n      \u003ctd\u003e1.750890e+06\u003c/td\u003e\n      \u003ctd\u003e0.537173\u003c/td\u003e\n      \u003ctd\u003e319.820019\u003c/td\u003e\n      \u003ctd\u003e2.110972e+06\u003c/td\u003e\n      \u003ctd\u003e0.368344\u003c/td\u003e\n      \u003ctd\u003e324.492379\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e155\u003c/th\u003e\n      \u003ctd\u003e156.0\u003c/td\u003e\n      \u003ctd\u003e1.788336e+06\u003c/td\u003e\n      \u003ctd\u003e0.254549\u003c/td\u003e\n      \u003ctd\u003e321.235197\u003c/td\u003e\n      \u003ctd\u003e2017.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e28.0\u003c/td\u003e\n      \u003ctd\u003e19.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e313.360448\u003c/td\u003e\n      \u003ctd\u003e1.752743e+06\u003c/td\u003e\n      \u003ctd\u003e0.060631\u003c/td\u003e\n      \u003ctd\u003e322.823879\u003c/td\u003e\n      \u003ctd\u003e1.762560e+06\u003c/td\u003e\n      \u003ctd\u003e0.296868\u003c/td\u003e\n      \u003ctd\u003e312.156618\u003c/td\u003e\n      \u003ctd\u003e1.750890e+06\u003c/td\u003e\n      \u003ctd\u003e0.537173\u003c/td\u003e\n      \u003ctd\u003e319.820019\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e156\u003c/th\u003e\n      \u003ctd\u003e157.0\u003c/td\u003e\n      \u003ctd\u003e1.790967e+06\u003c/td\u003e\n      \u003ctd\u003e0.385921\u003c/td\u003e\n      \u003ctd\u003e316.450145\u003c/td\u003e\n      \u003ctd\u003e2017.0\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e31.0\u003c/td\u003e\n      \u003ctd\u003e23.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e321.235197\u003c/td\u003e\n      \u003ctd\u003e1.782890e+06\u003c/td\u003e\n      \u003ctd\u003e0.368878\u003c/td\u003e\n      \u003ctd\u003e313.360448\u003c/td\u003e\n      \u003ctd\u003e1.752743e+06\u003c/td\u003e\n      \u003ctd\u003e0.060631\u003c/td\u003e\n      \u003ctd\u003e322.823879\u003c/td\u003e\n      \u003ctd\u003e1.762560e+06\u003c/td\u003e\n      \u003ctd\u003e0.296868\u003c/td\u003e\n      \u003ctd\u003e312.156618\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e157\u003c/th\u003e\n      \u003ctd\u003e158.0\u003c/td\u003e\n      \u003ctd\u003e1.811012e+06\u003c/td\u003e\n      \u003ctd\u003e0.196960\u003c/td\u003e\n      \u003ctd\u003e315.360643\u003c/td\u003e\n      \u003ctd\u003e2017.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e4.0\u003c/td\u003e\n      \u003ctd\u003e30.0\u003c/td\u003e\n      \u003ctd\u003e20.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e...\u003c/td\u003e\n      \u003ctd\u003e316.450145\u003c/td\u003e\n      \u003ctd\u003e1.788336e+06\u003c/td\u003e\n      \u003ctd\u003e0.254549\u003c/td\u003e\n      \u003ctd\u003e321.235197\u003c/td\u003e\n      \u003ctd\u003e1.782890e+06\u003c/td\u003e\n      \u003ctd\u003e0.368878\u003c/td\u003e\n      \u003ctd\u003e313.360448\u003c/td\u003e\n      \u003ctd\u003e1.752743e+06\u003c/td\u003e\n      \u003ctd\u003e0.060631\u003c/td\u003e\n      \u003ctd\u003e322.823879\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e158 rows × 22 columns\u003c/p\u003e\n\u003c/div\u003e\n\n\n\n\n```python\nnew_features = pl.named_steps.feature_extraction.feature_names_\nmask = pl.named_steps.feature_selection.get_support()\nnew_features[mask]\n```\n\n\n\n\n    Index(['trend', 'datetime__bdays_in_month', 'features__lags__marketing_lag_2',\n           'features__lags__x3_lag_2'],\n          dtype='object')\n\n\n\n\n```python\nget_results(pl, x_train, x_test, y_train, y_test)\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003etraining\u003c/th\u003e\n      \u003cth\u003etesting\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003eMAE\u003c/th\u003e\n      \u003ctd\u003e373.819325\u003c/td\u003e\n      \u003ctd\u003e201.999695\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eMAPE\u003c/th\u003e\n      \u003ctd\u003e0.040046\u003c/td\u003e\n      \u003ctd\u003e0.017827\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n\n\n```python\nresid = (y_train - pl.predict(x_train))\nplot_diag(resid.iloc[2:])  # throw out first two residuals b/c of lags\n```\n\n\n    \n![png](_static/output_26_0.png)\n    \n\n\n### ARMA Regressor\n\n`tsfeast` includes a `models` module that provides an `ARMARegressor` class for extending Scikit-Learn regressors by adding support for AR/MA or ARIMA residuals. It accepts an arbitrary Scikit-Learn regressor and a tuple indicating the `(p,d,q)` order for the residuals model.\n\n|Attribute|Description|\n|---------|-----------|\n|`estimator`|The Scikit-Learn regressor.|\n|`order`|The (p,d,q,) order of the ARMA model.|\n|`intercept_`|The fitted estimator's intercept.|\n|`coef_`|The fitted estimator's coefficients.|\n|`arma_`|The fitted ARMA model.|\n|`fitted_values_`|The combined estimator and ARMA fitted values.|\n|`resid_`|The combined estimator and ARMA residual values.|\n\n\n**Note**\nThe `predict` method should not be used to get fitted values from the training set; rather, users should access this same data using the `fitted_values_` attribute.  The `predict` method calls the ARMA regresor's forecast method, which generates predictions from the last time step in the training data, thus would not match, temporally, in a `predict` call with training data.\n\nThe pipeline follows the same steps as the previous example, with the only change beging the regression model-- in this case, the `ARMARegressor`.  Metrics on test set slightly improve and we no longer see evidence of autoregressive term in the residuals.\n\n\n```python\nfeat = TimeSeriesFeatures(\n    datetime='date',\n    trend='t',\n    lags=4,\n    interactions=False\n)\n\nmod = ARMARegressor(\n    estimator=PoissonRegressor(),\n    order=(1,0,0)\n)\n\npl = Pipeline([\n    ('feature_extraction', feat),\n    ('scaler', StandardScaler()),\n    ('feature_selection', ForwardSelector(metric='bic')),\n    ('regression', mod)\n])\n\npl.fit(x_train, y_train)\n```\n\n\n\n\n    Pipeline(steps=[('feature_extraction',\n                     TimeSeriesFeatures(datetime='date', interactions=False, lags=4,\n                                        trend='t')),\n                    ('scaler', StandardScaler()),\n                    ('feature_selection', ForwardSelector(metric='bic')),\n                    ('regression', ARMARegressor(estimator=PoissonRegressor()))])\n\n\n\n\n```python\nnew_features = pl.named_steps.feature_extraction.feature_names_\nmask = pl.named_steps.feature_selection.get_support()\nnew_features[mask]\n```\n\n\n\n\n    Index(['trend', 'datetime__bdays_in_month', 'features__lags__marketing_lag_2',\n           'features__lags__x3_lag_2'],\n          dtype='object')\n\n\n\n\n```python\nget_results(pl, x_train, x_test, y_train, y_test)\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003etraining\u003c/th\u003e\n      \u003cth\u003etesting\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003eMAE\u003c/th\u003e\n      \u003ctd\u003e409.572082\u003c/td\u003e\n      \u003ctd\u003e143.269046\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eMAPE\u003c/th\u003e\n      \u003ctd\u003e0.043573\u003c/td\u003e\n      \u003ctd\u003e0.012745\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n\n\n```python\nplot_diag(pl.named_steps.regression.resid_)\n```\n\n\n    \n![png](_static/output_31_0.png)\n    \n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchris-santiago%2Ftsfeast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchris-santiago%2Ftsfeast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchris-santiago%2Ftsfeast/lists"}