diff --git a/README.md b/README.md
index 7e03544a..992f8d78 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ With `Nixtla`, you can easily interact with TimeGPT through simple API calls, ma
Get `Nixtla` up and running with a simple pip command:
```python
-pip install nixtla>=0.4.0
+pip install nixtla>=0.5.1
```
## 🎈 Quick Start
diff --git a/nbs/nixtla_client.ipynb b/nbs/nixtla_client.ipynb
index 0aaaf246..8b671a36 100644
--- a/nbs/nixtla_client.ipynb
+++ b/nbs/nixtla_client.ipynb
@@ -1709,53 +1709,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/markdown": [
- "---\n",
- "\n",
- "## NixtlaClient\n",
- "\n",
- "> NixtlaClient (api_key:Optional[str]=None, base_url:Optional[str]=None,\n",
- "> max_retries:int=6, retry_interval:int=10,\n",
- "> max_wait_time:int=360)\n",
- "\n",
- "Constructs all the necessary attributes for the NixtlaClient object.\n",
- "\n",
- "| | **Type** | **Default** | **Details** |\n",
- "| -- | -------- | ----------- | ----------- |\n",
- "| api_key | Optional | None | The authorization api_key interacts with the Nixtla API.
If not provided, it will be inferred by the NIXTLA_API_KEY environment variable. |\n",
- "| base_url | Optional | None | Custom base_url. Pass only if provided. |\n",
- "| max_retries | int | 6 | The maximum number of attempts to make when calling the API before giving up.
It defines how many times the client will retry the API call if it fails.
Default value is 6, indicating the client will attempt the API call up to 6 times in total |\n",
- "| retry_interval | int | 10 | The interval in seconds between consecutive retry attempts.
This is the waiting period before the client tries to call the API again after a failed attempt.
Default value is 10 seconds, meaning the client waits for 10 seconds between retries. |\n",
- "| max_wait_time | int | 360 | The maximum total time in seconds that the client will spend on all retry attempts before giving up.
This sets an upper limit on the cumulative waiting time for all retry attempts.
If this time is exceeded, the client will stop retrying and raise an exception.
Default value is 360 seconds, meaning the client will cease retrying if the total time
spent on retries exceeds 360 seconds.
The client throws a ReadTimeout error after 60 seconds of inactivity. If you want to
catch these errors, use max_wait_time >> 60. |"
- ],
- "text/plain": [
- "---\n",
- "\n",
- "## NixtlaClient\n",
- "\n",
- "> NixtlaClient (api_key:Optional[str]=None, base_url:Optional[str]=None,\n",
- "> max_retries:int=6, retry_interval:int=10,\n",
- "> max_wait_time:int=360)\n",
- "\n",
- "Constructs all the necessary attributes for the NixtlaClient object.\n",
- "\n",
- "| | **Type** | **Default** | **Details** |\n",
- "| -- | -------- | ----------- | ----------- |\n",
- "| api_key | Optional | None | The authorization api_key interacts with the Nixtla API.
If not provided, it will be inferred by the NIXTLA_API_KEY environment variable. |\n",
- "| base_url | Optional | None | Custom base_url. Pass only if provided. |\n",
- "| max_retries | int | 6 | The maximum number of attempts to make when calling the API before giving up.
It defines how many times the client will retry the API call if it fails.
Default value is 6, indicating the client will attempt the API call up to 6 times in total |\n",
- "| retry_interval | int | 10 | The interval in seconds between consecutive retry attempts.
This is the waiting period before the client tries to call the API again after a failed attempt.
Default value is 10 seconds, meaning the client waits for 10 seconds between retries. |\n",
- "| max_wait_time | int | 360 | The maximum total time in seconds that the client will spend on all retry attempts before giving up.
This sets an upper limit on the cumulative waiting time for all retry attempts.
If this time is exceeded, the client will stop retrying and raise an exception.
Default value is 360 seconds, meaning the client will cease retrying if the total time
spent on retries exceeds 360 seconds.
The client throws a ReadTimeout error after 60 seconds of inactivity. If you want to
catch these errors, use max_wait_time >> 60. |"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"show_doc(NixtlaClient.__init__, title_level=2, name='NixtlaClient')"
]
@@ -1764,39 +1718,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/markdown": [
- "---\n",
- "\n",
- "#### TimeGPT\n",
- "\n",
- "> TimeGPT (*args, **kwargs)\n",
- "\n",
- "Class `TimeGPT` is deprecated; use `NixtlaClient` instead.\n",
- "\n",
- "This class is deprecated and may be removed in future releases.\n",
- "Please use `NixtlaClient` instead."
- ],
- "text/plain": [
- "---\n",
- "\n",
- "#### TimeGPT\n",
- "\n",
- "> TimeGPT (*args, **kwargs)\n",
- "\n",
- "Class `TimeGPT` is deprecated; use `NixtlaClient` instead.\n",
- "\n",
- "This class is deprecated and may be removed in future releases.\n",
- "Please use `NixtlaClient` instead."
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"show_doc(TimeGPT, title_level=4)"
]
@@ -1871,33 +1793,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/markdown": [
- "---\n",
- "\n",
- "## NixtlaClient.validate_api_key\n",
- "\n",
- "> NixtlaClient.validate_api_key (log:bool=True)\n",
- "\n",
- "Returns True if your api_key is valid."
- ],
- "text/plain": [
- "---\n",
- "\n",
- "## NixtlaClient.validate_api_key\n",
- "\n",
- "> NixtlaClient.validate_api_key (log:bool=True)\n",
- "\n",
- "Returns True if your api_key is valid."
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"show_doc(NixtlaClient.validate_api_key, title_level=2, name='NixtlaClient.validate_api_key')"
]
@@ -1906,33 +1802,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/markdown": [
- "---\n",
- "\n",
- "#### NixtlaClient.validate_token\n",
- "\n",
- "> NixtlaClient.validate_token ()\n",
- "\n",
- "this is deprecated in favor of validate_api_key"
- ],
- "text/plain": [
- "---\n",
- "\n",
- "#### NixtlaClient.validate_token\n",
- "\n",
- "> NixtlaClient.validate_token ()\n",
- "\n",
- "this is deprecated in favor of validate_api_key"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"show_doc(NixtlaClient.validate_token, title_level=4, name='NixtlaClient.validate_token')"
]
@@ -1941,25 +1811,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Happy Forecasting! :), If you have questions or need support, please email ops@nixtla.io\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"nixtla_client.validate_api_key()"
@@ -1969,18 +1821,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Happy Forecasting! :), If you have questions or need support, please email ops@nixtla.io\n",
- "/tmp/ipykernel_151473/2077030078.py:6: FutureWarning: Method `validate_token` is deprecated; use `validate_api_key` instead.\n",
- " warnings.warn(\n",
- "INFO:__main__:Happy Forecasting! :), If you have questions or need support, please email ops@nixtla.io\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test validate_token deprecation\n",
@@ -2000,18 +1841,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"_nixtla_client = NixtlaClient(\n",
@@ -2092,76 +1922,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " timestamp | \n",
- " value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 1949-01-01 | \n",
- " 112 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 1949-02-01 | \n",
- " 118 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 1949-03-01 | \n",
- " 132 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 1949-04-01 | \n",
- " 129 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " 1949-05-01 | \n",
- " 121 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " timestamp value\n",
- "0 1949-01-01 112\n",
- "1 1949-02-01 118\n",
- "2 1949-03-01 132\n",
- "3 1949-04-01 129\n",
- "4 1949-05-01 121"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/air_passengers.csv')\n",
@@ -2172,46 +1933,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "/tmp/ipykernel_151473/377358905.py:12: FutureWarning: 'short-horizon' is deprecated; use 'timegpt-1' instead.\n",
- " warnings.warn(f\"'{model}' is deprecated; use '{new_model}' instead.\", FutureWarning)\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "/tmp/ipykernel_151473/377358905.py:12: FutureWarning: 'long-horizon' is deprecated; use 'timegpt-1-long-horizon' instead.\n",
- " warnings.warn(f\"'{model}' is deprecated; use '{new_model}' instead.\", FutureWarning)\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test model change\n",
@@ -2237,44 +1959,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "/tmp/ipykernel_151473/4124144088.py:7: FutureWarning: `'fewshot_steps'` is deprecated; use `'finetune_steps'` instead.\n",
- " warnings.warn(f\"`'{old_name}'` is deprecated; use `'{new_name}'` instead.\", FutureWarning)\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "/tmp/ipykernel_151473/4124144088.py:7: FutureWarning: `'fewshot_loss'` is deprecated; use `'finetune_loss'` instead.\n",
- " warnings.warn(f\"`'{old_name}'` is deprecated; use `'{new_name}'` instead.\", FutureWarning)\n",
- "/tmp/ipykernel_151473/4124144088.py:7: FutureWarning: `'fewshot_steps'` is deprecated; use `'finetune_steps'` instead.\n",
- " warnings.warn(f\"`'{old_name}'` is deprecated; use `'{new_name}'` instead.\", FutureWarning)\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test fewshot deprecation\n",
@@ -2313,20 +1998,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Using the following exogenous variables: dayofweek_0, dayofweek_1, dayofweek_2, dayofweek_3, dayofweek_4, dayofweek_5, dayofweek_6\n",
- "INFO:__main__:Calling Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test date_features with multiple series\n",
@@ -2379,28 +2051,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test quantiles\n",
@@ -2438,186 +2089,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/tmp/ipykernel_151473/2318361101.py:28: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " df_freq['ds'] = df_freq.groupby('unique_id')['ds'].transform(\n",
- "/tmp/ipykernel_151473/2318361101.py:31: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " min_size = df_freq.groupby('unique_id').size().min()\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "/tmp/ipykernel_151473/2318361101.py:28: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " df_freq['ds'] = df_freq.groupby('unique_id')['ds'].transform(\n",
- "/tmp/ipykernel_151473/2318361101.py:31: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " min_size = df_freq.groupby('unique_id').size().min()\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "/tmp/ipykernel_151473/2318361101.py:28: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " df_freq['ds'] = df_freq.groupby('unique_id')['ds'].transform(\n",
- "/tmp/ipykernel_151473/2318361101.py:31: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " min_size = df_freq.groupby('unique_id').size().min()\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "/tmp/ipykernel_151473/2318361101.py:28: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " df_freq['ds'] = df_freq.groupby('unique_id')['ds'].transform(\n",
- "/tmp/ipykernel_151473/2318361101.py:31: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
- " min_size = df_freq.groupby('unique_id').size().min()\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test num partitions\n",
@@ -2729,24 +2201,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Attempt 1 failed...\n",
- "INFO:__main__:Attempt 2 failed...\n",
- "INFO:__main__:Attempt 3 failed...\n",
- "INFO:__main__:Attempt 4 failed...\n",
- "INFO:__main__:Attempt 5 failed...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# we want the api to retry in these cases\n",
@@ -2771,19 +2226,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# we want the api to not retry in these cases\n",
@@ -2801,148 +2244,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Attempt 1 failed...\n",
- "INFO:__main__:Attempt 2 failed...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Attempt 1 failed...\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Attempt 2 failed...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Attempt 1 failed...\n",
- "INFO:__main__:Attempt 2 failed...\n",
- "INFO:__main__:Attempt 3 failed...\n",
- "INFO:__main__:Attempt 4 failed...\n",
- "INFO:__main__:Attempt 5 failed...\n",
- "INFO:__main__:Attempt 6 failed...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Attempt 1 failed...\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Attempt 2 failed...\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Attempt 3 failed...\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Attempt 4 failed...\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Attempt 5 failed...\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Attempt 6 failed...\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "raising HTTP error\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test resilience of api calls\n",
@@ -2976,74 +2278,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: A-DEC\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: A-DEC\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: W-MON\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-MON\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: H\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: H\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test pass dataframe with index\n",
@@ -3068,83 +2303,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/markdown": [
- "---\n",
- "\n",
- "## NixtlaClient.plot\n",
- "\n",
- "> NixtlaClient.plot (df:pandas.core.frame.DataFrame,\n",
- "> forecasts_df:Optional[pandas.core.frame.DataFrame]=Non\n",
- "> e, id_col:str='unique_id', time_col:str='ds',\n",
- "> target_col:str='y', unique_ids:Union[List[str],NoneTyp\n",
- "> e,numpy.ndarray]=None, plot_random:bool=True,\n",
- "> models:Optional[List[str]]=None,\n",
- "> level:Optional[List[float]]=None,\n",
- "> max_insample_length:Optional[int]=None,\n",
- "> plot_anomalies:bool=False, engine:str='matplotlib',\n",
- "> resampler_kwargs:Optional[Dict]=None)\n",
- "\n",
- "Plot forecasts and insample values.\n",
- "\n",
- "| | **Type** | **Default** | **Details** |\n",
- "| -- | -------- | ----------- | ----------- |\n",
- "| df | DataFrame | | The DataFrame on which the function will operate. Expected to contain at least the following columns:
- time_col:
Column name in `df` that contains the time indices of the time series. This is typically a datetime
column with regular intervals, e.g., hourly, daily, monthly data points.
- target_col:
Column name in `df` that contains the target variable of the time series, i.e., the variable we
wish to predict or analyze.
Additionally, you can pass multiple time series (stacked in the dataframe) considering an additional column:
- id_col:
Column name in `df` that identifies unique time series. Each unique value in this column
corresponds to a unique time series. |\n",
- "| forecasts_df | Optional | None | DataFrame with columns [`unique_id`, `ds`] and models. |\n",
- "| id_col | str | unique_id | Column that identifies each serie. |\n",
- "| time_col | str | ds | Column that identifies each timestep, its values can be timestamps or integers. |\n",
- "| target_col | str | y | Column that contains the target. |\n",
- "| unique_ids | Union | None | Time Series to plot.
If None, time series are selected randomly. |\n",
- "| plot_random | bool | True | Select time series to plot randomly. |\n",
- "| models | Optional | None | List of models to plot. |\n",
- "| level | Optional | None | List of prediction intervals to plot if paseed. |\n",
- "| max_insample_length | Optional | None | Max number of train/insample observations to be plotted. |\n",
- "| plot_anomalies | bool | False | Plot anomalies for each prediction interval. |\n",
- "| engine | str | matplotlib | Library used to plot. 'plotly', 'plotly-resampler' or 'matplotlib'. |\n",
- "| resampler_kwargs | Optional | None | Kwargs to be passed to plotly-resampler constructor.
For further custumization (\"show_dash\") call the method,
store the plotting object and add the extra arguments to
its `show_dash` method. |"
- ],
- "text/plain": [
- "---\n",
- "\n",
- "## NixtlaClient.plot\n",
- "\n",
- "> NixtlaClient.plot (df:pandas.core.frame.DataFrame,\n",
- "> forecasts_df:Optional[pandas.core.frame.DataFrame]=Non\n",
- "> e, id_col:str='unique_id', time_col:str='ds',\n",
- "> target_col:str='y', unique_ids:Union[List[str],NoneTyp\n",
- "> e,numpy.ndarray]=None, plot_random:bool=True,\n",
- "> models:Optional[List[str]]=None,\n",
- "> level:Optional[List[float]]=None,\n",
- "> max_insample_length:Optional[int]=None,\n",
- "> plot_anomalies:bool=False, engine:str='matplotlib',\n",
- "> resampler_kwargs:Optional[Dict]=None)\n",
- "\n",
- "Plot forecasts and insample values.\n",
- "\n",
- "| | **Type** | **Default** | **Details** |\n",
- "| -- | -------- | ----------- | ----------- |\n",
- "| df | DataFrame | | The DataFrame on which the function will operate. Expected to contain at least the following columns:
- time_col:
Column name in `df` that contains the time indices of the time series. This is typically a datetime
column with regular intervals, e.g., hourly, daily, monthly data points.
- target_col:
Column name in `df` that contains the target variable of the time series, i.e., the variable we
wish to predict or analyze.
Additionally, you can pass multiple time series (stacked in the dataframe) considering an additional column:
- id_col:
Column name in `df` that identifies unique time series. Each unique value in this column
corresponds to a unique time series. |\n",
- "| forecasts_df | Optional | None | DataFrame with columns [`unique_id`, `ds`] and models. |\n",
- "| id_col | str | unique_id | Column that identifies each serie. |\n",
- "| time_col | str | ds | Column that identifies each timestep, its values can be timestamps or integers. |\n",
- "| target_col | str | y | Column that contains the target. |\n",
- "| unique_ids | Union | None | Time Series to plot.
If None, time series are selected randomly. |\n",
- "| plot_random | bool | True | Select time series to plot randomly. |\n",
- "| models | Optional | None | List of models to plot. |\n",
- "| level | Optional | None | List of prediction intervals to plot if paseed. |\n",
- "| max_insample_length | Optional | None | Max number of train/insample observations to be plotted. |\n",
- "| plot_anomalies | bool | False | Plot anomalies for each prediction interval. |\n",
- "| engine | str | matplotlib | Library used to plot. 'plotly', 'plotly-resampler' or 'matplotlib'. |\n",
- "| resampler_kwargs | Optional | None | Kwargs to be passed to plotly-resampler constructor.
For further custumization (\"show_dash\") call the method,
store the plotting object and add the extra arguments to
its `show_dash` method. |"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"show_doc(NixtlaClient.plot, name='NixtlaClient.plot', title_level=2)"
]
@@ -3153,1283 +2312,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- " \n",
- " "
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.plotly.v1+json": {
- "config": {
- "plotlyServerURL": "https://plot.ly"
- },
- "data": [
- {
- "legendgroup": "value",
- "line": {
- "color": "#393b79",
- "width": 1
- },
- "mode": "lines",
- "name": "value",
- "showlegend": true,
- "type": "scatter",
- "x": [
- "1949-01-01T00:00:00",
- "1949-02-01T00:00:00",
- "1949-03-01T00:00:00",
- "1949-04-01T00:00:00",
- "1949-05-01T00:00:00",
- "1949-06-01T00:00:00",
- "1949-07-01T00:00:00",
- "1949-08-01T00:00:00",
- "1949-09-01T00:00:00",
- "1949-10-01T00:00:00",
- "1949-11-01T00:00:00",
- "1949-12-01T00:00:00",
- "1950-01-01T00:00:00",
- "1950-02-01T00:00:00",
- "1950-03-01T00:00:00",
- "1950-04-01T00:00:00",
- "1950-05-01T00:00:00",
- "1950-06-01T00:00:00",
- "1950-07-01T00:00:00",
- "1950-08-01T00:00:00",
- "1950-09-01T00:00:00",
- "1950-10-01T00:00:00",
- "1950-11-01T00:00:00",
- "1950-12-01T00:00:00",
- "1951-01-01T00:00:00",
- "1951-02-01T00:00:00",
- "1951-03-01T00:00:00",
- "1951-04-01T00:00:00",
- "1951-05-01T00:00:00",
- "1951-06-01T00:00:00",
- "1951-07-01T00:00:00",
- "1951-08-01T00:00:00",
- "1951-09-01T00:00:00",
- "1951-10-01T00:00:00",
- "1951-11-01T00:00:00",
- "1951-12-01T00:00:00",
- "1952-01-01T00:00:00",
- "1952-02-01T00:00:00",
- "1952-03-01T00:00:00",
- "1952-04-01T00:00:00",
- "1952-05-01T00:00:00",
- "1952-06-01T00:00:00",
- "1952-07-01T00:00:00",
- "1952-08-01T00:00:00",
- "1952-09-01T00:00:00",
- "1952-10-01T00:00:00",
- "1952-11-01T00:00:00",
- "1952-12-01T00:00:00",
- "1953-01-01T00:00:00",
- "1953-02-01T00:00:00",
- "1953-03-01T00:00:00",
- "1953-04-01T00:00:00",
- "1953-05-01T00:00:00",
- "1953-06-01T00:00:00",
- "1953-07-01T00:00:00",
- "1953-08-01T00:00:00",
- "1953-09-01T00:00:00",
- "1953-10-01T00:00:00",
- "1953-11-01T00:00:00",
- "1953-12-01T00:00:00",
- "1954-01-01T00:00:00",
- "1954-02-01T00:00:00",
- "1954-03-01T00:00:00",
- "1954-04-01T00:00:00",
- "1954-05-01T00:00:00",
- "1954-06-01T00:00:00",
- "1954-07-01T00:00:00",
- "1954-08-01T00:00:00",
- "1954-09-01T00:00:00",
- "1954-10-01T00:00:00",
- "1954-11-01T00:00:00",
- "1954-12-01T00:00:00",
- "1955-01-01T00:00:00",
- "1955-02-01T00:00:00",
- "1955-03-01T00:00:00",
- "1955-04-01T00:00:00",
- "1955-05-01T00:00:00",
- "1955-06-01T00:00:00",
- "1955-07-01T00:00:00",
- "1955-08-01T00:00:00",
- "1955-09-01T00:00:00",
- "1955-10-01T00:00:00",
- "1955-11-01T00:00:00",
- "1955-12-01T00:00:00",
- "1956-01-01T00:00:00",
- "1956-02-01T00:00:00",
- "1956-03-01T00:00:00",
- "1956-04-01T00:00:00",
- "1956-05-01T00:00:00",
- "1956-06-01T00:00:00",
- "1956-07-01T00:00:00",
- "1956-08-01T00:00:00",
- "1956-09-01T00:00:00",
- "1956-10-01T00:00:00",
- "1956-11-01T00:00:00",
- "1956-12-01T00:00:00",
- "1957-01-01T00:00:00",
- "1957-02-01T00:00:00",
- "1957-03-01T00:00:00",
- "1957-04-01T00:00:00",
- "1957-05-01T00:00:00",
- "1957-06-01T00:00:00",
- "1957-07-01T00:00:00",
- "1957-08-01T00:00:00",
- "1957-09-01T00:00:00",
- "1957-10-01T00:00:00",
- "1957-11-01T00:00:00",
- "1957-12-01T00:00:00",
- "1958-01-01T00:00:00",
- "1958-02-01T00:00:00",
- "1958-03-01T00:00:00",
- "1958-04-01T00:00:00",
- "1958-05-01T00:00:00",
- "1958-06-01T00:00:00",
- "1958-07-01T00:00:00",
- "1958-08-01T00:00:00",
- "1958-09-01T00:00:00",
- "1958-10-01T00:00:00",
- "1958-11-01T00:00:00",
- "1958-12-01T00:00:00",
- "1959-01-01T00:00:00",
- "1959-02-01T00:00:00",
- "1959-03-01T00:00:00",
- "1959-04-01T00:00:00",
- "1959-05-01T00:00:00",
- "1959-06-01T00:00:00",
- "1959-07-01T00:00:00",
- "1959-08-01T00:00:00",
- "1959-09-01T00:00:00",
- "1959-10-01T00:00:00",
- "1959-11-01T00:00:00",
- "1959-12-01T00:00:00",
- "1960-01-01T00:00:00",
- "1960-02-01T00:00:00",
- "1960-03-01T00:00:00",
- "1960-04-01T00:00:00",
- "1960-05-01T00:00:00",
- "1960-06-01T00:00:00",
- "1960-07-01T00:00:00",
- "1960-08-01T00:00:00",
- "1960-09-01T00:00:00",
- "1960-10-01T00:00:00",
- "1960-11-01T00:00:00",
- "1960-12-01T00:00:00"
- ],
- "xaxis": "x",
- "y": [
- 112,
- 118,
- 132,
- 129,
- 121,
- 135,
- 148,
- 148,
- 136,
- 119,
- 104,
- 118,
- 115,
- 126,
- 141,
- 135,
- 125,
- 149,
- 170,
- 170,
- 158,
- 133,
- 114,
- 140,
- 145,
- 150,
- 178,
- 163,
- 172,
- 178,
- 199,
- 199,
- 184,
- 162,
- 146,
- 166,
- 171,
- 180,
- 193,
- 181,
- 183,
- 218,
- 230,
- 242,
- 209,
- 191,
- 172,
- 194,
- 196,
- 196,
- 236,
- 235,
- 229,
- 243,
- 264,
- 272,
- 237,
- 211,
- 180,
- 201,
- 204,
- 188,
- 235,
- 227,
- 234,
- 264,
- 302,
- 293,
- 259,
- 229,
- 203,
- 229,
- 242,
- 233,
- 267,
- 269,
- 270,
- 315,
- 364,
- 347,
- 312,
- 274,
- 237,
- 278,
- 284,
- 277,
- 317,
- 313,
- 318,
- 374,
- 413,
- 405,
- 355,
- 306,
- 271,
- 306,
- 315,
- 301,
- 356,
- 348,
- 355,
- 422,
- 465,
- 467,
- 404,
- 347,
- 305,
- 336,
- 340,
- 318,
- 362,
- 348,
- 363,
- 435,
- 491,
- 505,
- 404,
- 359,
- 310,
- 337,
- 360,
- 342,
- 406,
- 396,
- 420,
- 472,
- 548,
- 559,
- 463,
- 407,
- 362,
- 405,
- 417,
- 391,
- 419,
- 461,
- 472,
- 535,
- 622,
- 606,
- 508,
- 461,
- 390,
- 432
- ],
- "yaxis": "y"
- }
- ],
- "layout": {
- "annotations": [
- {
- "font": {
- "size": 10
- },
- "showarrow": false,
- "text": "unique_id=ts_0",
- "x": 0.5,
- "xanchor": "center",
- "xref": "paper",
- "y": 1,
- "yanchor": "bottom",
- "yref": "paper"
- },
- {
- "font": {
- "size": 10
- },
- "showarrow": false,
- "text": "Time [timestamp]",
- "x": 0.5,
- "xanchor": "center",
- "xref": "paper",
- "y": 0,
- "yanchor": "top",
- "yref": "paper",
- "yshift": -30
- },
- {
- "font": {
- "size": 10
- },
- "showarrow": false,
- "text": "Target [value]",
- "textangle": -90,
- "x": 0,
- "xanchor": "right",
- "xref": "paper",
- "xshift": -40,
- "y": 0.5,
- "yanchor": "middle",
- "yref": "paper"
- }
- ],
- "autosize": true,
- "font": {
- "size": 10
- },
- "margin": {
- "b": 50,
- "l": 60,
- "r": 10,
- "t": 20
- },
- "template": {
- "data": {
- "bar": [
- {
- "error_x": {
- "color": "#2a3f5f"
- },
- "error_y": {
- "color": "#2a3f5f"
- },
- "marker": {
- "line": {
- "color": "white",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "bar"
- }
- ],
- "barpolar": [
- {
- "marker": {
- "line": {
- "color": "white",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "barpolar"
- }
- ],
- "carpet": [
- {
- "aaxis": {
- "endlinecolor": "#2a3f5f",
- "gridcolor": "#C8D4E3",
- "linecolor": "#C8D4E3",
- "minorgridcolor": "#C8D4E3",
- "startlinecolor": "#2a3f5f"
- },
- "baxis": {
- "endlinecolor": "#2a3f5f",
- "gridcolor": "#C8D4E3",
- "linecolor": "#C8D4E3",
- "minorgridcolor": "#C8D4E3",
- "startlinecolor": "#2a3f5f"
- },
- "type": "carpet"
- }
- ],
- "choropleth": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "type": "choropleth"
- }
- ],
- "contour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "colorscale": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ],
- "type": "contour"
- }
- ],
- "contourcarpet": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "type": "contourcarpet"
- }
- ],
- "heatmap": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "colorscale": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ],
- "type": "heatmap"
- }
- ],
- "heatmapgl": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "colorscale": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ],
- "type": "heatmapgl"
- }
- ],
- "histogram": [
- {
- "marker": {
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "histogram"
- }
- ],
- "histogram2d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "colorscale": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ],
- "type": "histogram2d"
- }
- ],
- "histogram2dcontour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "colorscale": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ],
- "type": "histogram2dcontour"
- }
- ],
- "mesh3d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "type": "mesh3d"
- }
- ],
- "parcoords": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "parcoords"
- }
- ],
- "pie": [
- {
- "automargin": true,
- "type": "pie"
- }
- ],
- "scatter": [
- {
- "fillpattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- },
- "type": "scatter"
- }
- ],
- "scatter3d": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scatter3d"
- }
- ],
- "scattercarpet": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scattercarpet"
- }
- ],
- "scattergeo": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scattergeo"
- }
- ],
- "scattergl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scattergl"
- }
- ],
- "scattermapbox": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scattermapbox"
- }
- ],
- "scatterpolar": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scatterpolar"
- }
- ],
- "scatterpolargl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scatterpolargl"
- }
- ],
- "scatterternary": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "type": "scatterternary"
- }
- ],
- "surface": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- },
- "colorscale": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ],
- "type": "surface"
- }
- ],
- "table": [
- {
- "cells": {
- "fill": {
- "color": "#EBF0F8"
- },
- "line": {
- "color": "white"
- }
- },
- "header": {
- "fill": {
- "color": "#C8D4E3"
- },
- "line": {
- "color": "white"
- }
- },
- "type": "table"
- }
- ]
- },
- "layout": {
- "annotationdefaults": {
- "arrowcolor": "#2a3f5f",
- "arrowhead": 0,
- "arrowwidth": 1
- },
- "autotypenumbers": "strict",
- "coloraxis": {
- "colorbar": {
- "outlinewidth": 0,
- "ticks": ""
- }
- },
- "colorscale": {
- "diverging": [
- [
- 0,
- "#8e0152"
- ],
- [
- 0.1,
- "#c51b7d"
- ],
- [
- 0.2,
- "#de77ae"
- ],
- [
- 0.3,
- "#f1b6da"
- ],
- [
- 0.4,
- "#fde0ef"
- ],
- [
- 0.5,
- "#f7f7f7"
- ],
- [
- 0.6,
- "#e6f5d0"
- ],
- [
- 0.7,
- "#b8e186"
- ],
- [
- 0.8,
- "#7fbc41"
- ],
- [
- 0.9,
- "#4d9221"
- ],
- [
- 1,
- "#276419"
- ]
- ],
- "sequential": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ],
- "sequentialminus": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ]
- },
- "colorway": [
- "#636efa",
- "#EF553B",
- "#00cc96",
- "#ab63fa",
- "#FFA15A",
- "#19d3f3",
- "#FF6692",
- "#B6E880",
- "#FF97FF",
- "#FECB52"
- ],
- "font": {
- "color": "#2a3f5f"
- },
- "geo": {
- "bgcolor": "white",
- "lakecolor": "white",
- "landcolor": "white",
- "showlakes": true,
- "showland": true,
- "subunitcolor": "#C8D4E3"
- },
- "hoverlabel": {
- "align": "left"
- },
- "hovermode": "closest",
- "mapbox": {
- "style": "light"
- },
- "paper_bgcolor": "white",
- "plot_bgcolor": "white",
- "polar": {
- "angularaxis": {
- "gridcolor": "#EBF0F8",
- "linecolor": "#EBF0F8",
- "ticks": ""
- },
- "bgcolor": "white",
- "radialaxis": {
- "gridcolor": "#EBF0F8",
- "linecolor": "#EBF0F8",
- "ticks": ""
- }
- },
- "scene": {
- "xaxis": {
- "backgroundcolor": "white",
- "gridcolor": "#DFE8F3",
- "gridwidth": 2,
- "linecolor": "#EBF0F8",
- "showbackground": true,
- "ticks": "",
- "zerolinecolor": "#EBF0F8"
- },
- "yaxis": {
- "backgroundcolor": "white",
- "gridcolor": "#DFE8F3",
- "gridwidth": 2,
- "linecolor": "#EBF0F8",
- "showbackground": true,
- "ticks": "",
- "zerolinecolor": "#EBF0F8"
- },
- "zaxis": {
- "backgroundcolor": "white",
- "gridcolor": "#DFE8F3",
- "gridwidth": 2,
- "linecolor": "#EBF0F8",
- "showbackground": true,
- "ticks": "",
- "zerolinecolor": "#EBF0F8"
- }
- },
- "shapedefaults": {
- "line": {
- "color": "#2a3f5f"
- }
- },
- "ternary": {
- "aaxis": {
- "gridcolor": "#DFE8F3",
- "linecolor": "#A2B1C6",
- "ticks": ""
- },
- "baxis": {
- "gridcolor": "#DFE8F3",
- "linecolor": "#A2B1C6",
- "ticks": ""
- },
- "bgcolor": "white",
- "caxis": {
- "gridcolor": "#DFE8F3",
- "linecolor": "#A2B1C6",
- "ticks": ""
- }
- },
- "title": {
- "x": 0.05
- },
- "xaxis": {
- "automargin": true,
- "gridcolor": "#EBF0F8",
- "linecolor": "#EBF0F8",
- "ticks": "",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "#EBF0F8",
- "zerolinewidth": 2
- },
- "yaxis": {
- "automargin": true,
- "gridcolor": "#EBF0F8",
- "linecolor": "#EBF0F8",
- "ticks": "",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "#EBF0F8",
- "zerolinewidth": 2
- }
- }
- },
- "xaxis": {
- "anchor": "y",
- "autorange": true,
- "domain": [
- 0,
- 1
- ],
- "range": [
- "1949-01-01",
- "1960-12-01"
- ],
- "showticklabels": true,
- "type": "date",
- "visible": true
- },
- "yaxis": {
- "anchor": "x",
- "autorange": true,
- "domain": [
- 0,
- 1
- ],
- "range": [
- 75.22222222222223,
- 650.7777777777778
- ],
- "type": "linear"
- }
- }
- },
- "image/png": "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",
- "text/html": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"nixtla_client.plot(df, time_col='timestamp', target_col='value', engine='plotly')"
@@ -4439,103 +2322,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/markdown": [
- "---\n",
- "\n",
- "## NixtlaClient.forecast\n",
- "\n",
- "> NixtlaClient.forecast (df:pandas.core.frame.DataFrame, h:int,\n",
- "> freq:Optional[str]=None, id_col:str='unique_id',\n",
- "> time_col:str='ds', target_col:str='y',\n",
- "> X_df:Optional[pandas.core.frame.DataFrame]=None,\n",
- "> level:Optional[List[Union[int,float]]]=None,\n",
- "> quantiles:Optional[List[float]]=None,\n",
- "> finetune_steps:int=0, finetune_loss:str='default',\n",
- "> clean_ex_first:bool=True,\n",
- "> validate_api_key:bool=False,\n",
- "> add_history:bool=False,\n",
- "> date_features:Union[bool,List[str]]=False, date_fe\n",
- "> atures_to_one_hot:Union[bool,List[str]]=True,\n",
- "> model:str='timegpt-1',\n",
- "> num_partitions:Optional[int]=None)\n",
- "\n",
- "Forecast your time series using TimeGPT.\n",
- "\n",
- "| | **Type** | **Default** | **Details** |\n",
- "| -- | -------- | ----------- | ----------- |\n",
- "| df | DataFrame | | The DataFrame on which the function will operate. Expected to contain at least the following columns:
- time_col:
Column name in `df` that contains the time indices of the time series. This is typically a datetime
column with regular intervals, e.g., hourly, daily, monthly data points.
- target_col:
Column name in `df` that contains the target variable of the time series, i.e., the variable we
wish to predict or analyze.
Additionally, you can pass multiple time series (stacked in the dataframe) considering an additional column:
- id_col:
Column name in `df` that identifies unique time series. Each unique value in this column
corresponds to a unique time series. |\n",
- "| h | int | | Forecast horizon. |\n",
- "| freq | Optional | None | Frequency of the data. By default, the freq will be inferred automatically.
See [pandas' available frequencies](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases). |\n",
- "| id_col | str | unique_id | Column that identifies each serie. |\n",
- "| time_col | str | ds | Column that identifies each timestep, its values can be timestamps or integers. |\n",
- "| target_col | str | y | Column that contains the target. |\n",
- "| X_df | Optional | None | DataFrame with [`unique_id`, `ds`] columns and `df`'s future exogenous. |\n",
- "| level | Optional | None | Confidence levels between 0 and 100 for prediction intervals. |\n",
- "| quantiles | Optional | None | Quantiles to forecast, list between (0, 1).
`level` and `quantiles` should not be used simultaneously.
The output dataframe will have the quantile columns
formatted as TimeGPT-q-(100 * q) for each q.
100 * q represents percentiles but we choose this notation
to avoid having dots in column names. |\n",
- "| finetune_steps | int | 0 | Number of steps used to finetune learning TimeGPT in the
new data. |\n",
- "| finetune_loss | str | default | Loss function to use for finetuning. Options are: `default`, `mae`, `mse`, `rmse`, `mape`, and `smape`. |\n",
- "| clean_ex_first | bool | True | Clean exogenous signal before making forecasts
using TimeGPT. |\n",
- "| validate_api_key | bool | False | If True, validates api_key before
sending requests. |\n",
- "| add_history | bool | False | Return fitted values of the model. |\n",
- "| date_features | Union | False | Features computed from the dates.
Can be pandas date attributes or functions that will take the dates as input.
If True automatically adds most used date features for the
frequency of `df`. |\n",
- "| date_features_to_one_hot | Union | True | Apply one-hot encoding to these date features.
If `date_features=True`, then all date features are
one-hot encoded by default. |\n",
- "| model | str | timegpt-1 | Model to use as a string. Options are: `timegpt-1`, and `timegpt-1-long-horizon`.
We recommend using `timegpt-1-long-horizon` for forecasting
if you want to predict more than one seasonal
period given the frequency of your data. |\n",
- "| num_partitions | Optional | None | Number of partitions to use.
If None, the number of partitions will be equal
to the available parallel resources in distributed environments. |\n",
- "| **Returns** | **pandas.DataFrame** | | **DataFrame with TimeGPT forecasts for point predictions and probabilistic
predictions (if level is not None).** |"
- ],
- "text/plain": [
- "---\n",
- "\n",
- "## NixtlaClient.forecast\n",
- "\n",
- "> NixtlaClient.forecast (df:pandas.core.frame.DataFrame, h:int,\n",
- "> freq:Optional[str]=None, id_col:str='unique_id',\n",
- "> time_col:str='ds', target_col:str='y',\n",
- "> X_df:Optional[pandas.core.frame.DataFrame]=None,\n",
- "> level:Optional[List[Union[int,float]]]=None,\n",
- "> quantiles:Optional[List[float]]=None,\n",
- "> finetune_steps:int=0, finetune_loss:str='default',\n",
- "> clean_ex_first:bool=True,\n",
- "> validate_api_key:bool=False,\n",
- "> add_history:bool=False,\n",
- "> date_features:Union[bool,List[str]]=False, date_fe\n",
- "> atures_to_one_hot:Union[bool,List[str]]=True,\n",
- "> model:str='timegpt-1',\n",
- "> num_partitions:Optional[int]=None)\n",
- "\n",
- "Forecast your time series using TimeGPT.\n",
- "\n",
- "| | **Type** | **Default** | **Details** |\n",
- "| -- | -------- | ----------- | ----------- |\n",
- "| df | DataFrame | | The DataFrame on which the function will operate. Expected to contain at least the following columns:
- time_col:
Column name in `df` that contains the time indices of the time series. This is typically a datetime
column with regular intervals, e.g., hourly, daily, monthly data points.
- target_col:
Column name in `df` that contains the target variable of the time series, i.e., the variable we
wish to predict or analyze.
Additionally, you can pass multiple time series (stacked in the dataframe) considering an additional column:
- id_col:
Column name in `df` that identifies unique time series. Each unique value in this column
corresponds to a unique time series. |\n",
- "| h | int | | Forecast horizon. |\n",
- "| freq | Optional | None | Frequency of the data. By default, the freq will be inferred automatically.
See [pandas' available frequencies](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases). |\n",
- "| id_col | str | unique_id | Column that identifies each serie. |\n",
- "| time_col | str | ds | Column that identifies each timestep, its values can be timestamps or integers. |\n",
- "| target_col | str | y | Column that contains the target. |\n",
- "| X_df | Optional | None | DataFrame with [`unique_id`, `ds`] columns and `df`'s future exogenous. |\n",
- "| level | Optional | None | Confidence levels between 0 and 100 for prediction intervals. |\n",
- "| quantiles | Optional | None | Quantiles to forecast, list between (0, 1).
`level` and `quantiles` should not be used simultaneously.
The output dataframe will have the quantile columns
formatted as TimeGPT-q-(100 * q) for each q.
100 * q represents percentiles but we choose this notation
to avoid having dots in column names. |\n",
- "| finetune_steps | int | 0 | Number of steps used to finetune learning TimeGPT in the
new data. |\n",
- "| finetune_loss | str | default | Loss function to use for finetuning. Options are: `default`, `mae`, `mse`, `rmse`, `mape`, and `smape`. |\n",
- "| clean_ex_first | bool | True | Clean exogenous signal before making forecasts
using TimeGPT. |\n",
- "| validate_api_key | bool | False | If True, validates api_key before
sending requests. |\n",
- "| add_history | bool | False | Return fitted values of the model. |\n",
- "| date_features | Union | False | Features computed from the dates.
Can be pandas date attributes or functions that will take the dates as input.
If True automatically adds most used date features for the
frequency of `df`. |\n",
- "| date_features_to_one_hot | Union | True | Apply one-hot encoding to these date features.
If `date_features=True`, then all date features are
one-hot encoded by default. |\n",
- "| model | str | timegpt-1 | Model to use as a string. Options are: `timegpt-1`, and `timegpt-1-long-horizon`.
We recommend using `timegpt-1-long-horizon` for forecasting
if you want to predict more than one seasonal
period given the frequency of your data. |\n",
- "| num_partitions | Optional | None | Number of partitions to use.
If None, the number of partitions will be equal
to the available parallel resources in distributed environments. |\n",
- "| **Returns** | **pandas.DataFrame** | | **DataFrame with TimeGPT forecasts for point predictions and probabilistic
predictions (if level is not None).** |"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"show_doc(NixtlaClient.forecast, title_level=2)"
]
@@ -4544,100 +2331,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: D\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: W-THU\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: Q-DEC\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: 15T\n",
- "WARNING:__main__:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon.\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test we recover the same forecasts\n",
@@ -4682,32 +2376,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Anomaly Detector Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"#test same results custom url\n",
@@ -4749,24 +2418,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Preprocessing dataframes...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Calling Forecast Endpoint...\n",
- "INFO:__main__:Calling Historical Forecast Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test different results for different models\n",
@@ -4784,22 +2436,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n",
- "INFO:__main__:Validating inputs...\n",
- "INFO:__main__:Inferred freq: MS\n",
- "INFO:__main__:Restricting input...\n",
- "INFO:__main__:Calling Cross Validation Endpoint...\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#| hide\n",
"# test different results for different models\n",
diff --git a/nixtla/__init__.py b/nixtla/__init__.py
index f884672b..ac51fd85 100644
--- a/nixtla/__init__.py
+++ b/nixtla/__init__.py
@@ -1,3 +1,3 @@
-__version__ = "0.5.0"
+__version__ = "0.5.1"
from .nixtla_client import NixtlaClient, TimeGPT
diff --git a/settings.ini b/settings.ini
index 7c468c50..3be7a2fa 100644
--- a/settings.ini
+++ b/settings.ini
@@ -8,7 +8,7 @@ author = Nixtla
author_email = business@nixtla.io
copyright = Nixtla Inc.
branch = main
-version = 0.5.0
+version = 0.5.1
min_python = 3.8
audience = Developers
language = English
diff --git a/setup.py b/setup.py
index 85980eca..cb3564c9 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,7 @@
setuptools.setup(
name="nixtla",
- version="0.5.0",
+ version="0.5.1",
description="Python SDK for Nixtla API (TimeGPT)",
long_description=long_description,
long_description_content_type="text/markdown",