Commit f42429f6 authored by bailuo's avatar bailuo
Browse files

readme

parents
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Online (Real-Time) Anomaly Detection"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Online anomaly detection dynamically identifies anomalies as data streams in, allowing users to specify the number of timestamps to monitor. This method is well-suited for immediate applications, such as fraud detection, live sensor monitoring, or tracking real-time demand changes. By focusing on recent data and continuously generating forecasts, it enables timely responses to anomalies in critical scenarios.\n",
"\n",
"This section provides various recipes for performing real-time anomaly detection using TimeGPT, offering users the ability to detect outliers and unusual patterns as they emerge, ensuring prompt intervention in time-sensitive situations.\n",
"\n",
"This section covers:\n",
"\n",
"* [Online anomaly detection](https://docs.nixtla.io/docs/capabilities-online-anomaly-detection-quickstart)\n",
"\n",
"* [How to adjust the detection process](https://docs.nixtla.io/docs/capabilities-online-anomaly-detection-adjusting_detection_process.ipynb)\n",
"\n",
"* [Univariate vs. multiseries anomaly detection](https://docs.nixtla.io/docs/capabilities-online-anomaly-detection-univariate_vs_multivariate_anomaly_detection)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"!pip install -Uqq nixtla"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide \n",
"from nixtla.utils import in_colab"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide \n",
"IN_COLAB = in_colab()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"if not IN_COLAB:\n",
" from nixtla.utils import colab_badge\n",
" from dotenv import load_dotenv"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction to Online (Real-Time) Anomaly Detection\n",
"In this notebook, we introduce the `detect_anomalies_online` method. You will learn how to quickly start using this new endpoint and understand its key differences from the historical anomaly detection endpoint. New features include:\n",
"* More flexibility and control over the anomaly detection process\n",
"* Perform univariate and multivariate anomaly detection\n",
"* Detect anomalies on stream data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"[![](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Nixtla/nixtla/blob/main/nbs/docs/capabilities/online-anomaly-detection/01_quickstart.ipynb)"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#| echo: false\n",
"if not IN_COLAB:\n",
" load_dotenv()\n",
" colab_badge('docs/capabilities/online-anomaly-detection/01_quickstart')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from nixtla import NixtlaClient\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nixtla_client = NixtlaClient(\n",
" # defaults to os.environ.get(\"NIXTLA_API_KEY\")\n",
" api_key = 'my_api_key_provided_by_nixtla'\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 👍 Use an Azure AI endpoint\n",
"> \n",
"> To use an Azure AI endpoint, set the `base_url` argument:\n",
"> \n",
"> `nixtla_client = NixtlaClient(base_url=\"you azure ai endpoint\", api_key=\"your api_key\")`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"if not IN_COLAB:\n",
" nixtla_client = NixtlaClient()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Dataset\n",
"In this notebook, we use a minute-level time series dataset that monitors server usage. This is a good example of a streaming data scenario, as the task is to detect server failures or downtime."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('https://datasets-nixtla.s3.us-east-1.amazonaws.com/machine-1-1.csv', parse_dates=['ts'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We observe that the time series remains stable during the initial period; however, a spike occurs in the last 20 steps, indicating an anomalous behavior. Our goal is to capture this abnormal jump as soon as it appears. Let's see how the real-time anomaly detection capability of TimeGPT performs in this scenario!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAADrCAYAAACfMk6oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdzUlEQVR4nO3dd1yT1/4H8E8SslgBHAxBROvEjVbRuuqg2lqt9WprHdQur7XLtrZ22dqhXdbaXq29tfLruI5eR623rRutSp04UauCQjWIA8JOSPL8/gh5SCBAQAIBPu/XK6+XPHlychJOMN/n+z3nSARBEEBERERERERELiGt6w4QERERERERNWQMvImIiIiIiIhciIE3ERERERERkQsx8CYiIiIiIiJyIQbeRERERERERC7EwJuIiIiIiIjIhRh4ExEREREREbkQA28iIiIiIiIiF2LgTURERERERORCDLyJiIhuk0QiceoWHx+P2NhYtGrVqq67bCctLQ0zZ85Eu3btoFarERAQgC5duuCJJ55AWlpajT5XXFwcJBIJLl26VKPtEhERuTOPuu4AERFRfZeQkGD387vvvotdu3Zh586ddsc7deqEsLAwPPfcc7XZvQr9/fff6NmzJ/z8/PDiiy+iffv20Ol0SEpKwtq1a5GcnIywsLAae757770XCQkJCA4OrrE2iYiI3J1EEAShrjtBRETUkMTGxuK///0vcnNz67orlZo3bx7mz5+P5ORkRERElLnfbDZDKr39ArmCggKoVCpIJJLbbouIiKi+Yak5ERFRLXJUai6RSDBr1iysXLkS7du3h1qtRq9evfDnn39CEAR8/PHHiIiIgLe3N+6++25cuHChTLvbt2/H0KFD4evrC09PT/Tv3x87duyotD83b96EVCpF8+bNHd5fOug+fPgw7r//fgQEBEClUqFHjx5Yu3at3TnWcvKtW7di+vTpaNasGTw9PaHX68stNXem/9evX8eTTz6JsLAwKJVKNGvWDP3798f27dsrfZ1ERER1iYE3ERGRG9i8eTO++eYbLFy4EKtWrUJOTg7uvfdevPjii9i3bx++/PJLfP3110hKSsKDDz4I24K1H374ASNGjICvry/+7//+D2vXrkVAQABiYmIqDb6jo6NhNpsxbtw4bNmyBdnZ2eWeu2vXLvTv3x9ZWVn46quv8PPPP6N79+6YOHEi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y2Aw4MiRI3j11Vftjo8YMQL79+93+JiEhASMGDHC7lhMTAxWrFiBoqIiyOVyJCQk4IUXXihzzuLFi8vti16vh15fUjaXnW3Z3/Ovv57hHG835Okph6enHC1a1FyblvJxVaX7NqrVcqjVcgQH+1R4HhERERERkStU6XLHjRs3YDKZEBgYaHc8MDAQ6enpDh+Tnp7u8Hyj0YgbN25UeE55bQLAggULoNFoxFtYWFi55xIRERERERHVlWrVGZSexycIQoVz+xydX/p4VducO3cudDqdeEtLS3O6/0RERERERES1pUql5k2bNoVMJiuTic7IyCiTsbYKCgpyeL6HhweaNGlS4TnltQkASqUSSqXj1VOJiIiIiIiI3EWVMt4KhQJRUVHYtm2b3fFt27ahX79+Dh8THR1d5vytW7eiV69ekMvlFZ5TXptERERERERE9UWVN9OcPXs2pkyZgl69eiE6Ohpff/01UlNTxX25586diytXruC7774DYFnB/Msvv8Ts2bPxxBNPICEhAStWrLBbrfy5557DwIED8eGHH2LMmDH4+eefsX37duzdu9fpflnL162LrBERERER1WemAhNy8rIh0Ush8Sg1LdMoQDCaIWRLICviquZUsYrGEpWozufKGn9WulmYUA3/+te/hPDwcEGhUAg9e/YUdu/eLd43bdo0YdCgQXbnx8fHCz169BAUCoXQqlUrYdmyZWXa/Omnn4T27dsLcrlc6NChg7Bu3boq9enixYsCAN5444033njjjTfeeOONN954q9XbxYsXK4xXq7yPt7vKysqCv78/UlNTodFo6ro75KZ69+6NQ4cO1XU3iFyK45waC451agw4zqmxqK9jXafToWXLlsjMzISfn1+551W51NxdSaWW6eoajYb7eFO5ZDIZxwc1eBzn1FhwrFNjwHFOjUV9H+vWeLTc+2upH0Ru4emnn67rLhC5HMc5NRYc69QYcJxTY9HQx3qDKTXPzs6GRqOBTqer11dKiIiIiIiIqH5wNg5tMBlvpVKJefPmcW9vIiIiIiIiqhXOxqENJuNNRERERERE5I4aTMabiIiIiIiIyB0x8CYiIiIiIiJyIQbe5Pb27NmD0aNHIyQkBBKJBBs3brS7Pzc3F7NmzUJoaCjUajU6duyIZcuWVdruyZMnMWjQIKjVarRo0QLz589H6ZkXu3fvRlRUFFQqFVq3bo2vvvqqJl8akZ3Kxvq1a9cQGxuLkJAQeHp64p577sH58+crbZdjndzJggUL0Lt3b/j4+KB58+YYO3Yszp07Z3eOIAh4++23ERISArVajcGDB+P06dOVts2xTu7CmXG+fv16xMTEoGnTppBIJDh27JhTbXOckzupbKwXFRXhlVdeQZcuXeDl5YWQkBBMnToVV69erbTthjbWGXiT28vLy0O3bt3w5ZdfOrz/hRdewO+//44ffvgBZ86cwQsvvIBnnnkGP//8c7ltZmdnY/jw4QgJCcGhQ4fwxRdf4JNPPsGiRYvEc1JSUjBq1CgMGDAAiYmJeO211/Dss89i3bp1Nf4aiYCKx7ogCBg7diySk5Px888/IzExEeHh4Rg2bBjy8vLKbZNjndzN7t278fTTT+PPP//Etm3bYDQaMWLECLtx/NFHH2HRokX48ssvcejQIQQFBWH48OHIyckpt12OdXInzozzvLw89O/fHwsXLnS6XY5zcjeVjfX8/HwcPXoUb775Jo4ePYr169fjr7/+wv33319huw1yrAtE9QgAYcOGDXbHIiMjhfnz59sd69mzp/DGG2+U287SpUsFjUYjFBYWiscWLFgghISECGazWRAEQZgzZ47QoUMHu8c99dRTQt++fW/zVRBVrvRYP3funABAOHXqlHjMaDQKAQEBwr///e9y2+FYJ3eXkZEhABB2794tCIIgmM1mISgoSFi4cKF4TmFhoaDRaISvvvqq3HY41smdlR7ntlJSUgQAQmJiYqXtcJyTu6torFsdPHhQACBcvny53HMa4lhnxpvqvbvuugubNm3ClStXIAgCdu3ahb/++gsxMTHiObGxsRg8eLD4c0JCAgYNGmS37H9MTAyuXr2KS5cuieeMGDHC7rliYmJw+PBhFBUVufQ1EZWm1+sBACqVSjwmk8mgUCiwd+9e8RjHOtU3Op0OABAQEADAksFIT0+3G5NKpRKDBg3C/v37xWMc61SflB7nzuI4p/rGmbGu0+kgkUjg5+cnHmsMY52BN9V7S5YsQadOnRAaGgqFQoF77rkHS5cuxV133SWeExwcjJYtW4o/p6enIzAw0K4d68/p6ekVnmM0GnHjxg1XvRwihzp06IDw8HDMnTsXmZmZMBgMWLhwIdLT06HVasXzONapPhEEAbNnz8Zdd92Fzp07AygZl47GpPU+gGOd6g9H49xZHOdUnzgz1gsLC/Hqq69i0qRJ8PX1FY83hrHuUdcdILpdS5YswZ9//olNmzYhPDwce/bswcyZMxEcHIxhw4YBsCz8UJpEIrH7WSherMH2uDPnENUGuVyOdevW4bHHHkNAQABkMhmGDRuGkSNH2p3HsU71yaxZs3DixAm7qg0rR2PS9hjHOtUXFY3zynCcU31S2VgvKirCQw89BLPZjKVLl9rd1xjGOgNvqtcKCgrw2muvYcOGDbj33nsBAF27dsWxY8fwySefiIF3aUFBQXaZEwDIyMgAUHI1rbxzPDw80KRJk5p+KUSVioqKwrFjx6DT6WAwGNCsWTP06dMHvXr1KvcxHOvkrp555hls2rQJe/bsQWhoqHg8KCgIgCWTERwcLB7PyMgok9mwxbFO7qi8cV5dHOfkriob60VFRZgwYQJSUlKwc+dOu2y3Iw1xrLPUnOq1oqIiFBUVQSq1H8oymQxms7ncx0VHR2PPnj0wGAzisa1btyIkJAStWrUSz9m2bZvd47Zu3YpevXpBLpfX3IsgqiKNRoNmzZrh/PnzOHz4MMaMGVPuuRzr5G4EQcCsWbOwfv167Ny5ExEREXb3R0REICgoyG5MGgwG7N69G/369Su3XY51cieVjfPq4jgnd+PMWLcG3efPn8f27dudCoob5Fiv7dXciKoqJydHSExMFBITEwUAwqJFi4TExERxJcRBgwYJkZGRwq5du4Tk5GRh5cqVgkqlEpYuXSq28eqrrwpTpkwRf87KyhICAwOFhx9+WDh58qSwfv16wdfXV/jkk0/Ec5KTkwVPT0/hhRdeEJKSkoQVK1YIcrlc+O9//1t7L54alcrG+tq1a4Vdu3YJFy9eFDZu3CiEh4cL48aNs2uDY53c3T//+U9Bo9EI8fHxglarFW/5+fniOQsXLhQ0Go2wfv164eTJk8LDDz8sBAcHC9nZ2eI5HOvkzpwZ5zdv3hQSExOF//3vfwIAYfXq1UJiYqKg1WrFczjOyd1VNtaLioqE+++/XwgNDRWOHTtmd45erxfbaQxjnYE3ub1du3YJAMrcpk2bJgiCIGi1WiE2NlYICQkRVCqV0L59e+HTTz8VtxoQBEGYNm2aMGjQILt2T5w4IQwYMEBQKpVCUFCQ8Pbbb9s9RhAEIT4+XujRo4egUCiEVq1aCcuWLXP1y6VGrLKx/vnnnwuhoaGCXC4XWrZsKbzxxht2/2kJAsc6uT9HYxyAsHLlSvEcs9kszJs3TwgKChKUSqUwcOBA4eTJk3btcKyTO3NmnK9cudLhOfPmzRPP4Tgnd1fZWLdul+fotmvXLrGdxjDWJYJQPAOdiIiIiIiIiGoc53gTERERERERuRADbyIiIiIiIiIXYuBNRERERERE5EIMvImIiIiIiIhciIE3ERERERERkQsx8CYiIiIiIiJyIQbeRERERERERC7EwJuIiIiIiIjIhRh4ExERNTKDBw/G888/X9fdICIiajQYeBMRERERERG5EANvIiKiRiQ2Nha7d+/G559/DolEAolEgsTERDzyyCNo1qwZ1Go12rZti5UrV9Z1V4mIiBoMj7ruABEREdWezz//HH/99Rc6d+6M+fPnAwDeeecdJCUl4bfffkPTpk1x4cIFFBQU1HFPiYiIGg4G3kRERI2IRqOBQqGAp6cngoKCAABXrlxBjx490KtXLwBAq1at6rCHREREDQ9LzYmIiBq5f/7zn1i9ejW6d++OOXPmYP/+/XXdJSIiogaFgTcREVEjN3LkSFy+fBnPP/88rl69iqFDh+Kll16q624RERE1GAy8iYiIGhmFQgGTyWR3rFmzZoiNjcUPP/yAxYsX4+uvv66j3hERETU8nONNRETUyLRq1QoHDhzApUuX4O3tjSVLliAqKgqRkZHQ6/XYvHkzOnbsWNfdJCIiajCY8SYiImpkXnrpJchkMnTq1AnNmjWDQqHA3Llz0bVrVwwcOBAymQyrV6+u624SERE1GBJBEIS67gQRERERERFRQ8WMNxEREREREZELMfAmIiIiIiIiciEG3kREREREREQuxMCbiIiIiIiIyIUYeBMRERERERG5EANvIiIiIiIiIhdi4E1ERERERETkQgy8iYiIiIiIiFyIgTcRERERERGRCzHwJiIiIiIiInIhBt5ERERERERELsTAm4iIiIiIiMiF/h+7kGTIkh8tuQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1200x200 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#| echo: false\n",
"ax = df.tail(300).plot(x='ts', y='y', color = 'navy', title='Time Series', figsize=(12, 2))\n",
"plt.axvspan('2020-02-01 21:00:00', '2020-02-01 21:02:00', color='orchid', alpha=0.3, label='Anomalous Period')\n",
"plt.axvspan('2020-02-01 21:47:00', '2020-02-01 22:11:00', color='orchid', alpha=0.3)\n",
"ax.legend(['Time Series', 'Anomalous Period'])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Detect anomalies in real time\n",
"The `detect_anomalies_online` method detect anomalies in a time series leveraging TimeGPT's forecast power. It uses the forecast error in deciding the anomalous step so you can specify and tune the parameters like that of the `forecast` method. This function will return a dataframe that contains anomaly flags and anomaly score (its absolute value quantifies the abnormality of the value).\n",
"\n",
"To perfom real-time anomaly detection, set the following parameters:\n",
"\n",
"- `df`: A pandas DataFrame containing the time series data.\n",
"- `time_col`: The column that identifies the datestamp.\n",
"- `target_col`: The variable to forecast.\n",
"- `h`: Horizon is the number of steps ahead to make forecast.\n",
"- `freq`: The frequency of the time series in Pandas format.\n",
"- `level`: Percentile of scores distribution at which the threshold is set, controlling how strictly anomalies are flagged. Default at 99%.\n",
"- `detection_size`: The number of steps to analyze for anomaly at the end of time series."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:nixtla.nixtla_client:Validating inputs...\n",
"INFO:nixtla.nixtla_client:Preprocessing dataframes...\n",
"INFO:nixtla.nixtla_client:Calling Online Anomaly Detector Endpoint...\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unique_id</th>\n",
" <th>ts</th>\n",
" <th>y</th>\n",
" <th>TimeGPT</th>\n",
" <th>anomaly</th>\n",
" <th>anomaly_score</th>\n",
" <th>TimeGPT-hi-99</th>\n",
" <th>TimeGPT-lo-99</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>machine-1-1_y_29</td>\n",
" <td>2020-02-01 22:11:00</td>\n",
" <td>0.606017</td>\n",
" <td>0.544625</td>\n",
" <td>True</td>\n",
" <td>18.463266</td>\n",
" <td>0.553161</td>\n",
" <td>0.536090</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>machine-1-1_y_29</td>\n",
" <td>2020-02-01 22:12:00</td>\n",
" <td>0.044413</td>\n",
" <td>0.570869</td>\n",
" <td>True</td>\n",
" <td>-158.933850</td>\n",
" <td>0.579404</td>\n",
" <td>0.562333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>machine-1-1_y_29</td>\n",
" <td>2020-02-01 22:13:00</td>\n",
" <td>0.038682</td>\n",
" <td>0.560303</td>\n",
" <td>True</td>\n",
" <td>-157.474880</td>\n",
" <td>0.568839</td>\n",
" <td>0.551767</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>machine-1-1_y_29</td>\n",
" <td>2020-02-01 22:14:00</td>\n",
" <td>0.024355</td>\n",
" <td>0.521797</td>\n",
" <td>True</td>\n",
" <td>-150.178240</td>\n",
" <td>0.530333</td>\n",
" <td>0.513261</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>machine-1-1_y_29</td>\n",
" <td>2020-02-01 22:15:00</td>\n",
" <td>0.044413</td>\n",
" <td>0.467860</td>\n",
" <td>True</td>\n",
" <td>-127.848560</td>\n",
" <td>0.476396</td>\n",
" <td>0.459325</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unique_id ts y TimeGPT anomaly \\\n",
"95 machine-1-1_y_29 2020-02-01 22:11:00 0.606017 0.544625 True \n",
"96 machine-1-1_y_29 2020-02-01 22:12:00 0.044413 0.570869 True \n",
"97 machine-1-1_y_29 2020-02-01 22:13:00 0.038682 0.560303 True \n",
"98 machine-1-1_y_29 2020-02-01 22:14:00 0.024355 0.521797 True \n",
"99 machine-1-1_y_29 2020-02-01 22:15:00 0.044413 0.467860 True \n",
"\n",
" anomaly_score TimeGPT-hi-99 TimeGPT-lo-99 \n",
"95 18.463266 0.553161 0.536090 \n",
"96 -158.933850 0.579404 0.562333 \n",
"97 -157.474880 0.568839 0.551767 \n",
"98 -150.178240 0.530333 0.513261 \n",
"99 -127.848560 0.476396 0.459325 "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"anomaly_online = nixtla_client.detect_anomalies_online(\n",
" df,\n",
" time_col='ts', \n",
" target_col='y', \n",
" freq='min', # Specify the frequency of the data\n",
" h=10, # Specify the forecast horizon\n",
" level=99, # Set the confidence level for anomaly detection\n",
" detection_size=100 # How many steps you want for analyzing anomalies\n",
")\n",
"anomaly_online.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 📘 In this example, we use a detection size of 100 to illustrate the anomaly detection process. In practice, using a smaller detection size and running the detection more frequently improves granularity and enables more timely identification of anomalies as they occur."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the plot, we observe that both anomalous periods were detected right as they arose. For further methods on improving detection accuracy and customizing anomaly detection, read our other tutorials on online anomaly detection."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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4rWlbt06xgx8IqRzZ0p1YJ988gnFxcVce+21xMfHRz128cUXM2/evDrrNtXl3nvv5dJLL2X06NFMnTqVjz/+mA8//LDBmfKaom/fvnz44Yece+65KIrCI488EpWdVZ/rrruOc845h2AwyNVXX92kbeXl5eHxePB6vXz//fe89dZbkRpksbGx3HPPPdx5551omsZJJ51EWVkZq1atwuFwNHkbTd2fK664gkcffRSfz8ecOXPqXV9MTAw33XQT9957L0lJSfTo0YNnn30Wl8vFtdde26Q+hYVrQN1yyy2UlZUxY8YMsrKyOHDgAG+++SYOh4MXXniBvn378sEHH7Bq1SoSExN58cUXycnJqRUE279/P3fddRc33HAD69ev589//jMvvPBC5PGsrCyWL1/OZZddhsViISUlhcmTJ5Ofn8+zzz7LxRdfzGeffcb//vc/4uLiGuz7FVdcwXPPPcd5553H448/Trdu3cjOzubDDz/k3nvvpVu3btx+++386U9/ol+/fgwaNIgXX3wxEmg7llXPvBd95UkpK0OpDLTadsOZUi6Xn/JyH3FxnWtaWSGEEKI+hYWHTUBSpbWPzSIkXHS7rTKl0qoypfKaEZQ6lFc9855iULB0sWLpYiVYEcB7wIPX6Y3OnkoxY+lmxZTSPtlT1iw71p42vDleNJeGaq8astdIXwLlgUhBbWuvzpU52LVrHHCwQ8zAJzp7plQHNm/ePE477bRaASmAiy66iI0bN7J+/fomrev888/npZde4rnnnmPIkCG8+uqrLFiwgMmTJx9VH+fMmUNiYiITJ07k3HPPZdq0aYwePbrR55122mlkZmYybdo0unTp0qRtDRgwgMzMTPr27cv999/PDTfcwJ///OfI40888QS///3vefrppxk0aBDTpk3j448/plevXi2+P5dccgmFhYW4XC7OP//8Btf5pz/9iYsuuoirrrqK0aNHs3PnTj7//POooZdNdfPNN/PFF19w8OBBLrjgAgYOHMh1111HXFxcpLj5I488wujRo5k2bRqTJ08mIyOjzj7OmDEDt9vNCSecwO9+9ztuvfVWrr/++sjjjz/+OHv37qVPnz6RIXaDBg3ib3/7G3/9618ZMWIE33//fVRR9frY7XaWL19Ojx49uPDCCxk0aBDXXHMNbrc7EtC6++67mTFjBjNnzmTChAnExsZywQUX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d999x/PPP8+UKVMi65g1a1YkGHP//fczYcIEHnnkEaZNmwbA7bffzqxZsyLtR4wYwYgRIyL3//jHP7J48WL+85//RAVjwr788ks2bdrEnj176N69OwBvvfUWQ4YM4YcffmDcuHGNvh5Op5NAIMCFF15Iz549ARg2bFijzwurrKxk9uzZGAwGTj31VF555RVGjx7NU089FWkzf/58unfvzi+//EL//v0B6Nu3L88++2y963377bdxu928+eabxMSEDnp/+ctfOPfcc3nmmWdIT09n7ty5zJ49m4suugiAv//973z++edN7rs4dgQCGsXFodldap34Kgp6t+5oFi+0chHN5GQ7JpMBvz9IXl4lXbrEtur2hBBCiI6qosKHzxcaQlZr9r02PDZ3RsHKqnpSVgOK2j6vb7imVF4DNaVywplSEpTqNMJBqQMHpKZUe+r0mVId2fbt2/n++++57LLLADAajUyfPp358+fXajt8+PDI75mZmQDk5eUBsHXrViZNmhTVftKkSWzdurXedaSnpwPRAZ/09HQ8Hg9lZaFIcmVlJffddx+DBw8mISEBh8PBtm3b6s2U2rp1K927d48EpIDIcw/vS31GjBjB1KlTGTZsGJdccgmvvfYaxcXFjT5v4sSJOBwOYmNj+fjjj1m4cCHDhg1j3bp1fPPNNzgcjsht4MCBAFFDFceOHdvg+rdu3cqIESMiASkIvcaaprF9+3ZKS0txOp1MmDAh8rjRaGx0veLYVFTkRtd1DAaVhITDphS2WNBf+gvue54Hs6VV+6GqCunpof9JmYFPCCFEZxbOknI4zFgsh12Xb8Njc2ekudtv5r2w9JSGM6XcHj/FpaELihKU6jyqg1JlUlalHUmmVAc2b948AoEAXbt2jSzTdR2TyURxcTGJiYmR5SaTKfJ7eApTTdNqLau5nsOX1bWOhtZ777338vnnn/P888/Tt29fbDYbF198MT6fr879qWubhy9XVbXWB4Lf74/8bjAYWLJkCatWreKLL77gz3/+Mw899BBr1qxpsGj5okWLIgGw5OTkyHJN0yLZTIcLB/eAqGBTc/YNar/24vhXPbuPDbWdrgiGZWY6OHCgTIJSQgghOjUZutd+gu088x5U15QqKfPi9QWwmKO/BoezpBwxJmJjzG3eP9E+MjNjURQFt9tPcbGHpCRb408SLe6IwtV/+9vf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gNC8EN0SFM/4v6YUERHRqBmj32YiSh1JaStPAfJXF6L/XB/0Hg1KlgrbVDu88tWRtwjsY9TLmIs47dy5U5hMJrFjxw7R0NAgVq9eLTIyMkRjY6MQQoh169aJb33rW0b5s2fPCrvdLtasWSMaGhrEjh07hMlkErt37zbKvPPOO0JRFLFp0ybx8ccfi02bNglVVcW7774b83Y1NzcLAJw4ceLEiRMnTpw4ceLEiRMnTpxSYGpubh42lxP3NaWWL1+O9vZ2bNiwAS0tLZg1axb279+PiooKAEBLSwvOnx+40vzUqVOxf/9+rFmzBs8++yxKS0vx9NNP47777jPKzJs3Dzt37sTPfvYzPPLII5g+fTp27dqFW265JebtKi0tRXNzM7Kysoa9FhXRULq7uzF58mQ0Nzfz7o005hhvlCiMNUokxhslEuONEoWxRok0nuJNCIGenh6UlpYOW04SIlpfKqLxL9bbVRKNBsYbJQpjjRKJ8UaJxHijRGGsUSJdjfEW14XOiYiIiIiIiIiIRgOTUkRERERERERElHBMShHBdzfHmpqakDs6Eo0VxhslCmONEonxRonEeKNEYaxRIl2N8cZrShERERERERERUcKxpxQRERERERERESUck1JERERERERERJRwTEoREREREREREVHCMSlFREREREREREQJx6QUpaRt27Zh6tSpsFqtqKysxNtvvx3y/N69e3HXXXehoKAAkiThxIkTUZf5m9/8BgsWLEBeXh7y8vJwxx134L333ot73cNpb2/HpEmTIEkSOjs7jfmNjY2QJClsevPNN2NeNo2dZMXbW2+9hbvvvhulpaWQJAmvv/56TNt7/vx53H333cjIyEBBQQF+8IMfwO12h5Q5deoUqqqqYLPZUFZWhg0bNoD3tUi+dIu1hx9+GJWVlbBYLLjhhhvCnmfdltrSKd7a29vx1a9+FaWlpbBYLJg8eTKqq6vR3d0dUo51W2pKp1gLxnZbekpWvG3cuBFf/vKXkZWVhcLCQtx77704ffp01GWz3Zbe0i3e0rHtxqQUpZxdu3Zh9erV+OlPf4r6+nosWLAAixcvxvnz540yDocD8+fPx6ZNm2Je7pEjR7BixQocPnwYx48fR3l5ORYtWoQLFy7Ete7hPPDAA5g9e3bE5w8ePIiWlhZjuv3222PefhobyYw3h8OB66+/Hr/61a9iXq6u61iyZAkcDgeOHTuGnTt3Ys+ePfjhD39olOnu7sadd96J0tJS/OUvf8EzzzyDLVu2YOvWrTGvh0ZfusUaAAghcP/992P58uXDlmPdlnrSLd5kWcbSpUvxxhtv4NNPP8ULL7yAgwcPYuXKlUYZ1m2pKd1iLRjbbeknmfF29OhRrFq1Cu+++y7q6uqgaRoWLVoEh8MRcblst6W3dIs3IE3bboIoxdx8881i5cqVIfNmzJgh1q1bF1b23LlzAoCor6+Pez2apomsrCzx4osvjmjdg23btk1UVVWJP/3pTwKA6OjoGJXtpLGVzHgLBkC89tprUZezf/9+IcuyuHDhgjHvlVdeERaLRXR1dQkhfLGYk5MjnE6nUWbjxo2itLRUeL3euLedRke6xVqwmpoacf3114/qdtLYSud4C3jqqafEpEmTjP9Zt6WmdI01ttvSU6rEmxBCtLa2CgDi6NGjEcuw3Zbe0i3egqVT2409pSiluN1uvP/++1i0aFHI/EWLFuHPf/7zqK6rr68PHo8H+fn5ca370UcfxZQpU0LKNDQ0YMOGDfj9738PWY78tbrnnntQWFiI+fPnY/fu3aO3MzQiyYy3WA2Ot+PHj2PWrFkoLS015t11111wuVx4//33jTJVVVWwWCwhZS5evIjGxsYr2g8amXSMtXiwbkst4yHeLl68iL1796KqqsqYx7ot9aRrrLHdlp5SLd66uroAIKQM223jRzrGWzxSqX5jUopSSltbG3RdR1FRUcj8oqIiXLp0aVTXtW7dOpSVleGOO+6Ia90FBQWYPn268b/L5cKKFSuwefNmlJeXD7muzMxMbN26Fbt378b+/fuxcOFCLF++HC+//PKo7hPFJ5nxFqvB8Xbp0qWw7c3Ly4PZbDa2eagygf9He78oNukYa7Fg3Zaa0jneVqxYAbvdjrKyMmRnZ+O3v/2t8RzrttSTjrHGdlv6SqV4E0Jg7dq1uPXWWzFr1ixjPttt40c6xlssUrF+U5O2ZqJhSJIU8r8QImzelXjiiSfwyiuv4MiRI7BarXGtu7q6GtXV1cb/69evx8yZM/HNb34z4voKCgqwZs0a4/85c+ago6MDTzzxxLCvo8RIZrxFMzjegPDtBcK3eah9ivRaSpx0i7VoWLeltnSMtyeffBI1NTU4ffo0fvKTn2Dt2rXYtm2b8TzrttSUTrHGdlv6S4V4q66uxsmTJ3Hs2LGw+Wy3jS/pFm/RpGL9xp5SlFIKCgqgKEpY9rm1tTUsSz1SW7ZswS9+8QscOHAg5OKWI133oUOH8Oqrr0JVVaiqioULFxrLq6mpifi6r3zlKzhz5swV7g1diWTG20gVFxeHbW9HRwc8Ho+xzUOVaW1tBYBR2y+KTzrG2kixbku+dI634uJizJgxA0uXLsVzzz2H7du3o6WlxXiOdVtqScdYY7stfaVKvH3/+9/HG2+8gcOHD2PSpEnDLo/ttvSVjvE2Usmu35iUopRiNptRWVmJurq6kPl1dXWYN2/eFS9/8+bNeOyxx/Dmm29izpw5o7LuPXv24MMPP8SJEydw4sQJY6jB22+/jVWrVkV8XX19PUpKSq5gb+hKJTPeRmru3Ln461//ahykAcCBAwdgsVhQWVlplHnrrbdCbjd84MABlJaWjnjcOV2ZdIy1kWLdlnzjJd4CPQVcLhcA1m2pKB1jje229JXseBNCoLq6Gnv37sWhQ4cwderUqMtkuy19pWO8jVTS67dEX1mdKJqdO3cKk8kkduzYIRoaGsTq1atFRkaGaGxsNMq0t7eL+vp6sW/fPgFA7Ny5U9TX14uWlpaIy/3lL38pzGaz2L17t2hpaTGmnp6euNb9zDPPiNtvvz3ieg4fPhx2F5cXXnhB/OEPfxANDQ3ik08+EZs3bxYmk0ls3bp1hO8SjZZkxltPT4+or68X9fX1AoDYunWrqK+vF01NTUaZwfGmaZqYNWuWWLhwofjggw/EwYMHxaRJk0R1dbVRprOzUxQVFYkVK1aIU6dOib1794rs7GyxZcuW0XrbaATSLdaEEOLMmTOivr5efPe73xVf+MIXjGW4XC4hBOu2VJZu8bZv3z7xu9/9Tpw6dUqcO3dO7Nu3T1x33XVi/vz5RhnWbakp3WJtMLbb0ksy4+2hhx4SOTk54siRIyFl+vr6jDJst40v6RZvQqRn241JKUpJzz77rKioqBBms1ncdNNNYbe+fP755wWAsKmmpibiMisqKmJ6TbR119TUiIqKiojridS4mTlzprDb7SIrK0tUVlaKl156Kda3g8ZYsuItECuDp29/+9tGmaHirampSSxZskTYbDaRn58vqqurQ24jLIQQJ0+eFAsWLBAWi0UUFxeLRx99lLcVTgHpFmtVVVVDvu7cuXNCCNZtqS6d4u3QoUNi7ty5IicnR1itVnHttdeKH//4xyG/pUKwbktV6RRrg7Hdln6SFW9DPQ9APP/880YZttvGn3SLt3Rsu0lC+PtGExERERERERERJQivKUVERERERERERAnHpBQRERERERERESUck1JERERERERERJRwTEoREREREREREVHCMSlFREREREREREQJx6QUERERERERERElHJNSRERERERERESUcExKERERERERERFRwjEpRURERERERERECcekFBERERERERERJRyTUkRERERERERElHBMShERERERERERUcL9f0cv5/ZjWf9tAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 1200x200 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#| echo: false\n",
"plt.figure(figsize=(12, 2))\n",
"plt.plot(anomaly_online['ts'], anomaly_online['y'], label='y', color='navy', alpha=0.8)\n",
"plt.plot(anomaly_online['ts'], anomaly_online['TimeGPT'], label='TimeGPT', color='orchid', alpha=0.7)\n",
"plt.scatter(anomaly_online.loc[anomaly_online['anomaly'], 'ts'], anomaly_online.loc[anomaly_online['anomaly'], 'y'], color='orchid', label='Anomalies Detected')\n",
"for t in ['2020-02-01 21:00:00', '2020-02-01 21:47:00']:\n",
" plt.axvline(pd.to_datetime(t), color='red', linestyle='--', alpha=0.7, label='Anomaly Behavior Captured' if t == '2020-02-01 21:00:00' else None)\n",
"\n",
"plt.axvspan('2020-02-01 21:00:00', '2020-02-01 21:02:00', color='orchid', alpha=0.3, label='Anomalous Period')\n",
"plt.axvspan('2020-02-01 21:47:00', '2020-02-01 22:11:00', color='orchid', alpha=0.3)\n",
"plt.legend()\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For an in-depth analysis of the `detect_anomalies_online` method, refer to the tutorial (coming soon)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# AzureAI \n",
"\n",
"> The foundational models for time series by Nixtla can be deployed on your Azure subscription. This page explains how to easily get started with TimeGEN-1 deployed as an Azure AI endpoint. If you use the `nixtla` library, it should be a drop-in replacement where you only need to change the client parameters (endpoint URL, API key, model name)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Deploying TimeGEN-1\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using the model\n",
"\n",
"Once your model is deployed and provided that you have the relevant permissions, consuming it will basically be the same process as for a Nixtla endpoint.\n",
"\n",
"To run the examples below, you will need to define the following environment variables:\n",
"\n",
"- `AZURE_AI_NIXTLA_BASE_URL` is your api URL, should be of the form `https://your-endpoint.inference.ai.azure.com/`.\n",
"- `AZURE_AI_NIXTLA_API_KEY` is your authentication key."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## How to use"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Just import the library, set your credentials, and start forecasting in two lines of code!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```bash\n",
"pip install nixtla\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```python\n",
"import os\n",
"from nixtla import NixtlaClient\n",
"\n",
"base_url = os.environ[\"AZURE_AI_NIXTLA_BASE_URL\"]\n",
"api_key = os.environ[\"AZURE_AI_NIXTLA_API_KEY\"]\n",
"model = \"azureai\"\n",
"\n",
"nixtla_client = NixtlaClient(api_key=api_key, base_url=base_url)\n",
"nixtla_client.forecast(\n",
" ...,\n",
" model=model,\n",
")\n",
"```"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# About TimeGPT\n",
"\n",
"TimeGPT is a production-ready generative pretrained transformer for time series. It's capable of accurately predicting various domains such as retail, electricity, finance, and IoT with just a few lines of code.\n",
"\n",
"It is user-friendly and low-code. Users can simply upload their time series data and generate forecasts or detect anomalies with just a single line of code.\n",
"\n",
"TimeGPT is the only out of-the-box foundation model for time series that can be used through our public APIs, through [Azure Studio as TimeGEN-1](https://techcommunity.microsoft.com/t5/ai-machine-learning-blog/announcing-timegen-1-in-azure-ai-leap-forward-in-time-series/ba-p/4140446) or on your own infrastructure.\n",
"\n",
"Get started! [Activate your free trial](https://dashboard.nixtla.io/freetrial) and see our [Quickstart Guide](https://docs.nixtla.io/docs/getting-started-timegpt_quickstart).\n",
"\n",
"## Features and capabilities\n",
"\n",
"* **[Zero-shot Inference](https://docs.nixtla.io/docs/capabilities-forecast-quickstart)**: TimeGPT can generate forecasts and detect anomalies straight out of the box, requiring no prior training data. This allows for immediate deployment and quick insights from any time series data.\n",
"\n",
"* **[Fine-tuning](https://docs.nixtla.io/docs/tutorials-fine_tuning)**: Enhance TimeGPT's capabilities by fine-tuning the model on your specific datasets, enabling the model to adapt to the nuances of your unique time series data and improving performance on tailored tasks.\n",
"\n",
"* **[API Access](https://dashboard.nixtla.io/sign_in)**: Integrate TimeGPT seamlessly into your applications via our robust API (obtain an API key through our [Dashboard](https://dashboard.nixtla.io/sign_in)). TimeGPT is also supported through [Azure Studio](https://docs.nixtla.io/docs/deployment-azureai) for even more flexible integration options. Alternatively, deploy TimeGPT on your own infrastructure to maintain full control over your data and workflows.\n",
"\n",
"* **[Add Exogenous Variables](https://docs.nixtla.io/docs/tutorials-exogenous_variables)**: Incorporate additional variables that might influence your predictions to enhance forecast accuracy. (E.g. Special Dates, events or prices)\n",
"\n",
"* **[Multiple Series Forecasting](https://docs.nixtla.io/docs/tutorials-multiple_series_forecasting)**: Simultaneously forecast multiple time series data, optimizing workflows and resources.\n",
"\n",
"* **[Specific Loss Function](https://docs.nixtla.io/docs/tutorials-fine_tuning_with_a_specific_loss_function)**: Tailor the fine-tuning process by choosing from many loss functions to meet specific performance metrics.\n",
"\n",
"* **[Cross-validation](https://docs.nixtla.io/docs/tutorials-cross_validation)**: Implement out of the box cross-validation techniques to ensure model robustness and generalizability.\n",
"\n",
"* **[Prediction Intervals](https://docs.nixtla.io/docs/tutorials-prediction_intervals)**: Provide intervals in your predictions to quantify uncertainty effectively.\n",
"\n",
"* **[Irregular Timestamps](https://docs.nixtla.io/docs/capabilities-forecast-irregular_timestamps)**: Handle data with irregular timestamps, accommodating non-uniform interval series without preprocessing.\n",
"\n",
"* **[Anomaly Detection](https://docs.nixtla.io/docs/tutorials-anomaly_detection)**: Automatically detect anomalies in time series, and use exogenous features for enhanced performance."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Get started with our [QuickStart guide](https://docs.nixtla.io/docs/getting-started-timegpt_quickstart), walk through tutorials on the different capabilities, and learn from real-world use cases in our documentation.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Architecture\n",
"\n",
"Self-attention, the revolutionary concept introduced by the paper [Attention is all you need](https://arxiv.org/abs/1706.03762), is the basis of this foundation model. TimeGPT model is not based on any existing large language model(LLM). Instead, it is independently trained on a vast amount of time series data, and the large transformer model is designed to minimize the forecasting error.\n",
"\n",
"<img src=\"https://github.com/Nixtla/nixtla/blob/main/nbs/img/timegpt_archi.png?raw=true\" />\n",
"\n",
"The architecture consists of an encoder-decoder structure with multiple layers, each with residual connections and layer normalization. Finally, a linear layer maps the decoder’s output to the forecasting window dimension. The general intuition is that attention-based mechanisms are able to capture the diversity of past events and correctly extrapolate potential future distributions."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To make prediction, TimeGPT \"reads\" the input series much like the way humans read a sentence – from left to right. It looks at windows of past data, which we can think of as \"tokens\", and predicts what comes next. This prediction is based on patterns the model identifies in past data and extrapolates into the future."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Explore examples and use cases"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Visit our comprehensive documentation to explore a wide range of examples and practical use cases for TimeGPT. Whether you're getting started with our [Quickstart Guide](https://docs.nixtla.io/docs/getting-started-timegpt_quickstart), [setting up your API key](https://docs.nixtla.io/docs/getting-started-setting_up_your_api_key), or looking for advanced forecasting techniques, our resources are designed to guide you through every step of the process. \n",
"\n",
"Learn how to handle [anomaly detection](https://docs.nixtla.io/docs/capabilities-anomaly-detection-quickstart), [fine-tune models](https://docs.nixtla.io/docs/tutorials-fine_tuning_with_a_specific_loss_function) with specific loss functions, and scale your computing using frameworks like [Spark](https://docs.nixtla.io/docs/tutorials-spark), [Dask](https://docs.nixtla.io/docs/tutorials-dask), and [Ray](https://docs.nixtla.io/docs/tutorials-ray). \n",
"\n",
"Additionally, our documentation covers specialized topics such as handling [exogenous variables](https://docs.nixtla.io/docs/tutorials-exogenous_variables), validating models through [cross-validation](https://docs.nixtla.io/docs/tutorials-cross_validation), and forecasting under uncertainty with [quantile forecasts](https://docs.nixtla.io/docs/tutorials-quantile_forecasts) and [prediction intervals](https://docs.nixtla.io/docs/tutorials-prediction_intervals). \n",
"\n",
"For those interested in real-world applications, discover how TimeGPT can be used for [forecasting web traffic](https://docs.nixtla.io/docs/use-cases-forecasting_web_traffic) or [predicting Bitcoin prices](https://docs.nixtla.io/docs/use-cases-bitcoin_price_prediction)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "18102cea",
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"!pip install -Uqq nixtla"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a50470ae",
"metadata": {},
"outputs": [],
"source": [
"#| hide \n",
"from nixtla.utils import in_colab"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ace35684",
"metadata": {},
"outputs": [],
"source": [
"#| hide \n",
"IN_COLAB = in_colab()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b1ea1aa8",
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"if not IN_COLAB:\n",
" from nixtla.utils import colab_badge\n",
" from dotenv import load_dotenv"
]
},
{
"cell_type": "markdown",
"id": "6ecd9d32-9178-4768-bffa-d70c93c98311",
"metadata": {},
"source": [
"# TimeGEN-1 Quickstart (Azure)\n",
"\n",
"> TimeGEN-1 is TimeGPT optimized for the Azure infrastructure. It is a production ready, generative pretrained transformer for time series. It's capable of accurately predicting various domains such as retail, electricity, finance, and IoT with just a few lines of code 🚀."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2c48909a",
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"[![](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Nixtla/nixtla/blob/main/nbs/docs/getting-started/22_azure_quickstart.ipynb)"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#| echo: false\n",
"if not IN_COLAB:\n",
" load_dotenv()\n",
" colab_badge('docs/getting-started/22_azure_quickstart')"
]
},
{
"cell_type": "markdown",
"id": "7e5b10a6-b39c-4583-bc2c-ab0b70eeea28",
"metadata": {},
"source": [
"## Step 1: Set up a TimeGEN-1 endpoint account and generate your API key on Azure\n",
"\n",
"* Go to [ml.azure.com](https://ml.azure.com/)\n",
"* Sign in or create an account at Microsoft\n",
"* Click on 'Models' in the sidebar\n",
"* Search for 'TimeGEN' in the model catalog\n",
"* Select TimeGEN-1\n",
"\n",
"![Azure Model Catalog landing page. Search for forecast and TimeGEN-1 comes up as the only option.](https://github.com/Nixtla/nixtla/blob/main/nbs/img/azure-model-catalog.png?raw=true)"
]
},
{
"cell_type": "markdown",
"id": "aa3705dd-6133-4eb0-8c53-8a8ff65ee455",
"metadata": {},
"source": [
"* Click 'Deploy' and this will create an Endpoint\n",
"\n",
"![TimeGEN-1 in the model catalog. Cursor is on the Deploy button indicating what to select to deploy TimeGEN-1.](https://github.com/Nixtla/nixtla/blob/main/nbs/img/azure-deploy.png?raw=true)"
]
},
{
"cell_type": "markdown",
"id": "a2ca7c90",
"metadata": {},
"source": [
"* Go to 'Endpoint' in the sidebar and you will see your TimeGEN-1 endpoint there\n",
"* In that Endpoint are the base URL and API Key you will use\n",
"\n",
"![Endpoint is highlighted in the side panel. The main panel shows the endpoint and API key for the TimeGEN-1 endpoint, with buttons where you can copy the information.](https://github.com/Nixtla/nixtla/blob/main/nbs/img/azure-endpoint.png?raw=true)"
]
},
{
"cell_type": "markdown",
"id": "5f30be1a-3eaf-4133-8254-680e8f7cda72",
"metadata": {},
"source": [
"## Step 2: Install Nixtla"
]
},
{
"cell_type": "markdown",
"id": "73ad0fc4-bcf1-4b7e-8e6c-5969982e1b78",
"metadata": {},
"source": [
"In your favorite Python development environment:"
]
},
{
"cell_type": "markdown",
"id": "d9c35e70",
"metadata": {},
"source": [
"Install `nixtla` with `pip`:\n",
" \n",
"```shell\n",
"pip install nixtla\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "03e24b4f-6b8c-4ffa-82c6-f5b889fdd423",
"metadata": {},
"source": [
"## Step 3: Import the Nixtla TimeGPT client"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9d984aea-1315-4d4e-8b4d-b23efe947be1",
"metadata": {},
"outputs": [],
"source": [
"from nixtla import NixtlaClient"
]
},
{
"cell_type": "markdown",
"id": "8b73a131-390e-46b9-847b-173f7d3c869a",
"metadata": {},
"source": [
"You can instantiate the `NixtlaClient` class providing your authentication API key. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f1098659-f250-4663-b588-f9e17065cafa",
"metadata": {},
"outputs": [],
"source": [
"nixtla_client = NixtlaClient(\n",
" base_url = \"YOUR_BASE_URL\",\n",
" api_key = \"YOUR_API_KEY\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e5b8ea7f-e30e-4001-a7a6-9e935e12180a",
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"if not IN_COLAB:\n",
" nixtla_client = NixtlaClient()"
]
},
{
"cell_type": "markdown",
"id": "8ca0d1f7-9730-4146-b6f3-596099ce6e3b",
"metadata": {},
"source": [
"## Step 4: Start making forecasts!\n",
"\n",
"Now you can start making forecasts! Let's import an example using the classic `AirPassengers` dataset. This dataset contains the monthly number of airline passengers in Australia between 1949 and 1960. First, load the dataset and plot it:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "687802f2-be84-4b81-95eb-44798c591daf",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fded6ec5-949a-44b8-9a4a-8fc8a5295e06",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timestamp</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1949-01-01</td>\n",
" <td>112</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1949-02-01</td>\n",
" <td>118</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1949-03-01</td>\n",
" <td>132</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1949-04-01</td>\n",
" <td>129</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1949-05-01</td>\n",
" <td>121</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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"
}
],
"source": [
"df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/air_passengers.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6242b73d-fd43-41be-b4db-123cf7cd5b11",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABr4AAAFpCAYAAADKjVj9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADQJUlEQVR4nOzdd1zV5fvH8ddhgwIiDkQcqAgouPfeK3dqpaU2bWd7l/UrbWta2U6zHOXInXsrDpyooLkVcKGggIzD+f1xhOLrYpzDYbyfjweP79dzPp/7fh9UwnNxXbfBZDKZEBERERERERERERERESni7GwdQERERERERERERERERMQSVPgSERERERERERERERGRYkGFLxERERERERERERERESkWVPgSERERERERERERERGRYkGFLxERERERERERERERESkWVPgSERERERERERERERGRYkGFLxERERERERERERERESkWVPgSERERERERERERERGRYkGFLxERERERERERERERESkWVPgSERERERGLmDJlCgaDgePHj9s6So4ZDAbGjBlzx+ss+drGjh3LX3/9le91bmfSpEkEBQXh7OyMv78/7733HmlpaVbdU0REREREpDBQ4UtERERERCzirrvuYsuWLVSqVMnWUXJsy5YtPPLIIwW6p7ULXx9++CHPPfccAwcOZNmyZTz55JOMHTuWp556ymp7ioiIiIiIFBYOtg4gIiIiIiLFQ/ny5SlfvrytY+RKixYtbB3Boi5evMgHH3zAo48+ytixYwHo0KEDaWlpvPXWW4wePZo6derYOKWIiIiIiIj1qONLRERERKSEGjlyJNWrV7/h8TFjxmAwGLJ+bTAYePrpp5k2bRrBwcG4ublRv359Fi1alO2+m40DNJlMfPLJJ1SrVg0XFxcaNWrE0qVL6dChAx06dLjtvQBr167FYDCwdu3abI+vXLmSzp074+HhgZubG61bt2bVqlW5/hzcbNRhWFgYrVu3xsXFBV9fX15//XWLjQk0GAwkJiYydepUDAYDBoMh6/OQlJTESy+9hL+/Py4uLpQtW5YmTZowY8aMHK//999/c+3aNR588MFsjz/44IOYTCarj1gUERERERGxNXV8iYiIiIjIHS1evJjt27fz/vvvU7p0aT755BMGDBhAVFQUNWrUuOV97733Hu+99x4PP/wwgwYN4tSpUzz66KMYjUYCAwPzlOW3335j+PDh9OvXj6lTp+Lo6Mh3331H9+7dWbZsGZ07d87ry+TAgQN07tyZ6tWrM2XKFNzc3Pjmm2+YPn36DddmZGSQkZFxxzUNBgP29vaAebRip06d6NixI2+//TYAHh4eALzwwgtMmzaNDz74gIYNG5KYmEhERAQXL17Mcf6IiAgAQkNDsz1eqVIlypUrl/W8iIiIiIhIcaXCl4iIiIiI3FFycjIrV67E3d0dgEaNGuHr68sff/zBa6+9dtN7Ll++zMcff8yAAQP48ccfsx6vW7curVu3zlPhKykpieeee47evXszb968rMd79epFo0aNeOONN9i6dWuu1830/vvvYzKZWL16NRUrVgTMZ5eFhITccO1DDz3E1KlT77hm+/btszrWWrRogZ2dHeXLl79hzOKmTZvo1q0bzz//fNZjd911V67yX7x4EWdnZ0qVKnXDc2XLls1VEU1ERERERKQoUuFLRERERETuqGPHjllFL4CKFStSoUIFTpw4cct7tmzZwrVr1xg2bFi2x1u1akW1atXylGPz5s3ExcUxYsQI0tPTsz3Xo0cPPvnkExITE29a+MmJNWvW0Llz56yiF4C9vT333HMP7733XrZrx4wZw9NPP33HNf/7ebudZs2a8fvvv/Paa6/Ro0cPmjdvjqura+5eAGQbU5mb50RERERERIoDFb5EREREROSOvL29b3jM2dmZ5OTkW96T2V3k4+Nzw3M3eywnzp49C8CgQYNueU1cXFyeC18XL17Mcd6qVavi5+d3xzVzWmyaOHEifn5+zJo1i48//hgXFxe6d+/Op59+SkBAQI7W8Pb25tq1ayQlJeHm5pbtubi4OBo3bpyjdURERERERIoqO1sHEBERERER23BxcSElJeWGxy9cuGCR9TOLZbGxsTc897+Pubi4ANyQ53+zlCtXDoBJkyaxffv2m378t1srL5lzkhfMow4dHR3v+JHTM8dKlSrFe++9R2RkJLGxsUyePJmwsDD69OmT4/yZZ3vt27fvhvwXLly46chGERERERGR4kQdXyIiIiIiJVT16tU5d+4cZ8+ezSoWpaamsmzZMous36JFC1xcXPj999+5++67sx7fvHkzJ06coHr16tmyAOzduzfb2V8LFizItmbr1q0pU6YMBw4cyNGYwdzq2LEjCxYsyPY5MRqNzJo164Zr8zrq8E6dcmAeJTly5Ej27NnDhAkTbtrBdTM9evTAxcWFKVOm0Lx586zHp0yZgsFgoH///ndcQ0REREREpChT4UtEREREpIS65557eOedd7j33nt5+eWXuXbtGhMnTsRoNFpkfS8vL1566SU++OADHnnkEQYPHsypU6cYM2bMDaMDmzZtSmBgIC+99BLp6el4eXkxb948Nm7cmO260qVLM2nSJEaMGEFcXByDBg2iQoUKnD9/nj179nD+/HkmT56c58xvvfUWCxYsoFOnTrzzzju4ubnx9ddfk5iYeMO11atXz1a8y6nQ0FDWrl3LwoULqVSpEu7u7gQGBtK8eXN69+5NvXr18PLy4uDBg0ybNo2WLVvmqOgFULZsWd566y3efvttypYtS7du3di+fTtjxozhkUceoU6dOrnOKyIiIiIiUpRo1KGIiIiISAnl7+/P/PnzuXz5MoMGDeLll19m8ODBDB8+3GJ7vP/++4wbN47ly5fTt29fJk2axLfffputqwvA3t6ehQsXEhQUxOOPP87w4cNxdnbmq6++umHN+++/nzVr1nD16lVGjRpFly5deO6559i5c2eOxwreSkhICCtXrsTDw4MRI0bw2GOPUa9ePd5+++18rftfX375JQEBAdx77700bdqUUaNGAdCpUycWLFjAgw8+SLdu3fjkk08YPnw4CxcuzNX6b775JhMmTGD27Nl069aNSZMm8dprr/H1119b7DWIiIiIiIgUVgaTyWSydQgRERERESlZOnToAMDatWttmkNERERERMTSTCYT6enpFpumIeYflnRwcMBgMNzxWo06FBERERERERERERERsYDU1FRiYmJISkqydZRix83NjUqVKuHk5HTb61T4EhERERGRYic9Pf22z9vZ2WFnV3Qmv5tMpjv+tKi9vX2OfvpRRERERESsIyMjg2PHjmFvb4+vry9OTk76Ht0CTCYTqampnD9/nmPHjhEQEHDbf89p1KGIiIiIiBQrx48fx9/f/7bXvPvuu4wZM6ZgAlnA2rVr6dix422v+eWXXxg5cmTBBBIRERERkRtcu3aNY8eOUa1aNdzc3Gwdp9hJSkrixIkT+Pv74+Licsvr1PElIiIiIiLFiq+vL9u3b7/jNUVJ48aN7/ia7lTsExERERGRglGUpksUJTn9vKrwJSIiIiIixYqTkxNNmjSxdQyLcnd3L3avSURERERExBpUdhQREREREREREREREZFiQR1fmA+ci46Oxt3dXQfNiYiIiIiIiIiIiIgUEyaTiStXruDr66sRhFZUvXp1Ro8ezejRo20dRYUvgOjoaKpUqWLrGCIiIiIiIiIiIiIiYgWnTp3Cz8/P1jGkAKjwhXlePpj/4Ht4eNg4jYiIiIiIiIiIiIiIWEJCQgJVqlTJqgNI8afCF2SNN/Tw8FDhS0RERERERERERESkmLHFMUcmk4lr19IKfF8AFxfHHL/m7777jvfff59Tp05lGwfZt29fvLy8eOedd3jhhRcICwsjMTGR4OBgxo0bR5cuXW663vHjx/H392fXrl00aNAAgMuXL+Pl5cWaNWvo0KEDAAcOHOCll15i/fr1lCpVim7dujF+/HjKlSuXr9euwpeIiIiIiIiIiIiIiIiFXbuWRueuY2yy96oVY3B1dcrRtYMHD+bZZ59lzZo1dO7cGYBLly6xbNkyFi5cyNWrV+nVqxcffPABLi4uTJ06lT59+hAVFUXVqlXzlC8mJob27dvz6KOP8sUXX5CcnMyrr77KkCFDWL16dZ7WzKTCl4iIiIiIiIiIiIiISAlVtmxZevTowfTp07MKX3/++Sdly5alc+fO2NvbU79+/azrP/jgA+bNm8eCBQt4+umn87Tn5MmTadSoEWPHjs167Oeff6ZKlSocOnSI2rVr5/n1qPAlIiIiIiIiIiIiIiJiYS4ujqxaMcZme+fGsGHDeOyxx/jmm29wdnbm999/595778Xe3p7ExETee+89Fi1aRHR0NOnp6SQnJ3Py5Mk85wsPD2fNmjWULl36hueOHDmiwpeIiIiIiIiIiIiIiEhhYjAYcjxu0Nb69OlDRkYGixcvpmnTpmzYsIEvvvgCgJdffplly5bx2WefUatWLVxdXRk0aBCpqak3XSvznDCTyZT1WFpa9rPOMjIy6NOnDx9//PEN91eqVClfr0WFLxERERERERERERERkRLM1dWVgQMH8vvvv/PPP/9Qu3ZtGjduDMCGDRsYOXIkAwYMAODq1ascP378lmuVL18eMJ/j1bBhQwB2796d7ZpGjRoxZ84cqlevjoODZUtVdhZdTURERERERERERERERIqcYcOGsXjxYn7++Wfuv//+rMdr1arF3Llz2b17N3v27GHo0KFkZGTcch1XV1datGjBRx99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d3fPumb8+PE4ODgwZMgQkpOT6dy5M1OmTMHe3t4WL0tERERERERERESkRMjs+AoNqZar+4KDMju+TmMymTAYDBbPJiIlk8FkMplsHcLWEhIS8PT0JD4+Xud9iYiIiIiIiIiIiORA3KWr9O4zFoC/l7yNh4drju9NTzfSpdt7pKamM2vGC1SpUs5aMaWE0/v/JY9Nz/gSERERERERERERkaJp//5TAPhXr5CroheAg4M9AbUqAXDw4GmLZxORkkuFLxERERERERERERHJtX37TgAQElo1T/cHB5vHHR6M1DlfImI5KnyJiIiIiIiIiIiISK5F7L9+vlfdPBa+gvwAdXyJiGWp8CUiIiIiIiIiIiIiuZKebuTAAXPBKu8dX+bC16HD0aSnGy2WTURKNhW+RERERERERERERCRXDh2OITU1HQ8PV6pWKZenNapWLYebmzPXrqVx4sR5CycUkZJKhS8RERERERERERERyZWICPOYw7p1q2Jnl7e3me3s7AgK9AU07lBELEeFLxERERERERERERHJlX0RJwAIDcnbmMNMQZnnfEWq8CUilqHCl4iIiIiIiIiIiIjkSsQ+c8dXSD4LX8FBlQE4ePBMvjOJiIAKXyIiIiIiIiIiIiKSC+fOxXP2XDx2dgbqBPvla63g6/f/cySW1NR0S8QTkRJOhS8RERERERERERERybHM871q1aqEm5tzvtaqVMkLT0830tON/PNPjCXiiUgJp8KXiIiIiIiIiIiIFEn7959i85YoW8cocfbtvz7msG6VfK9lMBgIzjrnS+MORST/HGwdQERERERERERERCQ3jh07y+Rvl7FxUyQAP37/BHXq5L8IIzmTeb5XaGg1i6wXHFyZsK2HOBh52iLriUjJpsKXiIiIiIiIiIiIFAnnz8fz40+rWLwknIwMU9bju3cfV+GrgKSkpBF1KBqAkLpVLbJmVsfXQRW+RCT/VPgSERERERERERGRQu3q1Wv89vt6Zv2xiZSUNADat6uDl1dp/pq/jQMHT9k4YckRFRVNerqRsmVL4+vrZZE1g4IqA3DixHmSklLyfW6YiJRsKnyJiIiIiIiIiIhIoZSWls7ceVuZMnUN8fFJANQLrcZTT/YgNLQa4TuPXC98qVOooOyLOAFAaEhVDAaDRdYsV86D8uU9OH8+gahD0TRs4G+RdUWkZFLhS0RERERE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bNGixW1xzZw5k4CAAI4cOUJoaGja6wMGDKBBgwYA9O7dm7Zt27JhwwaqV68OQOfOnW/b6wxuLvE4a9Ys3NzcKF26NB9++CHvvvsuo0aNwt5e73MUEREREZGcR4UvERERERF5aKVLl76tsJI3b97bijgODg74+flx+fJlAPbt28fJkyfx9PS87TpJSUm3LfuXntzc3NKKXrdiLFy48G37leXNmzctxt9//x3DMChWrNht10lOTsbPzw+Ad955h7fffpt169bx/PPP06JFC8qWLXvPOE6dOsXQoUPZtWsXUVFRaTO9zp49e9vn7J/XyZs3L0Bage3fsd5Srlw53Nzc0j5+5plniI+P59y5cxQqVOiecYmIiIiIiGRHKnyJiIiIiMhDc3Jyuu1jOzu7O752q8hjsVioWLEiCxYs+M+18uTJk2lidHBwYN++fTg4ONzW7lax7M0336RBgwasWrWKdevWMWbMGL744gt69ep11zgaN25McHAwM2bMICgoCIvFQmho6H+WePxnbLdmxf37tX8vj3g3t84XERERERHJaVT4EhERERGRDPfUU0+xePFiAgIC8PLyeqxrOTs7Yzab0ymy/6lQoQJms5nLly/z7LPP3rVdcHBw2h5mgwYNYsaMGfTq1QtnZ2eA22K7evUqR48eZfr06WnX3L59e7rF/Mcff5CYmIirqysAu3btwsPDgwIFCqTbPURERERERLISLfouIiIiIiIZrn379vj7+/Pyyy+zbds2wsPD2bJlC7179yYiIuKhrlW4cGF2797N6dOnb1s68HEVK1aM9u3b06FDB5YvX054eDh79uxh7NixrF69GoA+ffqwdu1awsPD+f3339m4cSMlS5YEoFChQtjZ2fHTTz9x5coV4uPjyZ07N35+fnz99decPHmSjRs30q9fv3SJFyAlJYXOnTtz5MgR1qxZw/Dhw+nZs6f29xIRERERkRxLvw2JiIiIiEiGc3NzY+vWrRQsWJDmzZtTsmRJOnXqRGJi4kPPABswYAAODg6UKlWKPHnycPbs2XSLc/bs2XTo0IH+/ftTvHhxmjRpwu7duwkODgZuzubq0aMHJUuWpGHDhhQvXpwpU6YAkD9/fkaOHMn7779P3rx50wpQYWFh7Nu3j9DQUPr27ctnn32WbvHWrVuXkJAQnnvuOVq1akXjxo0ZMWJEul1fREREREQkq7EzDMOwdRAiIiIiIiL/tnnzZmrXrk10dDQ+Pj62DifT6dixIzExMaxcufK+be3s7FixYgVNmzbN8LhERERERERsSTO+REREREQkUytQoABt27a1dRhZUrdu3fDw8LB1GCIiIiIiIlajGV8iIiIiIpIpJSYmcv78eQA8PDwIDAy0cUSZy4PM+Lp8+TJxcXEA5MuXD3d3dytFJyIiIiIiYhsqfImIiIiIiIiIiIiIiEi2oKUORUREREREREREREREJFtQ4UtERERERERERERERESyBRW+REREREREREREREREJFtQ4UtERERERERERERERESyBRW+REREREREREREREREJFtQ4UtERERERERERERERESyBRW+REREREREREREREREJFtQ4UtERERERERERERERESyhf8D8lFkQfydhrEAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1600x350 with 1 Axes>"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nixtla_client.plot(df, time_col='timestamp', target_col='value')"
]
},
{
"cell_type": "markdown",
"id": "defa26b8",
"metadata": {},
"source": [
"> 📘 Data Requirements\n",
">\n",
"> * Make sure the target variable column does not have missing or non-numeric values.\n",
"> * Do not include gaps/jumps in the datestamps (for the given frequency) between the first and late datestamps. The forecast function will not impute missing dates.\n",
"> * The format of the datestamp column should be readable by Pandas (see [this link](https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html) for more details).\n",
">\n",
">For further details go to [Data Requirements](https://docs.nixtla.io/docs/getting-started-data_requirements)."
]
},
{
"cell_type": "markdown",
"id": "19581d85",
"metadata": {},
"source": [
"> 👍 Save figures made with TimeGEN\n",
"> \n",
"> The `plot` method automatically displays figures when in a notebook environment. To save figures locally, you can do:\n",
"> \n",
"> `fig = nixtla_client.plot(df, time_col='timestamp', target_col='value')`\n",
">\n",
">`fig.savefig('plot.png', bbox_inches='tight')`"
]
},
{
"cell_type": "markdown",
"id": "7631f17b-0ca4-4cf1-9b89-182a7d85fda6",
"metadata": {},
"source": [
"### Make forecasts"
]
},
{
"cell_type": "markdown",
"id": "5c4790e3",
"metadata": {},
"source": [
"Next, forecast the next 12 months using the SDK `forecast` method. Set the following parameters:\n",
"\n",
"- `df`: A pandas DataFrame containing the time series data.\n",
"- `h`: Horizons is the number of steps ahead to forecast.\n",
"- `freq`: The frequency of the time series in Pandas format. See [pandas’ available frequencies](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases). (If you don't provide any frequency, the SDK will try to infer it)\n",
"- `time_col`: The column that identifies the datestamp.\n",
"- `target_col`: The variable to forecast.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "793011c6-6845-410f-b6b1-3bdb87b41ce6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:nixtla.nixtla_client:Validating inputs...\n",
"INFO:nixtla.nixtla_client:Preprocessing dataframes...\n",
"INFO:nixtla.nixtla_client:Restricting input...\n",
"INFO:nixtla.nixtla_client:Calling Forecast Endpoint...\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timestamp</th>\n",
" <th>TimeGPT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1961-01-01</td>\n",
" <td>437.837921</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1961-02-01</td>\n",
" <td>426.062714</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1961-03-01</td>\n",
" <td>463.116547</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1961-04-01</td>\n",
" <td>478.244507</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1961-05-01</td>\n",
" <td>505.646484</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" timestamp TimeGPT\n",
"0 1961-01-01 437.837921\n",
"1 1961-02-01 426.062714\n",
"2 1961-03-01 463.116547\n",
"3 1961-04-01 478.244507\n",
"4 1961-05-01 505.646484"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#| eval: false\n",
"\n",
"timegen_fcst_df = nixtla_client.forecast(df=df, h=12, freq='MS', time_col='timestamp', target_col='value')\n",
"timegen_fcst_df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "638329d2-2d1b-49dd-8df7-1926f7d9b36b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAACHgAAAFhCAYAAAABCY9wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADyoElEQVR4nOzdd3hUddrG8e9kkkx6A9JoofcSelN6UUEpVkDB3pV11bWu6CqWtWNfCyiiWABFpPfee+gQegik10kyM+8fIXkNRVJmcpJwf64rlzJzzu93D5mchMwzz2NyOBwORERERERERERERERERERERKTCcjM6gIiIiIiIiIiIiIiIiIiIiIj8PRV4iIiIiIiIiIiIiIiIiIiIiFRwKvAQERERERERERERERERERERqeBU4CEiIiIiIiIiIiIiIiIiIiJSwanAQ0RERERERERERERERERERKSCU4GHiIiIiIiIiIiIiIiIiIiISAWnAg8RERERERERERERERERERGRCk4FHiIiIiIiIiIiIiIiIiIiIiIVnAo8RERERERERERERERERERERCo4FXiIiIiIiIhIlTFp0iRMJhOxsbFGRyk2k8nE+PHjL3ucMx/bhAkTmDlzZpnX+TsTJ06kadOmWCwW6tWrx8svv0xubq5L9xQRERERERERqcpU4CEiIiIiIiJVxnXXXceaNWuIiIgwOkqxrVmzhnvuuadc93R1gcdrr73G448/zvDhw5k3bx4PPfQQEyZM4OGHH3bZniIiIiIiIiIiVZ270QFEREREREREnKVGjRrUqFHD6Bgl0qVLF6MjOFVCQgKvvvoq9957LxMmTACgV69e5Obm8sILLzBu3DiaN29ucEoRERERERERkcpHHTxERERERETEMGPHjiUqKuqC28ePH4/JZCr8s8lk4pFHHuG7776jWbNm+Pj40KZNG/74448i511sjInD4eCtt96ibt26eHl50a5dO+bMmUOvXr3o1avX354LsHTpUkwmE0uXLi1y+8KFC+nbty8BAQH4+PjQvXt3Fi1aVOK/g4uNaFm7di3du3fHy8uLyMhInn32WaeNNzGZTGRkZDB58mRMJhMmk6nw7yEzM5Mnn3ySevXq4eXlRUhICB06dOCHH34o9vpz584lOzubO++8s8jtd955Jw6Hw+WjYUREREREREREqip18BAREREREZFKYfbs2WzYsIFXXnkFPz8/3nrrLYYNG8bevXupX7/+Jc97+eWXefnll7n77ru58cYbOXbsGPfeey82m40mTZqUKsuUKVO44447uOGGG5g8eTIeHh58/vnnDBw4kHnz5tG3b9/SPkxiYmLo27cvUVFRTJo0CR8fHz755BOmTp16wbF2ux273X7ZNU0mE2azGcgfCdOnTx969+7Niy++CEBAQAAATzzxBN999x2vvvoq0dHRZGRksHPnThISEoqdf+fOnQC0atWqyO0RERFUr1698H4RERERERERESkZFXiIiIiIiIhIpZCVlcXChQvx9/cHoF27dkRGRvLTTz/xzDPPXPSc5ORk3nzzTYYNG8aXX35ZeHuLFi3o3r17qQo8MjMzefzxxxk8eDAzZswovP3aa6+lXbt2PPfcc6xbt67E6xZ45ZVXcDgcLF68mLCwMACuu+46WrZsecGxd911F5MnT77smj179izsQNKlSxfc3NyoUaPGBeNhVq1axYABA/jHP/5ReNt1111XovwJCQlYLBZ8fX0vuC8kJKRExSIiIiIiIiIiIvL/VOAhIiIiIiIilULv3r0LizsAwsLCCA0N5ciRI5c8Z82aNWRnZzNq1Kgit3fr1o26deuWKsfq1atJTExkzJgx5OXlFblv0KBBvPXWW2RkZFy0wKE4lixZQt++fQuLOwDMZjO33HILL7/8cpFjx48fzyOPPHLZNf/69/Z3OnXqxPfff88zzzzDoEGD6Ny5M97e3iV7AFBkvE5J7hMRERERERERkUtTgYeIiIiIiIhUCtWqVbvgNovFQlZW1iXPKegWER4efsF9F7utOE6fPg3AjTfeeMljEhMTS13gkZCQUOy8derUoVatWpdds7hFFR9++CG1atVi2rRpvPnmm3h5eTFw4ED++9//0qhRo2KtUa1aNbKzs8nMzMTHx6fIfYmJibRv375Y64iIiIiIiIiISFFuRgcQERERERGRK5eXlxdWq/WC28+ePeuU9QuKQuLi4i647/zbvLy8AC7Ic36W6tWrAzBx4kQ2bNhw0Y+/dt8oTebi5IX8ES0eHh6X/ejbt2+x9vb19eXll19mz549xMXF8emnn7J27VqGDBlS7PytWrUCYMeOHRfkP3v27EVHzYiIiIiIiIiIyOWpg4eIiIiIiIgYJioqivj4eE6fPl1YFJGTk8O8efOcsn6XLl3w8vLi+++/Z8SIEYW3r169miNHjhAVFVUkC8D27dtp0qRJ4e2///57kTW7d+9OUFAQMTExxRqPUlK9e/fm999/L/J3YrPZmDZt2gXHlnZEy+U6n0D+CJyxY8eybds23n///Yt25LiYQYMG4eXlxaRJk+jcuXPh7ZMmTcJkMjF06NDLriEiIiIiIiIiIhdSgYeIiIiIiIgY5pZbbuHf//43t956K0899RTZ2dl8+OGH2Gw2p6wfHBzMk08+yauvvso999zDTTfdxLFjxxg/fvwFI086duxIkyZNePLJJ8nLyyM4OJgZM2awcuXKIsf5+fkxceJExowZQ2JiIjfeeCOhoaGcOXOGbdu2cebMGT799NNSZ37hhRf4/fff6dOnD//+97/x8fHh448/JiMj44Jjo6KiihSpFFerVq1YunQps2bNIiIiAn9/f5o0aULnzp0ZPHgwrVu3Jjg4mN27d/Pdd9/RtWvXYhV3AISEhPDCCy/w4osvEhISwoABA9iwYQPjx4/nnnvuoXnz5iXOKyIiIiIiIiIiGtEiIiIiIiIiBqpXrx6//fYbycnJ3HjjjTz11FPcdNNN3HHHHU7b45VXXuH1119n/vz5XH/99UycOJHPPvusSJcOALPZzKxZs2jatCkPPPAAd9xxBxaLhY8++uiCNUePHs2SJUtIT0/n/vvvp1+/fjz++ONs3ry52ONQLqVly5YsXLiQgIAAxowZw3333Ufr1q158cUXy7TuX33wwQc0atSIW2+9lY4dO3L//fcD0KdPH37//XfuvPNOBgwYwFtvvcUdd9zBrFmzSrT+888/z/vvv88vv/zCgAEDmDhxIs888wwff/yx0x6DiIiIiIiIiMiVxuRwOBxGhxAREREREREpb7169QJg6dKlhuYQEREREREREREpDnXwEBEREREREREREREREREREang3I0OICIiIiIiIlIV5eXl/e39bm5uuLlVnvddOBwObDbb3x5jNpsxmUzllEhERERERERE5MpSeX6TJCIiIiIiIuJES5cuddl4ltjYWDw8PP7245VXXnHJ3q6ybNmyyz6myZMnGx1TRERERERERKTKMjkcDofRIURERERERESqkpycHLZv3/63x0RGRhIZGVlOicouLS2NvXv3/u0x9erVo1q1auWUSERERERERETkyqICDxEREREREREREREREREREZEKTiNaRERERERERERERERERERERCo4d6MDVAR2u52TJ0/i7++PyWQyOo6IiIiIiIiIiIiIiIiIiNM4HA7S0tKIjIzEzU09AEQqKxV4ACdPnqR27dpGxxARERERERERERERERERcZljx45Rq1Yto2OISCmpwAPw9/cH8i9oAQEBBqcRqTpyc3OZP38+AwYMwMPDw+g4IlIB6LogIufTdUFEzqfrgoicT9cFEfkrXRNE5Hy6LhRPamoqtWvXLnxdVEQqJxV4QOFYloCAABV4iDhRbm4uPj4+BAQE6IcqEQF0XRCRC+m6ICLn03VBRM6n64KI/JWuCSJyPl0XSqbgdVERqZw0YElERERERERERERERERERESkglOBh4iIiIiIiIiIiIiIiIiIiEgFpwIPERERERERERERERERERERkQpOBR4iIiIiIiIiIiIiIiIiIiIiFZwKPEREREREREREREREREREREQqOBV4iIiIiIiIiIiIiIiIiIiIiFRwKvAQERERERERERERERERERERqeBU4CEiIiIiIiIiIiIiIiIiIiJSwbkbHUBERERERERERERERERESsaWlUdKTCImsxvuPmbM3u7//+HljslsMjqiiIg4mQo8RERERERERERERERERCqZpK1nSduTdMn73SxmzN7/X/jh7uOOf9NgPPw9yzGliIg4kwo8RERERERERERERERERCoRh8NB5tE0AHxq++Fw5Hf0KPjAAXarDbvVRm5yTuF5uam5hPWtZVRsEREpIxV4iIiIiIiIiIiIiIiIiFQiOQnZ2DLzMLm7Edq7JiazW+F9DocDu9WGLctWWPCRk2QlZUcC2aczcTgcmEwa3yIiUhmpwENERERERERERERERESkEino3uFd07dIcQeAyWTC7OWO2csdgi0AOGwOUmMS8zt6pOTgGWQp98wiIlJ2bpc/REREREREREREREREREQqisyj6QD41PEv1vEmswlLDW8AsuMyXZZLRERcSwUeIiIiIiIiIiIiIiIiIpVEbloOOUlWMIFPbb9in+cV7gNAdrwKPEREKisVeIiIiIiIiIiIiIiIiIhUEgXdO7zCfDBbzMU+zys0v4OH9XSWS3KJiIjrqcBDREREREREREREREREpJLIPJYGgE+d4nfvALCE+oAJ8tJzyUvPdUU0ERFxMRV4iIiIiIiIiIiIiIiIVBLp6dm88+7vLFu2y+goYgCb1UZ2XP6IFZ/a/iU6183DDc9qXoDGtIiIVFYq8BAREREREREREREREakkZv2xkV+nr+XZ57/nuRe+JzExzehIUo6yjqeDAzyCLHgEeJb4fK9QHwCyT6vAQ0SkMlKBh4iIiIiIiIiIiIiISCWxfv3+wv9funQXI0e/z9x5W3A4HAamkvKSebR041kKeIV5A5Adl+W0TCIiUn5U4CEiIiIiIiIiIiIiIlIJWK25bN0WC8BL/76Zxo0jSU3N4pX//MxT//qW+PgUYwOKSzlsdjJPZADgU6dk41kKeIXld/DITbZis9qclk1ERMqHCjxEREREREREREREREQqgR07jmC15lK9egAD+rfhyy8e5P77BuDhYWb16r2Muv19fp+1Qd08qqisuEwcuXbM3u5YqnuVag2zt3vhaBdrvMa0iIhUNirwEBERERERERERERERqQTWbzgAQKeODTGZTLi7mxlzRy8mff0ILZrXJiPDyhtvzmDcP77h1Kkkg9OKs2UeTQfAp7YfJpOp1OtYNKZFRKTSUoGHiIiIiIiIiIiIiIhIJVBQ4NGxY8Mit9erF8Znn97Po49ci6enOxs2HmD0HR/wy69rsNvtRkQVJ3M4HGQeTQPAp45fmdYqGNOSrQ4eIiKVjuEFHidOnGD06NFUq1YNHx8f2rZty6ZNmwrvdzgcjB8/nsjISLy9venVqxe7du0qsobVauXRRx+levXq+Pr6cv3113P8+PHyfigiIiIiIiIiIiIiIiIukZSUzr59JwHo2KHBBfebzW7cdmsPvpv8GG3bRpGVlcO7783i4Ue/5OTJxPKOK06Wk5CNLTMPk7sJrwjfMq1VUOBhPZuFPU8FQCIilYmhBR5JSUl0794dDw8P5syZQ0xMDO+88w5BQUGFx7z11lu8++67fPTRR2zYsIHw8HD69+9PWlpa4THjxo1jxowZ/Pjjj6xcuZL09HQGDx6MzWYz4FGJiIiIiIiIiIiIiIg418ZNBwFo1DCCkBD/Sx5Xu3Z1PvrwHv75xPX4eHuybVssL708rbxiiotkHssfz+Jd0w8397K9vOfu74HZ2x3sYD2b7Yx4IiJSTtyN3PzNN9+kdu3afPPNN4W3RUVFFf6/w+Hg/fff5/nnn2f48OEATJ48mbCwMKZOncr9999PSkoKX331Fd999x39+vUDYMqUKdSuXZuFCxcycODAcn1MIiIiIiIiIiIiIiIizrZ+/cXHs1yMm5sbI4Z3oUOHBtw28j1iYo6TmppJQICPq2OKixSOZ6ldtvEsACaTCa8wbzJi07CezsQ7XM8LEZHKwtACj99//52BAwdy0003sWzZMmrWrMlDDz3EvffeC8Dhw4eJi4tjwIABhedYLBZ69uzJ6tWruf/++9m0aRO5ublFjomMjKRly5asXr36ogUeVqsVq9Va+OfU1FQAcnNzyc3NddXDFbniFHw96etKRArouiAi59N1QUTOp+uCiJxP1wUR+asr9ZrgcDhYv2E/AO3a1Sv244+MCKJu3RocOXKGjZsOcFWPZq6MKS6Sl55LTqIVTOAR7uWU579HdQvEppF5KgPf5oFOSGmcK/W6UFL6+xGpGgwt8Dh06BCffvopTzzxBM899xzr16/nsccew2KxcMcddxAXFwdAWFhYkfPCwsI4cuQIAHFxcXh6ehIcHHzBMQXnn+/111/n5ZdfvuD2+fPn4+OjKkURZ1uwYIHREUSkgtF1QUTOp+uCiJxP1wUROZ+uCyLyV1faNeFsQhZnzqRiNps4eWI3f8bvLfa5IcEmjhyBmTOXkpZ62IUpxVWqZQdRk1DSzZnMWzzPKWt65VloTF0yT6Xx5+w/weSUZQ11pV0XSiozM9PoCCLiBIYWeNjtdjp06MCECRMAiI6OZteuXXz66afccccdhceZTEW/qzgcjgtuO9/fHfPss8/yxBNPFP45NTWV2rVrM2DAAAICAkr7cETkPLm5uSxYsID+/fvj4eFhdBwRqQB0XRCR8+m6ICLn03VBRM6n64KI/NWVek345de1wHbatq3HDTcMLtG5Xl472bL1Z5JT4Nprr3VNQHGpMwtPYM3Mombr2jRt3topazrsDk7+fBhzLvTr2hfPEItT1jXClXpdKKmCiQYiUrkZWuARERFB8+bNi9zWrFkzfv31VwDCw8OB/C4dERERhcfEx8cXdvUIDw8nJyeHpKSkIl084uPj6dat20X3tVgsWCwXfqPy8PDQhV/EBfS1JSLn03VBRM6n64KInE/XBRE5n64LIvJXV9o1YfPm/M4bXTo3LvHj7tChIQAHD54mKyuPgABvp+cT17FZbVhPZwHgHxXk1Oe9V6g3WScyyEvIwTfMz2nrGuVKuy6UlP5uRKoGNyM37969O3v3Fm0jtm/fPurWrQtAvXr1CA8PL9JSKScnh2XLlhUWb7Rv3x4PD48ix5w6dYqdO3dessBDRERERERERERERESkMsjNzWPzlkMAdOzYsMTnV6vmT926NXA4HGzbHuvkdOJqWSfSwQEegZ54BHo6dW2vMB8ArKc1ukNEpLIwtMDjH//4B2vXrmXChAkcOHCAqVOn8sUXX/Dwww8D+aNZxo0bx4QJE5gxYwY7d+5k7Nix+Pj4MHLkSAACAwO5++67+ec//8miRYvYsmULo0ePplWrVvTr18/IhyciIiIiIiIiIiIiIlImO3cdIysrh+BgXxo2CC/VGtFt6wEUFopI5ZF5NB0Anzr+Tl/bcq7AI/t0Jg6Hw+nri4iI8xk6oqVjx47MmDGDZ599lldeeYV69erx/vvvM2rUqMJjnn76abKysnjooYdISkqic+fOzJ8/H3////9G9t577+Hu7s7NN99MVlYWffv2ZdKkSZjNZiMeloiIiIiIiIiIiIiIiFOsX78fgI4dGuLmVrr37UZH12Pmb+vZsuWwM6OJizlsDjKPu7DAo7oXuJmwZdnIS8vFI8C5HUJERMT5DC3wABg8eDCDBw++5P0mk4nx48czfvz4Sx7j5eXFxIkTmThxogsSioiIiIiIiIiIiIiIGGPDhgNA6cazFCjo4LF//ynS0rLw9/d2SjZxrezTmThy7Zi9zVhqeDl9fTd3NyzVvbDGZ5F9OlMFHiIilYChI1pERERERERERERERETk4lJTM9m95wQAncpQ4FG9egB1alfH4XCwbVusk9KJq2UeTQPAu7Y/JpPJJXt4/WVMi4iIVHwq8BAREREREREREREREamANm46iMPhoF5UKDVqBJZprejo/C4emzWmpVJwOBxknCvw8K3t57J9vMLyu7lkn85y2R4iIuI8KvAQERERERERERERERGpgArGs3Tq1KjMa0VH1wdg61YVeFQGOYlWbBl5mNxNeEX6umwfS2h+B4+81BxsWXku20dERJxDBR4iIiIiIiIiIiIiIiIVjMPhYP25Ao+OZRjPUqCgg8e+/SdJS1O3hoqucDxLpC9u7q57Oc9sMeMRbAE0pkVEpDJQgYeIiIiIiIiIiIiIiEgFc+JEIqdOJeHubia6bb0yr1ejegC1a1XDbnewffsRJyQUVyoo8PCp4+/yvbzC8rt4qMBDRKTiU4GHiIiIiIiIiIiIiIhIBbNu/X4AWreqg7e3p1PWLBjTsnnLIaesJ66Rl55LTqIVTOBT28/l+3mFeQOQfVqdXUREKjoVeIiIiIiIiIiIiIiIiFQwGwrHszRy2poFY1q2bD3stDXF+TKP5XfvsIR6Y/Zyd/l+BR08chKzsefaXL6fiIiUngo8REREREREREREREREKpC8PBubNh8EoFOnhk5bt2DUy759J0lPz3bauuJcmUfTAfCp7frxLADuvh64+3mAA6zx6uIhIlKRqcBDRERERERERERERESkAtm9+zgZGVYCArxp3CjSaeuGhgZSq1Y17HYH27bHOm1dcR57jo2suAwAfOu4fjxLgYIuHhrTIiJSsanAQ0REREREREREREREpAJZf248S4f2DTCbnftSTkEXj60a01IhZRxJAzt4BHriEWgpt30tYd4AZJ/OLLc9RUSk5FTgISIiIiIiIiIiIiIiUoGs37AfgE6dGjl97ejo/AKPzVtU4FERpe5JAsCvUVC57lvQwcN6JguHzVGue4uISPGpwENEREREREREREREpIo4cSKRd9+fxc23vsOyZbuMjiOlkJ6eTUzMcQA6dmzo9PULOnjs3XuCjIxsp68vpWc9m0XO2WxwM+HfKLBc9/YI9MTNYsZhc2BN0PNCRKSicjc6gIiIiIiIiIiIiIiIlM2uXceY+sMKli3fhd2e/+77H39aRc+eLQxOJiW1afMhbDY7dWpXJyI82Onrh4UFERkZwsmTiWzffoSuXZs4fQ8pnYLuHb71/DF7le9LeCaTCa8wbzKPppN9OhOvUO9y3V9ERIpHHTxERERERERERERERCohm83OsmW7eODBz7n3/k9ZsnQndrujsEPDrl3HyM7OMTillNSGc+NZXNG9o0A7jWmpcGxWGxmHUgEIaOr8wp7iKBzTcjrTkP1FROTy1MFDRERERERERERERKQSyc7O4c85m/lx2iqOH08AwN3dzMABbbn11u7UrxfG8BFvcTo+hR07jrq0UECcb8OGA4BrCzyio+vzx+xNbNlyyGV7SMmkH0jGYXPgGWLBUsOY7hmWcwUe2fFZOBwOTCaTITlEROTSVOAhIiIiIiIiIiIiIlIJJCam8cuva5kxcx0pKfnvsPf392bY0M7cOKIL1asHFB7brl195szdwqbNh1TgUYmcOpXEseMJmM1utG9X32X7FHR5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MSmzFnjs3r2bypUrJ37fu3dvANq2bcvMmTPp378/Dx8+5KOPPuLOnTuULFmS1atXkyFDhsRzxo4di5WVFU2aNOHhw4dUrVqVmTNnYmlpmerXIyIiIiIiIiIiIiIiIiIiIpISzFrgUalSJYxG4zMfNxgMDB06lKFDhz6zjZ2dHT/++CM//vhjCiQUERERERERERERERERERERMT8LcwcQERERERERERERERERERERkedTgYeIiIiIiIiIiIiIiIiIiIhIGqcCDxEREREREREREREREREREZE0zsrcAdICo9EIQEREhJmTiLxZYmNjiYyMJCIiAmtra3PHEZE0QPOCiDxO84KIPE7zgog8TvOCiPyb5gQReZzmhRfzz33Qf+6LisjrSQUewL179wDw8/MzcxIRERERERERERERERERkZRx7949XFxczB1DRF6SwagyLRISErh69SoZMmTAYDCYO47IGyMiIgI/Pz8uXbqEs7OzueOISBqgeUFEHqd5QUQep3lBRB6neUFE/k1zgog8TvPCizEajdy7dw9vb28sLCzMHUdEXpJW8AAsLCzw9fU1dwyRN5azs7NeVIlIEpoXRORxmhdE5HGaF0TkcZoXROTfNCeIyOM0L/w3rdwh8vpTeZaIiIiIiIiIiIiIiIiIiIhIGqcCDxEREREREREREREREREREZE0TgUeIpJibG1tGTJkCLa2tuaOIiJphOYFEXmc5gUReZzmBRF5nOYFEfk3zQki8jjNCyKSnhiMRqPR3CFERERERERERERERERERERE5Nm0goeIiIiIiIiIiIiIiIiIiIhIGqcCDxEREREREREREREREREREZE0TgUeIiIiIiIiIiIiIiIiIiIiImmcCjxERERERERERERERERERERE0jgVeIjIc23evJm6devi7e2NwWBg2bJlSR6/du0a7dq1w9vbGwcHB2rWrMmpU6eStKlUqRIGgyHJV7NmzZK0uXPnDq1bt8bFxQUXFxdat25NeHh4Cl+diLyM1JgXzp8/T8eOHcmePTv29vbkzJmTIUOGEBMTkxqXKCLJlFqvF/4RHR1NkSJFMBgM7N+/P4WuSkReRWrOC3///TclS5bE3t6eTJky0bBhw5S8NBF5Sak1L5w8eZL69euTKVMmnJ2dKVu2LBs2bEjpyxORZDLFnAAQHBxMlSpVcHR0xNXVlUqV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L126NPfv3+fSpUtkzZr1ublEREREREREROTFqcBDREREREREXkvW1tZJvjcYDE899k8xQ0JCAsWKFeO33357oq/MmTOnmYyWlpbs2bMHS0vLJO3+KQr54IMPqFGjBn///TerV69mxIgRfP/993Tv3v2ZOerWrYufnx9TpkzB29ubhIQEChYs+MTWNP/O9s8qJ48fe3xbl2f553wRERERERERETENFXiIiIiIiIhIulC0aFEWLFiAh4cHzs7Or9SXjY0N8fHxJkr2/wICAoiPj+f69euUL1/+me38/Pzo2rUrXbt2ZcCAAUyZMoXu3btjY2MDkCTbrVu3OHbsGJMnT07sc+vWrSbLfODAAR4+fIi9vT0AO3bswMnJCV9fX5ONISIiIiIiIiIioM1wRUREREREJF1o2bIlmTJlon79+mzZsoVz586xadMmevToweXLl5PVV7Zs2di5cyfnz59PsuXJq8qTJw8tW7akTZs2/P7775w7d46QkBBGjRrFihUrAOjZsyerVq3i3Llz7N27l/Xr15M/f34AsmbNisFgYPny5dy4cYP79+/j5uZGxowZ+eWXXzh9+jTr16+nd+/eJskLEBMTQ8eOHTl69CgrV65kyJAhfPzxx0m2zxERERERERERkVend1tEREREREQkXXBwcGDz5s34+/vTsGFD8ufPT4cOHXj48GGyV/To27cvlpaWFChQgMyZM3Px4kWT5ZwxYwZt2rShT58+5M2bl3r16rFz5078/PyAR6tzdOvWjfz581OzZk3y5s3Lzz//DICPjw/Dhg3js88+w9PTM7HQYv78+ezZs4eCBQvSq1cvvv32W5PlrVq1Krlz56ZChQo0adKEunXrMnToUJP1LyIiIiIiIiIijxiMRqPR3CFERERERERE0qKNGzdSuXJl7ty5g6urq7njpDnt2rUjPDycZcuW/Wdbg8HA0qVLadCgQYrnEhERERERERF5E2kFDxEREREREZH/4OvrS/Pmzc0d47XUtWtXnJyczB1DREREREREROS1pxU8RERERERERJ7h4cOHXLlyBQAnJye8vLzMnChteZEVPK5fv05ERAQAWbJkwdHRMZXSiYiIiIiIiIi8WVTgISIiIiIiIiIiIiIiIiIiIpLGaYsWERERERERERERERERERERkTROBR4iIiIiIiIiIiIiIiIiIiIiaZwKPERERERERERERERERERERETSOBV4iIiIiIiIiIiIiIiIiIiIiKRxKvAQERERERERERERERERERERSeNU4CEiIiIiIiIiIiIiIiIiIiKSxqnAQ0RERERERERERERERERERCSNU4GHiIiIiIiIiIiIiIiIiIiISBqnAg8RERERERERERERERERERGRNO7/AMako+sIb7wgAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 2400x350 with 1 Axes>"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#| eval: false\n",
"\n",
"nixtla_client.plot(df, timegen_fcst_df, time_col='timestamp', target_col='value')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Setting up your API key"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This tutorial will explain how to set up your API key when using the Nixtla SDK. To create an `Api Key` go to your [Dashboard](https://dashboard.nixtla.io/)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are different ways to set up your API key. We provide some examples below. A scematic is given below.\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"https://github.com/Nixtla/nixtla/blob/main/nbs/img/api_key_process.png?raw=true\" alt=\"Diagram of the API Key configuration process. Method 1. Unsecure. Copy API key from Nixtla dashboard. 2. Paste API Key in Python code. 3. Validate API key. Method 2. Secure. One method, temporary. Open terminal. Set environment variable. Validate API key. Another method, permanent. Create .env File. Set API Key in file. Validate API Key.\" />"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Copy and paste your key directly into your Python code\n",
"\n",
"This approach is straightforward and best for quick tests or scripts that won’t be shared.\n",
"\n",
"\n",
"- **Step 1**: Copy the API key found in the `API Keys` of your [Nixtla dashboard](https://dashboard.nixtla.io/). \n",
"- **Step 2**: Paste the key directly into your Python code, by instantiating the `NixtlaClient` with your API key:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from nixtla import NixtlaClient \n",
"nixtla_client = NixtlaClient(api_key ='your API key here')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"::: {.callout-important}\n",
"This approach is considered unsecure, as your API key will be part of your source code.\n",
"::: "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Secure: using an environment variable"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- **Step 1**: Store your API key in an environment variable named `NIXTLA_API_KEY`. This can be done (a) temporarily for a session or (b) permanently, depending on your preference.\n",
"- **Step 2**: When you instantiate the `NixtlaClient` class, the SDK will automatically look for the `NIXTLA_API_KEY` environment variable and use it to authenticate your requests."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"::: {.callout-important}\n",
"The environment variable must be named exactly `NIXTLA_API_KEY`, with all capital letters and no deviations in spelling, for the SDK to recognize it.\n",
"::: "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### a. Temporary: From the Terminal\n",
"\n",
"This approach is useful if you are working from a terminal, and need a temporary solution. \n",
"\n",
"#### Linux / Mac\n",
"Open a terminal and use the `export` command to set `NIXTLA_API_KEY`. \n",
"\n",
"``` bash\n",
"export NIXTLA_API_KEY=your_api_key\n",
"```\n",
"\n",
"#### Windows\n",
"For Windows users, open a Powershell window and use the `Set` command to set `NIXTLA_API_KEY`. \n",
"\n",
"``` powershell\n",
"Set NIXTLA_API_KEY=your_api_key\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### b. Permanent: Using a `.env` file\n",
"\n",
"For a more persistent solution place your API key in a `.env` file located in the folder of your Python script. In this file, include the following:\n",
"\n",
"``` python\n",
"NIXTLA_API_KEY=your_api_key\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can now load the environment variable within your Python script. Use the `dotenv` package to load the `.env` file and then instantiate the `NIXTLA_API_KEY` class. For example:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from dotenv import load_dotenv\n",
"load_dotenv()\n",
"\n",
"from nixtla import NixtlaClient\n",
"nixtla_client = NixtlaClient()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This approach is more secure and suitable for applications that will be deployed or shared, as it keeps API keys out of the source code."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"::: {.callout-important}\n",
"Remember, your API key is like a password - keep it secret, keep it safe!\n",
"::: "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Validate your API key\n",
"\n",
"You can always find your API key in the `API Keys` section of your dashboard. To check the status of your API key, use the `validate_api_key` method of the `NixtlaClient` class. This method will return `True` if the API key is valid and `False` otherwise. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nixtla_client.validate_api_key()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You don't need to validate your API key every time you use `TimeGPT`. This function is provided for your convenience to ensure its validity. For full access to `TimeGPT`'s functionalities, in addition to a valid API key, you also need sufficient credits in your account. You can check your credits in the `Usage` section of your [dashboard](https://dashboard.nixtla.io/). "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TimeGPT Subscription Plans\n",
"\n",
"We offer various Enterprise plans tailored to your forecasting needs. The number of API calls, number of users, and support levels can be customized based on your needs. We also offer an option for a self-hosted version and a version hosted on Azure.\n",
"\n",
"Please get in touch with us at support@nixtla.io for more information regarding pricing options and to discuss your specific requirements. For organizations interested in exploring our solution further, you can schedule a demo [here]( https://meetings.hubspot.com/cristian-challu/enterprise-contact-us?uuid=dc037f5a-d93b-4[…]90b-a611dd9460af&utm_source=github&utm_medium=pricing_page) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Free trial available**\n",
"\n",
"When you [create your account](https://dashboard.nixtla.io), you’ll receive a 30-day free trial, no credit card required. After 30 days, access will expire unless you upgrade to a paid plan. Contact us to continue leveraging TimeGPT for accurate and easy to use forecasting!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**More information on pricing and billing**\n",
"\n",
"For additional information on pricing and billing please see our FAQ."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data Requirements\n",
"\n",
"> This section explains the data requirements for `TimeGPT`. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"from nixtla.utils import colab_badge"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"[![](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Nixtla/nixtla/blob/main/nbs/docs/getting-started/5_data_requirements.ipynb)"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#| echo: false\n",
"colab_badge('docs/getting-started/5_data_requirements')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`TimeGPT` accepts `pandas` and `polars` dataframes in [long format](https://www.theanalysisfactor.com/wide-and-long-data/#comments) with the following necessary columns: \n",
"\n",
"- `ds` (timestamp): timestamp in format `YYYY-MM-DD` or `YYYY-MM-DD HH:MM:SS`. \n",
"- `y` (numeric): The target variable to forecast. \n",
"\n",
"(Optionally, you can also pass a DataFrame without the `ds` column as long as it has DatetimeIndex)\n",
"\n",
"`TimeGPT` also works with distributed dataframes like `dask`, `spark` and `ray`. \n",
"\n",
"You can also include exogenous features in the DataFrame as additional columns. For more information, follow this [tutorial](https://docs.nixtla.io/docs/tutorials-exogenous_variables).\n",
"\n",
"Below is an example of a valid input dataframe for `TimeGPT`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timestamp</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1949-01-01</td>\n",
" <td>112</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1949-02-01</td>\n",
" <td>118</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1949-03-01</td>\n",
" <td>132</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1949-04-01</td>\n",
" <td>129</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1949-05-01</td>\n",
" <td>121</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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"
}
],
"source": [
"import pandas as pd \n",
"\n",
"df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/air_passengers.csv')\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that in this example, the `ds` column is named `timestamp` and the `y` column is named `value`. You can either:\n",
"\n",
"1. Rename the columns to `ds` and `y`, respectively, or\n",
"\n",
"2. Keep the current column names and specify them when using any method from the `NixtlaClient` class with the `time_col` and `target_col` arguments. \n",
"\n",
"For example, when using the `forecast` method from the `NixtlaClient` class, you must instantiate the class and then specify the columns names as follows. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from nixtla import NixtlaClient\n",
"\n",
"nixtla_client = NixtlaClient(\n",
" api_key = 'my_api_key_provided_by_nixtla'\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"nixtla_client = NixtlaClient()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:nixtla.nixtla_client:Validating inputs...\n",
"INFO:nixtla.nixtla_client:Inferred freq: MS\n",
"INFO:nixtla.nixtla_client:Preprocessing dataframes...\n",
"INFO:nixtla.nixtla_client:Querying model metadata...\n",
"INFO:nixtla.nixtla_client:Restricting input...\n",
"INFO:nixtla.nixtla_client:Calling Forecast Endpoint...\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timestamp</th>\n",
" <th>TimeGPT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1961-01-01</td>\n",
" <td>437.83792</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1961-02-01</td>\n",
" <td>426.06270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1961-03-01</td>\n",
" <td>463.11655</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1961-04-01</td>\n",
" <td>478.24450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1961-05-01</td>\n",
" <td>505.64648</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" timestamp TimeGPT\n",
"0 1961-01-01 437.83792\n",
"1 1961-02-01 426.06270\n",
"2 1961-03-01 463.11655\n",
"3 1961-04-01 478.24450\n",
"4 1961-05-01 505.64648"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fcst = nixtla_client.forecast(df=df, h=12, time_col='timestamp', target_col='value')\n",
"fcst.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this example, the `NixtlaClient` is infereing the frequency, but you can explicitly specify it with the `freq` argument.\n",
"\n",
"\n",
"To learn more about how to instantiate the `NixtlaClient` class, refer to the [TimeGPT Quickstart](https://docs.nixtla.io/docs/getting-started-timegpt_quickstart)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Multiple Series "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you're working with multiple time series, make sure that each series has a unique identifier. You can name this column `unique_id` or specify its name using the `id_col` argument when calling any method from the `NixtlaClient` class. This column should be a string, integer, or category.\n",
"\n",
"In this example, we have five series representing hourly electricity prices in five different markets. The columns already have the default names, so it's unnecessary to specify the `id_col`, `time_col`, or `target_col` arguments. If your columns have different names, specify these arguments as required."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unique_id</th>\n",
" <th>ds</th>\n",
" <th>y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 00:00:00</td>\n",
" <td>70.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 01:00:00</td>\n",
" <td>37.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 02:00:00</td>\n",
" <td>37.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 03:00:00</td>\n",
" <td>44.75</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 04:00:00</td>\n",
" <td>37.10</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unique_id ds y\n",
"0 BE 2016-10-22 00:00:00 70.00\n",
"1 BE 2016-10-22 01:00:00 37.10\n",
"2 BE 2016-10-22 02:00:00 37.10\n",
"3 BE 2016-10-22 03:00:00 44.75\n",
"4 BE 2016-10-22 04:00:00 37.10"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/electricity-short.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:nixtla.nixtla_client:Validating inputs...\n",
"INFO:nixtla.nixtla_client:Inferred freq: h\n",
"INFO:nixtla.nixtla_client:Preprocessing dataframes...\n",
"INFO:nixtla.nixtla_client:Querying model metadata...\n",
"INFO:nixtla.nixtla_client:Restricting input...\n",
"INFO:nixtla.nixtla_client:Calling Forecast Endpoint...\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unique_id</th>\n",
" <th>ds</th>\n",
" <th>TimeGPT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 00:00:00</td>\n",
" <td>45.190582</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 01:00:00</td>\n",
" <td>43.244987</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 02:00:00</td>\n",
" <td>41.958897</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 03:00:00</td>\n",
" <td>39.796680</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 04:00:00</td>\n",
" <td>39.204865</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unique_id ds TimeGPT\n",
"0 BE 2016-12-31 00:00:00 45.190582\n",
"1 BE 2016-12-31 01:00:00 43.244987\n",
"2 BE 2016-12-31 02:00:00 41.958897\n",
"3 BE 2016-12-31 03:00:00 39.796680\n",
"4 BE 2016-12-31 04:00:00 39.204865"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fcst = nixtla_client.forecast(df=df, h=24) # use id_col, time_col and target_col here if needed. \n",
"fcst.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When working with a large number of time series, consider using a [distributed computing framework](https://docs.nixtla.io/docs/tutorials-computing_at_scale) to handle the data efficiently. `TimeGPT` supports frameworks such as [Spark](https://docs.nixtla.io/docs/tutorials-spark), [Dask](https://docs.nixtla.io/docs/tutorials-dask), and [Ray](https://docs.nixtla.io/docs/tutorials-ray)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exogenous Variables "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`TimeGPT` also accepts exogenous variables. You can add exogenous variables to your dataframe by including additional columns after the `y` column."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unique_id</th>\n",
" <th>ds</th>\n",
" <th>y</th>\n",
" <th>Exogenous1</th>\n",
" <th>Exogenous2</th>\n",
" <th>day_0</th>\n",
" <th>day_1</th>\n",
" <th>day_2</th>\n",
" <th>day_3</th>\n",
" <th>day_4</th>\n",
" <th>day_5</th>\n",
" <th>day_6</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 00:00:00</td>\n",
" <td>70.00</td>\n",
" <td>57253.0</td>\n",
" <td>49593.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 01:00:00</td>\n",
" <td>37.10</td>\n",
" <td>51887.0</td>\n",
" <td>46073.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 02:00:00</td>\n",
" <td>37.10</td>\n",
" <td>51896.0</td>\n",
" <td>44927.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 03:00:00</td>\n",
" <td>44.75</td>\n",
" <td>48428.0</td>\n",
" <td>44483.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BE</td>\n",
" <td>2016-10-22 04:00:00</td>\n",
" <td>37.10</td>\n",
" <td>46721.0</td>\n",
" <td>44338.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unique_id ds y Exogenous1 Exogenous2 day_0 day_1 \\\n",
"0 BE 2016-10-22 00:00:00 70.00 57253.0 49593.0 0.0 0.0 \n",
"1 BE 2016-10-22 01:00:00 37.10 51887.0 46073.0 0.0 0.0 \n",
"2 BE 2016-10-22 02:00:00 37.10 51896.0 44927.0 0.0 0.0 \n",
"3 BE 2016-10-22 03:00:00 44.75 48428.0 44483.0 0.0 0.0 \n",
"4 BE 2016-10-22 04:00:00 37.10 46721.0 44338.0 0.0 0.0 \n",
"\n",
" day_2 day_3 day_4 day_5 day_6 \n",
"0 0.0 0.0 0.0 1.0 0.0 \n",
"1 0.0 0.0 0.0 1.0 0.0 \n",
"2 0.0 0.0 0.0 1.0 0.0 \n",
"3 0.0 0.0 0.0 1.0 0.0 \n",
"4 0.0 0.0 0.0 1.0 0.0 "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/electricity-short-with-ex-vars.csv')\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When using exogenous variables, you also need to provide its future values. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unique_id</th>\n",
" <th>ds</th>\n",
" <th>Exogenous1</th>\n",
" <th>Exogenous2</th>\n",
" <th>day_0</th>\n",
" <th>day_1</th>\n",
" <th>day_2</th>\n",
" <th>day_3</th>\n",
" <th>day_4</th>\n",
" <th>day_5</th>\n",
" <th>day_6</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 00:00:00</td>\n",
" <td>70318.0</td>\n",
" <td>64108.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 01:00:00</td>\n",
" <td>67898.0</td>\n",
" <td>62492.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 02:00:00</td>\n",
" <td>68379.0</td>\n",
" <td>61571.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 03:00:00</td>\n",
" <td>64972.0</td>\n",
" <td>60381.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 04:00:00</td>\n",
" <td>62900.0</td>\n",
" <td>60298.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unique_id ds Exogenous1 Exogenous2 day_0 day_1 day_2 \\\n",
"0 BE 2016-12-31 00:00:00 70318.0 64108.0 0.0 0.0 0.0 \n",
"1 BE 2016-12-31 01:00:00 67898.0 62492.0 0.0 0.0 0.0 \n",
"2 BE 2016-12-31 02:00:00 68379.0 61571.0 0.0 0.0 0.0 \n",
"3 BE 2016-12-31 03:00:00 64972.0 60381.0 0.0 0.0 0.0 \n",
"4 BE 2016-12-31 04:00:00 62900.0 60298.0 0.0 0.0 0.0 \n",
"\n",
" day_3 day_4 day_5 day_6 \n",
"0 0.0 0.0 1.0 0.0 \n",
"1 0.0 0.0 1.0 0.0 \n",
"2 0.0 0.0 1.0 0.0 \n",
"3 0.0 0.0 1.0 0.0 \n",
"4 0.0 0.0 1.0 0.0 "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"future_ex_vars_df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/electricity-short-future-ex-vars.csv')\n",
"future_ex_vars_df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:nixtla.nixtla_client:Validating inputs...\n",
"INFO:nixtla.nixtla_client:Inferred freq: h\n",
"INFO:nixtla.nixtla_client:Preprocessing dataframes...\n",
"INFO:nixtla.nixtla_client:Using future exogenous features: ['Exogenous1', 'Exogenous2', 'day_0', 'day_1', 'day_2', 'day_3', 'day_4', 'day_5', 'day_6']\n",
"INFO:nixtla.nixtla_client:Calling Forecast Endpoint...\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unique_id</th>\n",
" <th>ds</th>\n",
" <th>TimeGPT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 00:00:00</td>\n",
" <td>51.632830</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 01:00:00</td>\n",
" <td>45.750877</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 02:00:00</td>\n",
" <td>39.650543</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 03:00:00</td>\n",
" <td>34.000072</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BE</td>\n",
" <td>2016-12-31 04:00:00</td>\n",
" <td>33.785370</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unique_id ds TimeGPT\n",
"0 BE 2016-12-31 00:00:00 51.632830\n",
"1 BE 2016-12-31 01:00:00 45.750877\n",
"2 BE 2016-12-31 02:00:00 39.650543\n",
"3 BE 2016-12-31 03:00:00 34.000072\n",
"4 BE 2016-12-31 04:00:00 33.785370"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fcst = nixtla_client.forecast(df=df, X_df=future_ex_vars_df, h=24)\n",
"fcst.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To learn more about how to use exogenous variables with `TimeGPT`, consult the [Exogenous Variables](https://docs.nixtla.io/docs/tutorials-exogenous_variables) tutorial. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Important Considerations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When using `TimeGPT`, the data cannot contain missing values. This means that for every series, there should be no gaps in the timestamps and no missing values in the target variable. \n",
"\n",
"For more, please refer to the tutorial on [Dealing with Missing Values in TimeGPT](https://docs.nixtla.io/docs/tutorials-dealing_with_missing_values_in_timegpt). \n",
"\n",
"### Minimum Data Requirements (for AzureAI)\n",
"\n",
"`TimeGPT` currently supports any amount of data for generating point forecasts. That is, the minimum size per series to expect results from this call `nixtla_client.forecast(df=df, h=h, freq=freq)` is one, regardless of the frequency.\n",
"\n",
"For Azure AI, when using the arguments `level`, `finetune_steps`, `X_df` (exogenous variables), or `add_history`, the API requires a minimum number of data points depending on the frequency. Here are the minimum sizes for each frequency:\n",
"\n",
"<div align=\"center\">\n",
"\n",
"| Frequency | Minimum Size |\n",
"|--------------------------|--------------|\n",
"| Hourly and subhourly (e.g., \"H\", \"min\", \"15T\") | 1008 |\n",
"| Daily (\"D\") | 300 |\n",
"| Weekly (e.g., \"W-MON\",..., \"W-SUN\") | 64 |\n",
"| Monthly and other frequencies (e.g., \"M\", \"MS\", \"Y\") | 48 |\n",
"\n",
"</div>\n",
"\n",
"For cross-validation, you need to consider these numbers as well as the forecast horizon (`h`), the number of windows (`n_windows`), and the gap between windows (`step_size`). Thus, the minimum number of observations per series in this case would be determined by the following relationship:\n",
"\n",
"<div align=\"center\">\n",
"\n",
"Minimum number described previously + h + step_size + (n_windows - 1)\n",
"\n",
"</div>\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# FAQ\n",
"\n",
"Commonly asked questions about TimeGPT"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of contents\n",
"- [TimeGPT](#timegpt)\n",
"- [TimeGPT API Key](#timegpt-api-key)\n",
"- [Features and Capabilities](#features-and-capabilities)\n",
"- [Fine-tuning](#finetuning)\n",
"- [Pricing and Billing](#pricing-and-billing)\n",
"- [Privacy and Security](#privacy-and-security)\n",
"- [Troubleshooting](#troubleshooting)\n",
"- [Additional Support](#additional-support)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## TimeGPT"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details> \n",
" <summary>What is TimeGPT?</summary>\n",
"\n",
"`TimeGPT` is the first foundation model for time series forecasting. It can produce accurate forecasts for new time series across a diverse array of domains using only historical values as inputs. The model \"reads\" time series data sequentially from left to right, similarly to how humans read a sentence. It looks at windows of past data, which we can think of as \"tokens\", and then predicts what comes next. This prediction is based on patterns the model identifies and that it extrapolates into the future. Beyond forecasting, `TimeGPT` supports other time series related tasks, such as what-if-scenarios, anomaly detection, and more. \n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Is TimeGPT based on a Large Language Model (LLM)?</summary> \n",
"\n",
"No, `TimeGPT` is not based on any large language model. While it follows the same principle of training a large transformer model on a vast dataset, its architecture is specifically designed to handle time series data and it has been trained to minimize forecasting errors. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How do I get started with TimeGPT?</summary>\n",
"\n",
"To get started with `TimeGPT`, you need to register for an account [here](https://dashboard.nixtla.io/). You will receive an email asking you to confirm your signup. After confirming, you will be able to access your dashboard, which contains the details of your account.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How accessible is TimeGPT and what are the usage costs?</summary>\n",
"\n",
"For a more in-depth understanding of `TimeGPT`, please refer to the [research paper](https://arxiv.org/pdf/2310.03589.pdf). While certain aspects of the model's architecture remain confidential, registration for `TimeGPT` is open to all. New users receive $1,000 USD in free credits and subsequent usage fees are based on token consumption. For more details, please refer to the [Pricing and Billing](#pricing-and-billing) section\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How can I use TimeGPT?</summary>\n",
"\n",
"- Through the [Python SDK](https://github.com/Nixtla/nixtla)\n",
"\n",
"- Via the `TimeGPT` API. For instructions on how to call the API using different languages, please refer to the [API documentation](https://docs.nixtla.io/reference/timegpt_timegpt_post)\n",
"\n",
"Both methods require you to have a [API key](#timegpt-api-key), which is obtained upon registration and can be found in your dashboard under `API Keys`.\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## TimeGPT API Key"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>What is an API key?</summary>\n",
"\n",
"An API key is a unique string of characters that serves as a key to authenticate your requests when using the Nixtla SDK. It ensures that the person making the requests is authorized to do so.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Where can I get an API key?</summary>\n",
"\n",
"Upon registration, you will receive an API key that can be found in your [dashboard](https://dashboard.nixtla.io/) under `API Keys`. Remember that your API key is personal and should not be shared with anyone.\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How do I use my API key?</summary>\n",
"\n",
"To integrate your API key into your development workflow, please refer to the tutorial on [Setting Up Your API Key](https://docs.nixtla.io/docs/getting-started-setting_up_your_api_key). \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How can I check the status of my API key?</summary>\n",
"\n",
"If you want to check the status of your API key, you can use the [`validate_api_key` method](https://nixtlaverse.nixtla.io/nixtla/nixtla_client.html#nixtlaclient-validate-api-key) of the `NixtlaClient` class. \n",
"\n",
"`nixtla_client = NixtlaClient(\n",
" api_key = 'my_api_key_provided_by_nixtla'\n",
")`\n",
"\n",
"`nixtla_client.validate_api_key()`\n",
"\n",
"If your key is validating correctly, this will return\n",
"\n",
"```\n",
"INFO:nixtla.nixtla_client:Happy Forecasting! :), If you have questions or need support, please email support@nixtla.io\n",
"\n",
"True\n",
"```\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>What if my API key isn't validating?</summary>\n",
"\n",
"When you validate your API key and it returns `False`:\n",
"\n",
"* If you are targeting an Azure endpoint, getting `False` from the `NixtlaClient.validate_api_key` method is expected. You can skip this step when taregting an Azure endpoint and proceed diretly to forecasting instead.\n",
"* If you are not taregting an Azure endpoint, then you should check the following:\n",
" * Make sure you are using the latest version of the SDK (Python or R).\n",
" * Check that your API key is active in your dashboard by visiting https://dashboard.nixtla.io/\n",
" * Consider any firewalls your organization might have. There may be restricted access. If so, you can whitelist our endpoint https://api.nixtla.io/. \n",
" - To use Nixtla's API, you need to let your system know that our endpoint is ok, so it will let you access it. Whitelisting the endpoint isn't something that Nixtla can do on our side. It's something that needs to be done on the user's system. This is a bit of an [overview on whitelisting](https://www.csoonline.com/article/569493/whitelisting-explained-how-it-works-and-where-it-fits-in-a-security-program.html).\n",
" - If you work in an organization, please work with an IT team. They're likely the ones setting the security and you can talk with them to get it addressed. If you run your own systems, then it's something you should be able to update, depending on the system you're using.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Features and Capabilities"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>What is the input to TimeGPT?</summary>\n",
"\n",
"`TimeGPT` accepts `pandas` dataframes in [long format](https://www.theanalysisfactor.com/wide-and-long-data/#comments) with the following necessary columns: \n",
"\n",
"- `ds` (timestamp): timestamp in format `YYYY-MM-DD` or `YYYY-MM-DD HH:MM:SS`. \n",
"- `y` (numeric): The target variable to forecast. \n",
"\n",
"(Optionally, you can also pass a DataFrame without the `ds` column as long as it has DatetimeIndex)\n",
"\n",
"`TimeGPT` also works with [distributed dataframes](https://docs.nixtla.io/docs/tutorials-computing_at_scale) like `dask`, `spark` and `ray`. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT handle multiple time series?</summary>\n",
"\n",
"Yes. For guidance on forecasting multiple time series at once, consult the [Multiple Series](https://docs.nixtla.io/docs/tutorials-multiple_series_forecasting) tutorial. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Does TimeGPT support forecasting with exogenous variables?</summary>\n",
"\n",
"Yes. For instructions on how to incorporate exogenous variables to `TimeGPT`, see the [Exogenous Variables](https://docs.nixtla.io/docs/tutorials-exogenous_variables) tutorial. For incorporating calendar dates specifically, you may find the [Holidays and Special Dates](https://docs.nixtla.io/docs/tutorials-holidays_and_special_dates) tutorial useful. For categorical variables, refer to the [Categorical Variables](https://docs.nixtla.io/docs/tutorials-categorical_variables) tutorial.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT be used for anomaly detection?</summary>\n",
"\n",
"Yes. To learn how to use `TimeGPT` for anomaly detection, refer to the [Anomaly Detection](https://docs.nixtla.io/docs/capabilities-anomaly-detection-anomaly_detection) tutorial.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"<details>\n",
" <summary>Does TimeGPT support cross-validation?</summary>\n",
"\n",
"Yes. To learn how to use `TimeGPT` for cross-validation, refer to the [Cross-Validation](https://docs.nixtla.io/docs/tutorials-cross_validation) tutorial.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT be used to forecast historical data?</summary>\n",
"\n",
"Yes. To find out how to forecast historical data using `TimeGPT`, see the [Historical Forecast](https://docs.nixtla.io/docs/tutorials-historical_forecast) tutorial.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT be used for uncertainty quantification?</summary>\n",
"\n",
"Yes. For more information, explore the [Prediction Intervals](https://docs.nixtla.io/docs/tutorials-prediction_intervals) and [Quantile Forecasts](https://docs.nixtla.io/docs/tutorials-quantile_forecasts) tutorials. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT handle large datasets?</summary>\n",
"\n",
"Yes. When dealing with large datasets that contain hundreds of thousands or millions of time series, we recommend using a distributed backend. `TimeGPT` is compatible with several [distributed computing frameworks](https://docs.nixtla.io/docs/tutorials-computing_at_scale), including [Spark](https://docs.nixtla.io/docs/tutorials-spark), [Ray](https://docs.nixtla.io/docs/tutorials-ray), and [Dask](https://docs.nixtla.io/docs/tutorials-dask). Both the `TimeGPT` SDK and API don’t have a limit on the size of the dataset as long as a distributed backend is used.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT be used with limited/short data?</summary>\n",
"\n",
"`TimeGPT` supports any amount of data for generating point forecasts and is capable of producing results with just one observation per series. When using arguments such as `level`, `finetune_steps`, `X_df` (exogenous variables), or `add_history`, additional data points are necessary depending on the data frequency. For more details, please refer to the [Data Requirements](https://docs.nixtla.io/docs/getting-started-data_requirements) tutorial.\n",
"\n",
"</details>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>What is the maximum forecast horizon allowed by TimeGPT?</summary>\n",
"\n",
"While `TimeGPT` does not have a maximum forecast horizon, its performance will decrease as the horizon increases. When the forecast horizon exceeds the season length of the data (for example, more than 12 months for monthly data), you will get this message: `WARNING:nixtla.nixtla_client:The specified horizon \"h\" exceeds the model horizon. This may lead to less accurate forecasts. Please consider using a smaller horizon`.\n",
"\n",
"For details, refer to the tutorial on [Long Horizon in Time Series](https://docs.nixtla.io/docs/tutorials-long_horizon_forecasting).\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT handle missing values?</summary>\n",
"\n",
"`TimeGPT` cannot handle missing values or series with irregular timestamps. For more information, see the [Forecasting Time Series with Irregular Timestamps](https://docs.nixtla.io/docs/capabilities-forecast-irregular_timestamps) and the [Dealing with Missing Values](https://docs.nixtla.io/docs/tutorials-dealing_with_missing_values_in_timegpt) tutorial. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How can I plot the TimeGPT forecast?</summary>\n",
"\n",
"The `NixtlaClient` class has a [`plot` method](https://nixtlaverse.nixtla.io/nixtla/nixtla_client.html#nixtlaclient-validate-token) that can be used to visualize the forecast. This method only works in interactive environments such as Jupyter notebooks and it doesn't work on Python scripts. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Does TimeGPT support polars?</summary>\n",
"\n",
"As of now, `TimeGPT` does not offer support for polars. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Does TimeGPT produce stable predictions?</summary>\n",
"\n",
"`TimeGPT` is engineered for stability, ensuring consistent results for identical input data. This means that given the same dataset, the model will produce the same forecasts.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can TimeGPT forecast data with simple pattern such as a straight line or sine wave?</summary>\n",
"\n",
"While this is not the primary use case for `TimeGPT`, it is capable of generating solid results on simple data such as a straight line. While zero-shot predictions might not always meet expectations, a little help with fine-tuning allows TimeGPT to quickly grasp the trend and produce accurate forecasts. For more details, please refer to the [Improve Forecast Accuracy with TimeGPT](https://docs.nixtla.io/docs/tutorials-improve_forecast_accuracy_with_timegpt) tutorial.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fine-tuning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>What is fine-tuning?</summary>\n",
"\n",
"`TimeGPT` was trained on the largest publicly available time series dataset, covering a wide range of domains such as finance, retail, healthcare, and more. This comprehensive training enables `TimeGPT` to produce accurate forecasts for new time series without additional training, a capability known as zero-shot learning. \n",
"\n",
"While the zero-shot model provides a solid baseline, the performance of `TimeGPT` can often be improved through fine-tuning. During this process, the `TimeGPT` model undergoes additional training using your specific dataset, starting from the pre-trained paramaters. The updated model then produces the forecasts. You can control the number of training iterations and the loss function for fine-tuning with the `finetune_steps` and the `finetune_loss` parameters in the `forecast` method from the `NixtlaClient` class, respectively. \n",
"\n",
"For a comprehensive guide on how to apply fine-tuning, please refer to the [fine-tuning](https://docs.nixtla.io/docs/tutorials-fine_tuning) and the [fine-tuning with a specific loss function](https://docs.nixtla.io/docs/tutorials-fine_tuning_with_a_specific_loss_function) tutorials. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Do I have to fine-tune every series?</summary>\n",
"\n",
"No, you do not need to fine-tune every series individually. When using the `finetune_steps` parameter, the model undergoes fine-tuning across all series in your dataset simultaneously. This method uses a cross-learning approach, allowing the model to learn from multiple series at once, which can improve individual forecasts.\n",
"\n",
"Keep in mind that selecting the right number of fine-tuning steps may require some trial and error. As the number of fine-tuning steps increases, the model becomes more specialized to your dataset, but will take longer to train and may be more prone to overfitting. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Can I save fine-tuned parameters?</summary>\n",
"\n",
"Yes! You can fine-tune the TimeGPT model, save it, and reuse it later. For detailed instructions, see our guide on [Re-using Fine-tuned Models](https://docs.nixtla.io/docs/tutorials-re_using_fine_tuned_models).\n",
"\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pricing and Billing "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How does pricing work?</summary>\n",
"\n",
"See our [Pricing page](https://docs.nixtla.io/docs/getting-started-timegpt_subscription_plans) for information about pricing.\n",
"\n",
"[Start for Free](https://dashboard.nixtla.io/)\n",
"*No credit card needed.\n",
"\n",
"For customized plan details and offerings, book a demo or contact us at [support@nixtla.io](mailto:support@nixtla.io).\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>Are there free options or discounts?</summary>\n",
"\n",
"Yes! We provide some discounted options for academic research. If you would like to learn more, please email us at [support@nixtla.io](mailto:support@nixtla.io).\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>What counts as an API call?</summary> \n",
"\n",
"An API call is a request made to TimeGPT to perform an action like forecasting or detecting anomalies. API Usage is as follows:\n",
"\n",
"### Forecasting:\n",
"\n",
"1. When not requesting historical forecasts (`add_history=False`)\n",
" - If you do not set `num_partitions`, all calls to perform [forecasting](https://docs.nixtla.io/docs/getting-started-timegpt_quickstart), [finetuning](https://docs.nixtla.io/docs/tutorials-fine_tuning), or [cross-validation](https://docs.nixtla.io/docs/tutorials-cross_validation) increase the usage by 1. Note that addition of [exogenous variables](https://docs.nixtla.io/docs/tutorials-exogenous_variables), requesting [uncertainity quantification](https://docs.nixtla.io/docs/tutorials-uncertainty_quantification) or forecasting [multiple series](https://docs.nixtla.io/docs/tutorials-multiple_series_forecasting) does not increase the usage further.\n",
" - If the API call requires to send more than 200MB of data, the API will return an error and will require you to use the `num_partitions` parameter in order to partition your request. Every partition will count as an API call, hence the usage will increase by the value you set for `num_partitions` (e.g. for num_partitions=2, the usage will increase by 2).\n",
" If you set `num_partitions`, all calls to perform forecasting, finetuning, or cross-validation increase the usage by num_partitions.\n",
"2. When requesting [in-sample predictions](https://docs.nixtla.io/docs/tutorials-historical_forecast) (`add_history=True`), the usage from #1 above is multipled by 2.\n",
"\n",
"**Examples**\n",
"\n",
"1. A user uses TimeGPT to forecast daily data, using the `timegpt-1` model. How many API calls are made? (*Ans*: 1)\n",
"2. A user calls the `cross_validation` method on a dataset. How many API calls are made (*Ans*: 1)\n",
"3. A user decides to forecast on a longer horizon, so they use the `timegpt-1-long-horizon` model. How many API calls are made (*Ans*: 1)\n",
"4. A user needs to get the in-sample predicitons when forecasting using `add_history=True`. How many API calls are made (*Ans*: 2)\n",
"5. A user has a very large dataset, with a daily frequency, and they must set `num_partitions=4` when forecasting. How many API calls are made (*Ans*: 4)\n",
"6. A user has to set `num_partitions=4` and is also interesed in getting the in-sample predicitons (`add_history=True`) when forecasting. How many API calls are made (*Ans*: 8)\n",
"\n",
"\n",
"### Anomaly Detection:\n",
"\n",
"1. If you do not set `num_partitions`, all calls to perform [anomaly detection](https://docs.nixtla.io/docs/capabilities-anomaly-detection-quickstart) increase the usage by 1. Note that addition of [exogenous variables](https://docs.nixtla.io/docs/capabilities-anomaly-detection-add_exogenous_variables) does not increase the usage further.\n",
"2. If the API call requires to send more than 200MB of data, the API will return an error and will require you to use the `num_partitions` parameter in order to partition your request. Every partition will count as an API call, hence the usage will increase by the value you set for `num_partitions` (e.g. for num_partitions=2, the usage will increase by 2).\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How does billing work?</summary>\n",
"\n",
"Billing is done through Stripe. We've partnered with Stripe to handle all payment processing. You can view your invoices and payment history in your [dashboard](https://dashboard.nixtla.io/) under `Billing`. \n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Privacy and Security "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary>How do you ensure the privacy and security of my data?</summary>\n",
"\n",
"At Nixtla, we take your privacy and security very seriously. To ensure you are fully informed about our policies regarding your data, please refer to the following documents: \n",
"\n",
"- [Privacy Notice](https://docs.nixtla.io/docs/privacy-notice)\n",
"\n",
"- For the Python SDK, please review the [license agreement](https://github.com/Nixtla/nixtla/blob/main/LICENSE). \n",
"\n",
"- For `TimeGPT`, please refer to our [terms and conditions](https://docs.nixtla.io/docs/terms-and-conditions). \n",
"\n",
"In addtion, we are currently developing a self-hosted version of `TimeGPT`, tailored for the unique security requirements of enterprise data. This version is currently in beta. If you are interested in exploring this option, please contact us at `support@nixtla.io`.\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Troubleshooting "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following section contains some common errors and warnings "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
" <summary><strong>Error message: Invalid API key</strong></summary>\n",
"\n",
"``` python\n",
"ApiError: status_code: 401, body: {'data': None, 'message': 'Invalid API key', 'details': 'Key not found', 'code': 'A12', 'requestID': 'E7F2BBTB2P', 'support': 'If you have questions or need support, please email support@nixtla.io'}\n",
"```\n",
"\n",
"**Solution:** This error occurs when your `TimeGPT` API key is either invalid or has not been set up correctly. Please use the `validate_api_key` method to verify it or make sure it was copied correctly from the `API Keys` section of your [dashboard](https://dashboard.nixtla.io/).\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
"<summary><strong>Error message: Too many requests</strong></summary>\n",
"\n",
"``` python\n",
"ApiError: status_code: 429, body: {'data': None, 'message': 'Too many requests', 'details': 'You need to add a payment method to continue using the API, do so from https://dashboard.nixtla.io', 'code': 'A21', 'requestID': 'NCJDK7KSJ6', 'support': 'If you have questions or need support, please email support@nixtla.io'}\n",
"```\n",
"\n",
"**Solution:** This error occurs when you have exhausted your free credits and need to add a payment method to continue using `TimeGPT`. You can add a payment method in the `Billing` section of your [dashboard](https://dashboard.nixtla.io/).\n",
"\n",
"</details>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
"<summary><strong>Error message: WriteTimeout</strong></summary>\n",
"\n",
"**Solution:** If you encounter a `WriteTimeout` error, it means that the request has exceeded the allowable processing time. This is a common issue when working with large datasets. To fix this, consider increasing the `num_partitions` parameter in the [`forecast` method](https://nixtlaverse.nixtla.io/nixtla/nixtla_client.html#nixtlaclient-forecast) of the `NixtlaClient` class, or use a distributed backend if not already in use.\n",
"\n",
"</details>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Additional Support"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you have any more questions or need support, please reach out by:\n",
"\n",
"- Opening an [issue](https://github.com/Nixtla/nixtla/issues) on GitHub for technical questions or bugs.\n",
"- Sending an email to `support@nixtla.io` for general inquiries or support.\n",
"- Joining our [Slack](https://join.slack.com/t/nixtlacommunity/shared_invite/zt-2ebtgjbip-QMSnvm6ED1NF5vi4xj_13Q) community to connect with our team and the forecasting community."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Glossary\n",
"> These are some key concepts related to time series forecasting, designed to help you better understand and leverage the capabilities of TimeGPT.\n",
"\n",
"- [Time Series](#time-series) \n",
"- [Forecasting](#forecasting) \n",
"- [Foundation Model](#foundation-model) \n",
"- [TimeGPT](#timegpt) \n",
"- [Tokens](#tokens) \n",
"- [Fine-tuning](#fine-tuning)\n",
"- [Historical Forecasts](#historical-forecasts)\n",
"- [Anomaly Detection](#anomaly-detection)\n",
"- [Time Series Cross-Validation](#time-series-cross-validation)\n",
"- [Exogenous Variables](#exogenous-variables)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Time Series \n",
"\n",
"A time series is a sequence of data points indexed by time, used to model phenomena that changes over time, such as stock prices, temperature, or product sales. A time series can generally be thought of as comprising the following components:\n",
"\n",
"- **Trend**: The consistent, long-term direction of the data, whether upward or downward. It reflects the persistent, overall movement in the series over time.\n",
"\n",
"- **Seasonality**: A repeated cycle around a known and fixed period. \n",
"\n",
"- **Remainder**: The residuals or random noise left in the data after the trend and seasonal effects have been accounted for.\n",
"\n",
"## Forecasting\n",
"\n",
"Forecasting is the process of predicting the future values of a time series based on historical data. It plays a crucial role in the decision-making process across various fields such as finance, healthcare, retail, and economics, among others.\n",
"\n",
"Forecasting can use a variety of approaches, from statistical approaches to novel techniques such as machine learning, deep learning, and foundation models. These models can be further classified into univariate and multivariate models, depending on the number of variables used to make the predictions, or local or global models, with local models estimating parameters independently for each series and global models estimating parameters jointly across multiple series.\n",
"\n",
"Forecasts themselves can be presented as point forecasts, which predict a single future value, or as probabilistic forecasts, which provide a full probability distribution of future values, and hence, providing a measure of uncertainty.\n",
"\n",
"## Foundation Model \n",
"\n",
"Foundation model refers to a type of large, pre-trained model that can be adapted to a wide range of tasks, including time series forecasting. Originally developed for domains such as natural language processing and computer vision, foundation models are now increasingly applied to sequential data like time series. These models are typically trained on extensive datasets, capturing complex patterns and dependencies that can be fine-tuned for specific tasks.\n",
"\n",
"## TimeGPT \n",
"\n",
"Developed by Nixtla, `TimeGPT` is the first foundation model for time series forecasting. `TimeGPT` was trained on billions of observations from publicly available datasets across multiple domains and can produce accurate forecasts for new time series without additional training, using only historical values as inputs. The model 'reads' time series data similarly to how humans read a sentence—sequentially from left to right. It looks at windows of past data, which we can think of as 'tokens', and predicts what comes next. This prediction is based on patterns the model identifies in past data and extrapolates into the future.\n",
"\n",
"## Tokens \n",
"\n",
"`TimeGPT` processes time series data in chunks. Each data point in a series can be thought of as a 'token', akin to how individual words or characters are treated in natural language processing (NLP).\n",
"\n",
"## Fine-tuning \n",
"\n",
"Fine-tuning is a process used in machine learning where a pre-trained model like `TimeGPT` undergoes additional training to adapt it for a specific dataset. Initially, `TimeGPT` can operate in a zero-shot manner, meaning it can generate forecasts as-is. While this zero-shot approach provides a solid baseline, the performance of `TimeGPT` can often be improved through fine-tuning. During this process, the `TimeGPT` model undergoes additional training using the specific dataset, starting from the pre-trained parameters. The updated model then produces the forecasts.\n",
"\n",
"[Learn how to fine-tune TimeGPT](https://docs.nixtla.io/docs/tutorials-fine_tuning)\n",
"\n",
"## Historical Forecasts\n",
"\n",
"Historical forecasts, also known as in-sample forecasts, are the predictions made for the historical data. These forecasts are commonly used to evaluate the performance of forecasting models by comparing the predicted values against the actual values. \n",
"\n",
"[Learn how to make historical forecasts with TimeGPT](https://docs.nixtla.io/docs/tutorials-historical_forecast)\n",
"\n",
"## Anomaly Detection\n",
"\n",
"Anomaly detection refers to the process of identifying unusual observations that deviate significantly from the expected behavior of the data. Anomalies, also known as outliers, can be caused by a variety of factors, such as errors in the data collection process, sudden changes in the underlying patterns of the data, or unexpected events. These anomalies can pose challenges for many forecasting models, as they may distort trends, seasonal patterns, or estimates of autocorrelation. Consequently, anomalies can significantly impact the accuracy of forecasts. Therefore, it is crucial to be able to identify them accurately.\n",
"\n",
"Anomaly detection has many applications across different industries, including detecting fraud in financial transactions, monitoring the performance of online services, or identifying unusual patterns in energy usage.\n",
"\n",
"[Learn how to detect anomalies with TimeGPT](https://docs.nixtla.io/docs/capabilities-anomaly-detection-anomaly_detection)\n",
"\n",
"## Time Series Cross Validation\n",
"\n",
"Time series cross-validation is a method for evaluating how a model would have performed on historical data. It works by defining a sliding window across past observations and predicting the period following it. It differs from standard cross-validation by maintaining the chronological order of the data instead of randomly splitting it.\n",
"\n",
"This method allows for a more accurate estimation of a forecasting model's predictive capabilities by considering multiple sequential periods. When only one window is used, this method resembles a standard train-test split, with the last set of observations serving as the test data and all preceding data as the training set.\n",
"\n",
"[Learn how to perform cross-validation with TimeGPT](https://docs.nixtla.io/docs/tutorials-cross_validation)\n",
"\n",
"## Exogenous Variables\n",
"\n",
"Exogenous variables are external factors that can influence the behavior of a time series but are not directly affected by it. For example, in retail sales forecasting, exogenous variables could include factors such as holidays, promotions, prices, or weather data for electricity load forecasts. By incorporating these variables into the forecasting model, it is possible to capture the relationships between the target series and external factors, leading to more accurate predictions.\n",
"\n",
"[Learn how to include exogenous variables in TimeGPT](https://docs.nixtla.io/docs/tutorials-exogenous_variables)"
]
}
],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"!pip install -Uqq nixtla"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide \n",
"from nixtla.utils import in_colab"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide \n",
"IN_COLAB = in_colab()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"if not IN_COLAB:\n",
" from nixtla.utils import colab_badge\n",
" from dotenv import load_dotenv"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Why TimeGPT?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook, we compare the performance of TimeGPT against three forecasting models: the classical model (ARIMA), the machine learning model (LightGBM), and the deep learning model (N-HiTS), using a subset of data from the M5 Forecasting competition. We want to highlight three top-rated benefits our users love about TimeGPT:\n",
"\n",
"🎯 **Accuracy**: TimeGPT consistently outperforms traditional models by capturing complex patterns with precision.\n",
"\n",
"⚡ **Speed**: Generate forecasts faster without needing extensive training or tuning for each series.\n",
"\n",
"🚀 **Ease of Use**: Minimal setup and no complex preprocessing make TimeGPT accessible and ready to use right out of the box!\n",
"\n",
"Before diving into the notebook, please visit our [dashboard](https://dashboard.nixtla.io) to generate your TimeGPT `api_key` and give it a try yourself!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Table of Contents\n",
"\n",
"1. [Data Introduction](#1-data-introduction)\n",
"2. [Model Fitting](#2-model-fitting-timegpt-arima-lightgbm-n-hits)\n",
" 1. [Fitting TimeGPT](#21-timegpt)\n",
" 2. [Fitting ARIMA](#22-classical-models-arima)\n",
" 3. [Fitting Light GBM](#23-machine-learning-models-lightgbm)\n",
" 4. [Fitting NHITS](#24-n-hits)\n",
"3. [Results and Evaluation](#3-performance-comparison-and-results)\n",
"4. [Conclusion](#4-conclusion)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"[![](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Nixtla/nixtla/blob/main/nbs/docs/getting-started/7_why_timegpt.ipynb)"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#| echo: false\n",
"if not IN_COLAB:\n",
" load_dotenv()\n",
" colab_badge('docs/getting-started/7_why_timegpt')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from nixtla import NixtlaClient\n",
"from utilsforecast.plotting import plot_series\n",
"from utilsforecast.losses import mae, rmse, smape\n",
"from utilsforecast.evaluation import evaluate"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nixtla_client = NixtlaClient(\n",
" # api_key = 'my_api_key_provided_by_nixtla'\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Data introduction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook, we’re working with an aggregated dataset from the M5 Forecasting - Accuracy competition. This dataset includes **7 daily time series**, each with **1,941 data points**. The last **28 data points** of each series are set aside as the test set, allowing us to evaluate model performance on unseen data."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('https://datasets-nixtla.s3.amazonaws.com/demand_example.csv', parse_dates=['ds'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead tr th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe thead tr:last-of-type th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th colspan=\"3\" halign=\"left\">ds</th>\n",
" <th colspan=\"4\" halign=\"left\">y</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th>min</th>\n",
" <th>max</th>\n",
" <th>count</th>\n",
" <th>min</th>\n",
" <th>mean</th>\n",
" <th>median</th>\n",
" <th>max</th>\n",
" </tr>\n",
" <tr>\n",
" <th>unique_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>FOODS_1</th>\n",
" <td>2011-01-29</td>\n",
" <td>2016-05-22</td>\n",
" <td>1941</td>\n",
" <td>0.0</td>\n",
" <td>2674.085523</td>\n",
" <td>2665.0</td>\n",
" <td>5493.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FOODS_2</th>\n",
" <td>2011-01-29</td>\n",
" <td>2016-05-22</td>\n",
" <td>1941</td>\n",
" <td>0.0</td>\n",
" <td>4015.984029</td>\n",
" <td>3894.0</td>\n",
" <td>9069.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FOODS_3</th>\n",
" <td>2011-01-29</td>\n",
" <td>2016-05-22</td>\n",
" <td>1941</td>\n",
" <td>10.0</td>\n",
" <td>16969.089129</td>\n",
" <td>16548.0</td>\n",
" <td>28663.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>HOBBIES_1</th>\n",
" <td>2011-01-29</td>\n",
" <td>2016-05-22</td>\n",
" <td>1941</td>\n",
" <td>0.0</td>\n",
" <td>2936.122617</td>\n",
" <td>2908.0</td>\n",
" <td>5009.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>HOBBIES_2</th>\n",
" <td>2011-01-29</td>\n",
" <td>2016-05-22</td>\n",
" <td>1941</td>\n",
" <td>0.0</td>\n",
" <td>279.053065</td>\n",
" <td>248.0</td>\n",
" <td>871.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>HOUSEHOLD_1</th>\n",
" <td>2011-01-29</td>\n",
" <td>2016-05-22</td>\n",
" <td>1941</td>\n",
" <td>0.0</td>\n",
" <td>6039.594539</td>\n",
" <td>5984.0</td>\n",
" <td>11106.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>HOUSEHOLD_2</th>\n",
" <td>2011-01-29</td>\n",
" <td>2016-05-22</td>\n",
" <td>1941</td>\n",
" <td>0.0</td>\n",
" <td>1566.840289</td>\n",
" <td>1520.0</td>\n",
" <td>2926.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ds y \n",
" min max count min mean median max\n",
"unique_id \n",
"FOODS_1 2011-01-29 2016-05-22 1941 0.0 2674.085523 2665.0 5493.0\n",
"FOODS_2 2011-01-29 2016-05-22 1941 0.0 4015.984029 3894.0 9069.0\n",
"FOODS_3 2011-01-29 2016-05-22 1941 10.0 16969.089129 16548.0 28663.0\n",
"HOBBIES_1 2011-01-29 2016-05-22 1941 0.0 2936.122617 2908.0 5009.0\n",
"HOBBIES_2 2011-01-29 2016-05-22 1941 0.0 279.053065 248.0 871.0\n",
"HOUSEHOLD_1 2011-01-29 2016-05-22 1941 0.0 6039.594539 5984.0 11106.0\n",
"HOUSEHOLD_2 2011-01-29 2016-05-22 1941 0.0 1566.840289 1520.0 2926.0"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.groupby('unique_id').agg({\"ds\":[\"min\",\"max\",\"count\"],\\\n",
" \"y\":[\"min\",\"mean\",\"median\",\"max\"]})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(13391, 3) (196, 3)\n"
]
}
],
"source": [
"df_train = df.query('ds <= \"2016-04-24\"')\n",
"df_test = df.query('ds > \"2016-04-24\"')\n",
"\n",
"print(df_train.shape, df_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Model Fitting (TimeGPT, ARIMA, LightGBM, N-HiTS)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 TimeGPT\n",
"TimeGPT offers a powerful, streamlined solution for time series forecasting, delivering state-of-the-art results with minimal effort. With TimeGPT, there's no need for data preprocessing or feature engineering -- simply initiate the Nixtla client and call `nixtla_client.forecast` to produce accurate, high-performance forecasts tailored to your unique time series.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:nixtla.nixtla_client:Validating inputs...\n",
"INFO:nixtla.nixtla_client:Inferred freq: D\n",
"INFO:nixtla.nixtla_client:Querying model metadata...\n",
"INFO:nixtla.nixtla_client:Preprocessing dataframes...\n",
"INFO:nixtla.nixtla_client:Calling Forecast Endpoint...\n"
]
}
],
"source": [
"# Forecast with TimeGPT\n",
"fcst_timegpt = nixtla_client.forecast(df = df_train,\n",
" target_col = 'y', \n",
" h=28, # Forecast horizon, predicts the next 28 time steps\n",
" model='timegpt-1-long-horizon', # Use the model for long-horizon forecasting\n",
" finetune_steps=10, # Number of finetuning steps\n",
" level = [90]) # Generate a 90% confidence interval"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"metric\n",
"rmse 592.607378\n",
"smape 0.049403\n",
"Name: TimeGPT, dtype: float64"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Evaluate performance and plot forecast\n",
"fcst_timegpt['ds'] = pd.to_datetime(fcst_timegpt['ds'])\n",
"test_df = pd.merge(df_test, fcst_timegpt, 'left', ['unique_id', 'ds'])\n",
"evaluation_timegpt = evaluate(test_df, metrics=[rmse, smape], models=[\"TimeGPT\"])\n",
"evaluation_timegpt.groupby(['metric'])['TimeGPT'].mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Classical Models (ARIMA):\n",
"Next, we applied ARIMA, a traditional statistical model, to the same forecasting task. Classical models use historical trends and seasonality to make predictions by relying on linear assumptions. However, they struggled to capture the complex, non-linear patterns within the data, leading to lower accuracy compared to other approaches. Additionally, ARIMA was slower due to its iterative parameter estimation process, which becomes computationally intensive for larger datasets."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 📘 Why Use TimeGPT over Classical Models?\n",
">\n",
"> * **Complex Patterns**: TimeGPT captures non-linear trends classical models miss.\n",
">\n",
"> * **Minimal Preprocessing**: TimeGPT requires little to no data preparation.\n",
">\n",
"> * **Scalability**: TimeGPT can efficiently scales across multiple series without retraining."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| eval: false\n",
"from statsforecast import StatsForecast\n",
"from statsforecast.models import AutoARIMA"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| eval: false\n",
"#Initiate ARIMA model\n",
"sf = StatsForecast(\n",
" models=[AutoARIMA(season_length=7)],\n",
" freq='D'\n",
")\n",
"# Fit and forecast\n",
"fcst_arima = sf.forecast(h=28, df=df_train) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"fcst_arima = pd.read_csv('../../assets/arima_rst.csv', parse_dates=['ds'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"metric\n",
"rmse 724.957364\n",
"smape 0.055018\n",
"Name: AutoARIMA, dtype: float64"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fcst_arima.reset_index(inplace=True)\n",
"test_df = pd.merge(df_test, fcst_arima, 'left', ['unique_id', 'ds'])\n",
"evaluation_arima = evaluate(test_df, metrics=[rmse, smape], models=[\"AutoARIMA\"])\n",
"evaluation_arima.groupby(['metric'])['AutoARIMA'].mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 Machine Learning Models (LightGBM)\n",
"\n",
"Thirdly, we used a machine learning model, LightGBM, for the same forecasting task, implemented through the automated pipeline provided by our mlforecast library.\n",
"While LightGBM can capture seasonality and patterns, achieving the best performance often requires detailed feature engineering, careful hyperparameter tuning, and domain knowledge. You can try our mlforecast library to simplify this process and get started quickly!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 📘 Why Use TimeGPT over Machine Learning Models?\n",
">\n",
"> * **Automatic Pattern Recognition**: Captures complex patterns from raw data, bypassing the need for feature engineering.\n",
">\n",
"> * **Minimal Tuning**: Works well without extensive tuning.\n",
">\n",
"> * **Scalability**: Forecasts across multiple series without retraining."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| eval: false\n",
"import optuna\n",
"from mlforecast.auto import AutoMLForecast, AutoLightGBM\n",
"\n",
"# Suppress Optuna's logging output\n",
"optuna.logging.set_verbosity(optuna.logging.ERROR)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| eval: false\n",
"# Initialize an automated forecasting pipeline using AutoMLForecast.\n",
"mlf = AutoMLForecast(\n",
" models=[AutoLightGBM()],\n",
" freq='D',\n",
" season_length=7, \n",
" fit_config=lambda trial: {'static_features': ['unique_id']}\n",
")\n",
"\n",
"# Fit the model to the training dataset.\n",
"mlf.fit(\n",
" df=df_train.astype({'unique_id': 'category'}),\n",
" n_windows=1,\n",
" h=28,\n",
" num_samples=10,\n",
")\n",
"fcst_lgbm = mlf.predict(28)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"fcst_lgbm = pd.read_csv('../../assets/lgbm_rst.csv', parse_dates=['ds'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"metric\n",
"rmse 687.773744\n",
"smape 0.051448\n",
"Name: AutoLightGBM, dtype: float64"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_df = pd.merge(df_test, fcst_lgbm, 'left', ['unique_id', 'ds'])\n",
"evaluation_lgbm = evaluate(test_df, metrics=[rmse, smape], models=[\"AutoLightGBM\"])\n",
"evaluation_lgbm.groupby(['metric'])['AutoLightGBM'].mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 N-HiTS\n",
"\n",
"Lastly, we used N-HiTS, a state-of-the-art deep learning model designed for time series forecasting. The model produced accurate results, demonstrating its ability to capture complex, non-linear patterns within the data. However, setting up and tuning N-HiTS required significantly more time and computational resources compared to TimeGPT."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 📘 Why Use TimeGPT Over Deep Learning Models?\n",
">\n",
"> * **Faster Setup**: Quick setup and forecasting, unlike the lengthy configuration and training times of neural networks.\n",
">\n",
"> * **Less Tuning**: Performs well with minimal tuning and preprocessing, while neural networks often need extensive adjustments.\n",
">\n",
"> * **Ease of Use**: Simple deployment with high accuracy, making it accessible without deep technical expertise."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| eval: false\n",
"from neuralforecast.core import NeuralForecast\n",
"from neuralforecast.models import NHITS"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| eval: false\n",
"# Initialize the N-HiTS model.\n",
"models = [NHITS(h=28, \n",
" input_size=28, \n",
" max_steps=100)]\n",
"\n",
"# Fit the model using training data\n",
"nf = NeuralForecast(models=models, freq='D')\n",
"nf.fit(df=df_train)\n",
"fcst_nhits = nf.predict()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| hide\n",
"fcst_nhits = pd.read_csv('../../assets/nhits_rst.csv', parse_dates=['ds'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"metric\n",
"rmse 605.011948\n",
"smape 0.053446\n",
"Name: NHITS, dtype: float64"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_df = pd.merge(df_test,fcst_nhits, 'left', ['unique_id', 'ds'])\n",
"evaluation_nhits = evaluate(test_df, metrics=[rmse, smape], models=[\"NHITS\"])\n",
"evaluation_nhits.groupby(['metric'])['NHITS'].mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Performance Comparison and Results:\n",
"The performance of each model is evaluated using RMSE (Root Mean Squared Error) and SMAPE (Symmetric Mean Absolute Percentage Error). While RMSE emphasizes the models’ ability to control significant errors, SMAPE provides a relative performance perspective by normalizing errors as percentages. Below, we present a snapshot of performance across all groups. The results demonstrate that TimeGPT outperforms other models on both metrics.\n",
"\n",
"🌟 For a deeper dive into benchmarking, check out our benchmark repository. The summarized results are displayed below:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Overall Performance Metrics\n",
"\n",
"| **Model** | **RMSE** | **SMAPE** |\n",
"|------------------|----------|-----------|\n",
"| ARIMA | 724.9 | 5.50% |\n",
"| LightGBM | 687.8 | 5.14% |\n",
"| N-HiTS | 605.0 | 5.34% |\n",
"| **TimeGPT** | **592.6**| **4.94%** |\n",
" \n",
"\n",
"#### Breakdown for Each Time-series\n",
"Followed below are the metrics for each individual time series groups. TimeGPT consistently delivers accurate forecasts across all time series groups. In many cases, it performs as well as or better than data-specific models, showing its versatility and reliability across different datasets."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#| echo: false\n",
"evaluation_df = evaluation_arima.merge(evaluation_lgbm, on = ['unique_id','metric'], how = 'left')\\\n",
" .merge(evaluation_nhits, on = ['unique_id','metric'], how = 'left')\\\n",
" .merge(evaluation_timegpt, on = ['unique_id','metric'], how = 'left')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABW4AAAJOCAYAAAAnP56mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAClZklEQVR4nOzdd1xW9f//8efFBlkuQHKAI3FrmmaaI0lEU/Pr3iu1XJllRsNVScvStGypaImamWaO3CvFnFiaWRoqKmI5wIkC5/dHP66Pl4BCjOsSHvfb7dzqnPM+57zeh0t98bre531MhmEYAgAAAAAAAADYDDtrBwAAAAAAAAAAsEThFgAAAAAAAABsDIVbAAAAAAAAALAxFG4BAAAAAAAAwMZQuAUAAAAAAAAAG0PhFgAAAAAAAABsDIVbAAAAAAAAALAxFG4BAAAAAAAAwMZQuAUAAAAAAAAAG0PhFgDuQwEBAerXr5+1w4AV9evXTwEBAf/p2GbNmqlZs2a5Gg8AAEBOREREyGQy6fjx49YOBVZy/PhxmUwmRUREZPvYzZs3y2QyafPmzbkeF2BNFG6BAi4tAUpbHBwc9MADD6hfv346ffp0uvbNmjWTyWRSpUqVMjzfunXrzOf69ttvLfb9+uuv6tSpk8qVKycXFxc98MADeuKJJzR9+nSLdgEBARYx3b60atUqS/2Kj4/Xiy++qKCgILm5ualIkSKqW7eu3nzzTV26dClrNwd5rkuXLjKZTBo7dqy1Q8kzaZ/dp59+OsP9r776qrnNP//8k8/RAQCQv06fPq02bdrI09NTVatW1Q8//JCuzXfffScfHx8lJCSk25eamqp58+apQYMGKlasmDw8PPTggw+qT58+2rlzp7ldWpHGZDLp66+/zjCWRo0ayWQyqXr16hnuT0lJkb+/v0wmk1avXp1hmwkTJljkqm5ubqpatapee+01JSYmmtvdmXPfudwe+90sXbpUoaGhKlGihJycnOTv768uXbpo48aNWToeee/w4cMymUxycXEpsL93pH3u7ezsFBsbm25/YmKiXF1dZTKZNHz4cCtECBQeDtYOAED+mDRpkgIDA3Xjxg3t3LlTERER+umnn3Tw4EG5uLhYtHVxcdHRo0e1a9cu1a9f32Lf/Pnz5eLiohs3blhs37Fjh5o3b66yZctq0KBB8vPzU2xsrHbu3Klp06ZpxIgRFu1r166tF154IV2c/v7+9+zL7t271bp1a125ckW9evVS3bp1JUl79uzR22+/ra1bt2rt2rVZui/3qyNHjsjOzra/e0tMTNQPP/yggIAALViwQG+//bZMJpO1w8oTLi4uWrJkiT755BM5OTlZ7FuwYEGGf2YAACiI+vbtq9OnT+udd97R9u3b1blzZ/3+++/mp0Ru3LihF198UW+++aa8vLzSHT9y5Eh9/PHHat++vXr27CkHBwcdOXJEq1evVvny5fXII49YtHdxcVFkZKR69eplsf348ePasWNHujz3dhs3blRcXJwCAgI0f/58hYaGZtp25syZcnd315UrV7R27Vq99dZb2rhxo7Zv326R36Tl3HeqWLFipueWJMMwNGDAAEVERKhOnToaPXq0/Pz8FBcXp6VLl6pFixbavn27Hn300bue537Wu3dvdevWTc7OztYO5a6+/vpr+fn56eLFi/r2228z/fK+IHB2dtaCBQv00ksvWWz/7rvvrBQRUPhQuAUKidDQUNWrV0+S9PTTT6tEiRJ65513tHz5cnXp0sWibYUKFZScnKwFCxZYFG5v3LihpUuXqk2bNlqyZInFMW+99Za8vLy0e/dueXt7W+w7d+5cungeeOCBdAl2Vly6dEkdOnSQvb299u/fr6CgoHRxfPHFF9k+7/3AMAzduHFDrq6uNp/QStKSJUuUkpKi2bNn6/HHH9fWrVvVtGnTXDn31atXVaRIkVw5V25o1aqVli9frtWrV6t9+/bm7Tt27FBMTIw6duyY7s8MAAAFzfXr17Vx40Zt3rxZTZo00TPPPKMdO3ZozZo1GjJkiCTp/fffl5eXV4bFrvj4eH3yyScaNGiQPv/8c4t9U6dO1d9//53umNatW2v58uX6559/VKJECfP2yMhI+fr6qlKlSrp48WKG8X799dd66KGH1LdvX73yyit3zS86depkPv8zzzyjjh076rvvvtPOnTvVsGFDc7vbc+7smDJliiIiIjRq1Ch98MEHFsXgV199VV999ZUcHArmr+9p993e3l729vbWDueuDMNQZGSkevTooZiYGM2fPz/XCrepqam6efPmXb9syG+tW7fOsHAbGRmZ4e+EAHKfbQ/XApBnHnvsMUnSsWPHMtzfvXt3LVq0SKmpqeZtP/zwg65du5au0Jt2nmrVqqUr2kqSj49P7gQt6bPPPtPp06f1wQcfpCvaSpKvr69ee+01i22ffPKJqlWrJmdnZ/n7+2vYsGHpHmtq1qyZqlevrl9++UVNmzaVm5ubKlasaJ4OYsuWLWrQoIFcXV1VuXJlrV+/3uL4tMeJfv/9d3Xp0kWenp4qXry4nnvuuXQjLefMmaPHH39cPj4+cnZ2VtWqVTVz5sx0fQkICNCTTz6pNWvWqF69enJ1ddVnn31m3nf7HLe3bt3SxIkTValSJbm4uKh48eJq3Lix1q1bZ3HOjRs36rHHHlORIkXk7e2t9u3b6/Dhwxn25ejRo+rXr5+8vb3l5eWl/v3769q1axn8VDI2f/58PfHEE2revLmqVKmi+fPnZ9gu7Z6VLFnSfH9fffXVdPH89ttv6tGjh4oWLarGjRtLkpKTk/XGG2+oQoUKcnZ2VkBAgF555RUlJSVZXGPPnj0KCQlRiRIl5OrqqsDAQA0YMMCizcKFC1W3bl15eHjI09NTNWrU0LRp07LU1wceeEBNmjRRZGRkuntQo0aNTB/RXLx4serWrStXV1eVKFFCvXr1ynAKk2XLlql69epycXFR9erVtXTp0gzPl5qaqqlTp6patWpycXGRr6+vhgwZkukvrLebPn26qlWrJjc3NxUtWlT16tVL1x8AAO7mxo0bMgxDRYsWlfTvdELe3t7m/OH06dN6++23NW3atAyfHIqJiZFhGGrUqFG6fSaTKcOcsn379nJ2dtbixYsttkdGRqpLly6ZFgKvX7+upUuXqlu3burSpYuuX7+u77//Pst9ffzxx80x59T169cVHh6uoKAgvf/++xk+odS7d2+LARV//fWXOnfurGLFisnNzU2PPPKIVq5caXFM2nQS33zzjSZOnKgHHnhAHh4e6tSpkxISEpSUlKRRo0bJx8dH7u7u6t+/f7ocKu1R+Pnz56ty5cpycXFR3bp1tXXrVot2J06c0NChQ1W5cmW5urqqePHi6ty5c7r5atOmlNiyZYuGDh0qHx8flS5d2mLf7cdkJYe7evWqXnjhBZUpU0bOzs6qXLmy3n//fRmGkWFf0vIqZ2dnVatWTT/++OPdf0C32b59u44fP65u3bqpW7du2rp1q06dOpWuXWpqqqZNm6YaNWrIxcVFJUuWVKtWrbRnz54M723a7yppsezfv1+hoaHy9PSUu7u7WrRokW66jazk/2fPnlX//v1VunRpOTs7q1SpUmrfvn2W5xHu0aOHoqOj9fvvv1ucc+PGjerRo0eGx5w7d04DBw6Ur6+vXFxcVKtWLc2dOzddu0uXLqlfv37y8vKSt7e3+vbtm+nUE7///rs6deqkYsWKycXFRfXq1dPy5cvvGf+ff/6pjh07ys/PTy4uLipdurS6deuW4TQtgK0qmF/ZAbintH+s0xLrO/Xo0UMTJkzQ5s2bzYlpZGSkWrRokWHSXK5cOUVFRengwYOZFqlud+vWrQzn+yxSpIhcXV0zPW758uVydXVVp06d7nkN6d+i38SJExUcHKxnn31WR44c0cyZM7V7925t375djo6O5rYXL17Uk08+qW7duqlz586aOXOmunXrpvnz52vUqFF65pln1KNHD7333nvq1KmTYmNj5eHhYXG9Ll26KCAgQOHh4dq5c6c++ugjXbx4UfPmzTO3mTlzpqpVq6Z27drJwcFBP/zwg4YOHarU1FQNGzbM4nxHjhxR9+7dNWTIEA0aNEiVK1fOtJ/h4eF6+umnVb9+fSUmJmrPnj3at2+fnnjiCUnS+vXrFRoaqvLly2vChAm6fv26pk+frkaNGmnfvn3pXnTVpUsXBQYGKjw8XPv27dOXX34pHx8fvfPOO/e872fOnNGmTZvMSVr37t314YcfasaMGRZTCfzyyy967LHH5OjoqMGDBysgIEDHjh3TDz/8oLfeesvinJ07d1alSpU0efJkcyL+9NNPa+7cuerUqZNeeOEF/fzzzwoPD9fhw4fNxc1z586pZcuWKlmypF5++WV5e3vr+PHjFo94rVu3Tt27d1eLFi3M/Tt8+LC2b9+u55577p79lf79M/Pcc8/pypUrcnd3V3JyshYvXqzRo0dnOE1CRESE+vfvr4cffljh4eGKj4/XtGnTtH37du3fv9/8JcjatWvVsWNHVa1aVeHh4Tp//rw5Ab/TkCFDzOcdOXKkYmJiNGPGDO3fvz/d5/12X3zxhUaOHKlOnTqZv2z45Zdf9PPPP2ealAMAcKeiRYuqQoUKmjx5siZPnqwdO3YoOjra/L6Dl156SaGhoWrSpEmGx5crV07Sv19sdu7cWW5ubve8ppubm9q3b68FCxbo2WeflSQdOHBAhw4d0pdffqlffvklw+OWL1+uK1euqFu3bvLz81OzZs00f/78LP+7lzb4oXjx4hbbExIS0uW4JpMpXbvb/fTTT7pw4YJGjRqVpRGn8fHxevTRR3Xt2jWNHDlSxYsX19y5c9WuXTt9++236tChg0X78PBwubq66uWXX9bRo0c1ffp0OTo6ys7OThcvXtSECRPMU6kFBgZq3LhxFsdv2bJFixYt0siRI+Xs7KxPPvlErVq10q5du8x5/+7du7Vjxw5169ZNpUuX1vHjxzVz5kw1a9ZMv/32W7qf5dChQ1WyZEmNGzdOV69ezbCfWcnhDMNQu3bttGnTJg0cOFC1a9fWmjVrNGbMGJ0+fVoffvhhunv93XffaejQofLw8NBHH32kjh076uTJk3f9GaWZP3++KlSooIcffljVq1eXm5ubFixYoDFjxli0GzhwoCIiIhQaGqqnn35aycnJ2rZtm3bu3GkxInvjxo365ptvNHz4cJUoUUIBAQE6dOiQHnvsMXl6euqll16So6OjPvvsMzVr1sw8mETKWv7fsWNHHTp0SCNGjFBAQIDOnTundevW6eTJk1l6yW2TJk1UunRpRUZGatKkSZKkRYsWyd3dXW3atEnX/vr162rWrJmOHj2q4cOHKzAwUIsXL1a/fv106dIlc15tGIbat2+vn376Sc8884yqVKmipUuXqm/fvunOeejQITVq1EgPPPCAXn75ZRUpUkTffPONnnrqKS1ZsiTd5z3NzZs3FRISoqSkJI0YMUJ+fn46ffq0VqxYoUuXLmU4VQtgkwwABdqcOXMMScb69euNv//+24iNjTW+/fZbo2TJkoazs7MRGxtr0b5p06ZGtWrVDMMwjHr16hkDBw40DMMwLl68aDg5ORlz5841Nm3aZEgyFi9ebD5u7dq1hr29vWFvb280bNjQeOmll4w1a9YYN2/eTBdTuXLlDEkZLuHh4XftT9GiRY1atWplqe/nzp0znJycjJYtWxopKSnm7TNmzDAkGbNnz7botyQjMjLSvO333383JBl2dnbGzp07zdvXrFljSDLmzJlj3jZ+/HhDktGuXTuLGIYOHWpIMg4cOGDedu3atXSxhoSEGOXLl7fYlnaffvzxx3Tty5UrZ/Tt29e8XqtWLaNNmzZ3uRuGUbt2bcPHx8c4f/68eduBAwcMOzs7o0+fPun6MmDAAIvjO3ToYBQvXvyu10jz/vvvG66urkZiYqJhGIbxxx9/GJKMpUuXWrRr0qSJ4eHhYZw4ccJie2pqarp4unfvbtEmOjrakGQ8/fTTFttffPFFQ5KxceNGwzAMY+nSpYYkY/fu3ZnG+9xzzxmenp5GcnJylvp3O0nGsGHDjAsXLhhOTk7GV199ZRiGYaxcudIwmUzG8ePHzX34+++/DcMwjJs3bxo+Pj5G9erVjevXr5vPtWLFCkOSMW7cOPO22rVrG6VKlTIuXbpk3rZ27VpDklGuXDnztm3bthmSjPnz51vE9+OPP6bb3rRpU6Np06bm9fbt25v/3AMAkBMbNmwwihYtas7tRo0aZRiGYWzfvt1wdXU1jh8/ftfj+/TpY0gyihYtanTo0MF4//33jcOHD6drd3s+umLFCsNkMhknT540DMMwxowZY86rbs9tb/fkk08ajRo1Mq9//vnnhoODg3Hu3DmLdmn/hh85csT4+++/jZiYGOOzzz4znJ2dDV9fX+Pq1auGYfwv585ocXZ2vmufp02blmGelJlRo0YZkoxt27aZt12+fNkIDAw0AgICzHlv2j2qXr26RU7evXt3w2QyGaGhoRbnbdiwoUVuYRiGuQ979uwxbztx4oTh4uJidOjQwbwto/w2KirKkGTMmzfPvC3tPjVu3Dhd3pW2LyYmxjCMrOVwy5YtMyQZb775psX2Tp06GSaTyTh69KhFX5ycnCy2HThwwJBkTJ8+PdNrpLl586ZRvHhx49VXXzVv69GjR7rfTTZu3GhIMkaOHJnuHLfnuGm/Zxw6dMiizVNPPWU4OTkZx44dM287c+aM4eHhYTRp0sS87V75/8WLFw1JxnvvvXfPvt3p9tz1xRdfNCpWrGje9/DDDxv9+/c392HYsGHmfVOnTjUkGV9//bV5282bN42GDRsa7u7u5t8N0n5u7777rrldcnKy8dhjj6X7PatFixZGjRo1jBs3bpi3paamGo8++qhRqVIl87a0z/umTZsMwzCM/fv3p/udFbgfMVUCUEgEBwerZMmSKlOmjDp16qQiRYpo+fLlGY7aS9OjRw999913unnzpr799lvZ29tn+o3mE088oaioKLVr104HDhzQu+++q5CQED3wwAMZPsbSoEEDrVu3Lt3SvXv3u/YjMTEx3SjXzKxfv143b97UqFGjLB7HGzRokDw9PdM9Tubu7q5u3bqZ1ytXrixvb29VqVLF/M12WuzSv4+o3enOEbNpL2VbtWqVedvtI4rTRmU0bdpUf/31V7rHdgIDAxUSEnLPvnp7e+vQoUP6888/M9wfFxen6Oho9evXT8WKFTNvr1mzpp544gmL+NI888wzFuuPPfaYzp8/b/EG5czMnz9fbdq0Mf+sKlWqpLp161pMl/D3339r69atGjBggMqWLWtxfEaPCN4ZT1rMo0ePttie9tK7tJ9v2sjVFStW6NatWxnG6+3tratXr6abWiI7ihYtqlatWmnBggWS/h2h/uijj5pHD91uz549OnfunIYOHWoxj1mbNm0UFBRkjj3t59a3b1+LUQFPPPGEqlatanHOxYsXy8vLS0888YT++ecf81K3bl25u7tr06ZNmcbu7e2tU6dOaffu3f+5/wAASP9OIXDy5Ent3LlTJ0+e1IcffqjU1FSNHDlSL7zwgsqVK6eZM2cqKChIlStX1qeffmpx/Jw5czRjxgwFBgZq6dKlevHFF1WlShW1aNEiw+mEJKlly5YqVqyYFi5cKMMwtHDhwrvmlOfPn9eaNWss2nTs2NE8rUBGKleurJIlSyowMFBDhgxRxYoVtXLlynQjST/++ON0+e3q1avves/Scqus5rirVq1S/fr1zVNHSf/msYMHD9bx48f122+/WbTv06ePxVM3DRo0ML8M7XYNGjRQbGyskpOTLbY3bNjQ/DJgSSpbtqzat2+vNWvWKCUlRZJlfnvr1i2dP39eFStWlLe3t/bt25euD4MGDbrn6OKs5HCrVq2Svb29Ro4cabH9hRdekGEY6e59cHCwKlSoYF6vWbOmPD09M8zr77R69WqdP3/e4nPTvXt38wjvNEuWLJHJZNL48ePTnePOHLdp06YWOV1KSorWrl2rp556SuXLlzdvL1WqlHr06KGffvrJ/Hm5V/7v6uoqJycnbd68OUvTZmWmR48eOnr0qHbv3m3+b2Yj01etWiU/Pz+Le+To6KiRI0fqypUr2rJli7mdg4ODeZS8JNnb26d7ofWFCxe0ceNGdenSRZcvXzbnt+fPn1dISIj+/PPPTP9eSMud16xZk63p3gBbQ+EWKCTSkshvv/1WrVu31j///HPPF1ylzf+zevVqzZ8/X08++eRdE8qHH35Y3333nS5evKhdu3YpLCxMly9fVqdOndIlkCVKlFBwcHC6JaMi1+08PT11+fLlLPX5xIkTkpRuegEnJyeVL1/evD9N6dKl0yVTXl5eKlOmTLptkjJMgCpVqmSxXqFCBdnZ2VnMI7V9+3YFBweb55ktWbKkXnnlFUnKsHCbFZMmTdKlS5f04IMPqkaNGhozZozFo4GZ3QtJqlKliv755590j6ndWUxNm1bjXonf4cOHtX//fjVq1EhHjx41L82aNdOKFSvMyWZagpyVqTWk9PfixIkTsrOzS/eWZj8/P3l7e5v73LRpU3Xs2FETJ05UiRIl1L59e82ZM8diDrehQ4fqwQcfVGhoqEqXLq0BAwZka76zND169DA/frZs2bJMk9q7/TyCgoLM+9P+e+fnKqNj//zzTyUkJMjHx0clS5a0WK5cuZLhSwLTjB07Vu7u7qpfv74qVaqkYcOGafv27VnrNAAAd3B3d1eDBg3MOdScOXN09uxZvfzyy1q/fr3GjBmjt99+W++++65eeOEFiy8X7ezsNGzYMO3du1f//POPvv/+e4WGhmrjxo0WX7DfztHRUZ07d1ZkZKS2bt2q2NjYu055sGjRIt26dUt16tQx5ykXLlxQgwYNMp2Tf8mSJVq3bp02b96so0eP6uDBgxbFzDT169dPl982b978rvfL09NTkrKV42aW06Xtv92dOV1aLptRjpuampouH80oD3nwwQd17do18wvjrl+/rnHjxpnnmS1RooRKliypS5cuZTifaFZy3KzkcCdOnJC/v3+631Gyei+kf3PcrBQ2v/76awUGBsrZ2dn8ualQoYLc3NwsPjfHjh2Tv7+/xWCJzNx5H/7++29du3Yt059vamqqYmNjJd07/3d2dtY777yj1atXy9fXV02aNNG7776rs2fP3jOu29WpU0dBQUGKjIzU/Pnz5efnZ55K704nTpxQpUqV0s1hfefP48SJEypVqpTc3d0t2t3Z76NHj8owDL3++uvp8tu0wnhmOW5gYKBGjx6tL7/8UiVKlFBISIg+/vhj5rfFfYfCLVBIpCWRHTt21PLly1W9enX16NFDV65cyfSYUqVKqVmzZpoyZYq2bt2a5Tm/nJyc9PDDD2vy5MmaOXOmbt26le6FEf9VUFCQ/vjjD928eTNXzne7zL71z2y7cccLDzJyZyH42LFjatGihf755x998MEHWrlypdatW6fnn39ekixeBifprvP93q5JkyY6duyYZs+ererVq+vLL7/UQw89pC+//DJLx2fkv/b766+/liQ9//zzqlSpknmZMmWKbty48Z/fPpvZvchodO6d+7/9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qxZ5Pq/Ldg+zJCIiIlKPHUsdZuncmCwRERHZOHHiBO7evYty5cqhYP+uyWTSfx42bBisViuOHj36wOezuN3DLImIiIjUY8dSh1k6N6ZLRERE+OKLL3D79m0AQO3atXHq1CkkJSVB0zS9tGmaBgDw9/dHbm4u0tPTDRuvM2OWREREROqxY6nDLF0HJ26JiIhKuIyMDIwbNw5BQUFITU1FaGgoypcvjylTpuD69evQNA25ubn6+pcvX0bjxo0REBBg4KidE7MkIiIiUo8dSx1m6Vo4cUtERFTClS1bFhs3bkSVKlXQsWNH1KhRA0OGDMHnn3+OSZMm4dq1a3B3dwcA3LlzB2+//TbKli2LRo0aGTxy58MsiYiIiNRjx1KHWboW3pyMiIioBCu4mYDFYsGVK1fQp08flC9fHps3b8aMGTOwfPlyeHl54b//+7+RmpqKpKQk3LhxA0eOHIG7uztvRlAIsyQiIiJSjx1LHWbpepg2ERFRCXTr1i0A+TcTyMnJgZubG3x9fVG5cmXs3bsXPXr0wNSpUxEXF4eOHTti165duHbtGtq2bYujR4/C3d0dFouFxQ3MkoiIiMge2LHUYZaui0fcEhERlTD79+/H1KlTMX36dHTo0EFf3q9fP5w9exYLFizA+PHjYTKZsGfPHpQvXx5paWnw8fHR183Ly4PZbDZi+E6FWRIRERGpx46lDrN0bZwqJyIiKmGqVKkCEcF7772HI0eOAAD69u2L06dPY+fOnejSpQvWrFkDEUH79u1x69Ytm+IGgMXtV8ySiIiISD12LHWYpWvjEbdEREQlUGJiIsaMGQOz2Yy0tDRkZmZiy5YtqFOnjr7OmTNn0L17d3To0AGrVq0ybrBOjlkSERERqceOpQ6zdF2cuCUiIiqhEhMTMXLkSBw6dAhLlixBv379AMDmpgM//vgjatasyb3sv4NZEhEREanHjqUOs3RNnLglIiIqwZKSkjBq1CiYTCZMmjQJ7dq1A4Aid4zlda1+H7MkIiIiUo8dSx1m6Xo4cUtERFTCFZw6BQBTpkxB27ZtDR6R62KWREREROqxY6nDLF0Lb05GRERUwvn7++PDDz+E2WxGREQE4uPjjR6Sy2KWREREROqxY6nDLF0LJ26JiIgI/v7+mDt3Ljp06IDAwECjh+PSmCURERGReuxY6jBL18FLJRAREVER91/nih4fsyQiIiJSjx1LHWbpvDhxS0RERERERERERORkOJ1ORERERERERERE5GQ4cUtERERERERERETkZDhxS0RERERERERERORkOHFLRERERERERERE5GQ4cUtERERERERERETkZDhxS0RERERERERERORkOHFLRERERERERERE5GQ4cUtERERERERERETkZDhxS0RERERERERERORkOHFLRERERERERERE5GT+HzoBJvoAFyV5AAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 1400x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# | echo: false\n",
"colors = [\n",
" (\"#A9B9C3\", 0.5), # Grey-bluish color 1\n",
" (\"#7A8D9D\", 0.5), # Grey-bluish color 2\n",
" (\"#5B6D79\", 0.5), # Grey-bluish color 3\n",
" ('#F95D6A', 0.75) # Green color for the last\n",
"]\n",
"\n",
"\n",
"# Filter evaluation data by metric and set unique_id as index\n",
"rmse_df = evaluation_df[evaluation_df['metric'] == 'rmse'].set_index('unique_id')\n",
"smape_df = evaluation_df[evaluation_df['metric'] == 'smape'].set_index('unique_id')\n",
"\n",
"# Plot function with custom colors and opacity\n",
"def plot_metric(ax, df, title, ylabel):\n",
" x = np.arange(len(df))\n",
" bar_width = 0.2\n",
" for i, (col, (color, alpha)) in enumerate(zip(df.columns[1:], colors)):\n",
" ax.bar(x + i * bar_width, df[col], width=bar_width, label=col, color=color, alpha=alpha)\n",
" ax.set(title=title, ylabel=ylabel, xticks=x + bar_width * (len(df.columns[1:]) - 1) / 2, xticklabels=df.index)\n",
" ax.tick_params(axis='x', rotation=45)\n",
" ax.legend()\n",
"\n",
"# Generate side-by-side plots for RMSE and SMAPE\n",
"fig, axes = plt.subplots(1, 2, figsize=(14, 6))\n",
"plot_metric(axes[0], rmse_df, \"RMSE Comparison Across Models\", \"RMSE\")\n",
"plot_metric(axes[1], smape_df*100, \"%SMAPE Comparison Across Models\", \"SMAPE\")\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Benchmark Results\n",
"For a more comprehensive dive into model accuracy and performance, explore our [Time Series Model Arena](https://github.com/Nixtla/nixtla/tree/main/experiments/foundation-time-series-arena)! TimeGPT continues to lead the pack with exceptional performance across benchmarks! 🌟\n",
"\n",
"<img src=\"https://github.com/Nixtla/nixtla/blob/main/nbs/img/timeseries_model_arena.png?raw=true\" alt=\"Benchmark\" />"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. Conclusion\n",
"At the end of this notebook, we’ve put together a handy table to show you exactly where TimeGPT shines brightest compared to other forecasting models. ☀️ Think of it as your quick guide to choosing the best model for your unique project needs. We’re confident that TimeGPT will be a valuable tool in your forecasting journey. Don’t forget to visit our [dashboard](https://dashboard.nixtla.io) to generate your TimeGPT `api_key` and get started today! Happy forecasting, and enjoy the insights ahead! "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"| Scenario | TimeGPT | Classical Models (e.g., ARIMA) | Machine Learning Models (e.g., XGB, LGBM) | Deep Learning Models (e.g., N-HITS) |\n",
"|-----------------------------------|-------------------------------------------|-------------------------------------------------------|---------------------------------------------------------|-------------------------------------------------------|\n",
"| **Seasonal Patterns** | ✅ Performs well with minimal setup | ✅ Handles seasonality with adjustments (e.g., SARIMA) | ✅ Performs well with feature engineering | ✅ Captures seasonal patterns effectively |\n",
"| **Non-Linear Patterns** | ✅ Excels, especially with complex non-linear patterns | ❌ Limited performance | ❌ Struggles without extensive feature engineering | ✅ Performs well with non-linear relationships |\n",
"| **Large Dataset** | ✅ Highly scalable across many series | ❌ Slow and resource-intensive | ✅ Scalable with optimized implementations | ❌ Requires significant resources for large datasets |\n",
"| **Small Dataset** | ✅ Performs well; requires only one data point to start | ✅ Performs well; may struggle with very sparse data | ✅ Performs adequately if enough features are extracted | ❌ May need a minimum data size to learn effectively |\n",
"| **Preprocessing Required** | ✅ Minimal preprocessing needed | ❌ Requires scaling, log-transform, etc., to meet model assumptions | ❌ Requires extensive feature engineering for complex patterns | ❌ Needs data normalization and preprocessing |\n",
"| **Accuracy Requirement** | ✅ Achieves high accuracy with minimal tuning | ❌ May struggle with complex accuracy requirements | ✅ Can achieve good accuracy with tuning | ✅ High accuracy possible but with significant resource use |\n",
"| **Scalability** | ✅ Highly scalable with minimal task-specific configuration | ❌ Not easily scalable | ✅ Moderate scalability, with feature engineering and tuning per task | ❌ Limited scalability due to resource demands |\n",
"| **Computational Resources** | ✅ Highly efficient, operates seamlessly on CPU, no GPU needed | ✅ Light to moderate, scales poorly with large datasets | ❌ Moderate, depends on feature complexity | ❌ High resource consumption, often requires GPU |\n",
"| **Memory Requirement** | ✅ Efficient memory usage for large datasets | ✅ Moderate memory requirements | ❌ High memory usage for larger datasets or many series cases | ❌ High memory consumption for larger datasets and multiple series |\n",
"| **Technical Requirements & Domain Knowledge** | ✅ Low; minimal technical setup and no domain expertise needed | ✅ Low to moderate; needs understanding of stationarity | ❌ Moderate to high; requires feature engineering and tuning | ❌ High; complex architecture and tuning |\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TimeGPT Excel Add-in (Beta)\n",
"\n",
"## Installation\n",
"\n",
"Head to the [TimeGTP excel add-in page in Microsoft Appsource](https://appsource.microsoft.com/en-us/product/office/WA200006429?tab=Overview) and click on \"Get it now\"\n",
"\n",
"## Usage\n",
"> 📘 Access token required\n",
"> \n",
"> The TimeGPT Excel Add-in requires an access token. Get your API Key on the [Nixtla Dashboard](http://dashboard.nixtla.io).\n",
"\n",
"## Support\n",
"\n",
"If you have questions or need support, please email `support@nixtla.io`.\n",
"\n",
"## How-to\n",
"\n",
"### Settings\n",
"\n",
"If this is your first time using Excel add-ins, find information on how to add Excel add-ins with your version of Excel. In the Office Add-ins Store, you'll search for \"TimeGPT\". \n",
"\n",
"Once you have installed the TimeGPT add-in, the add-in comes up in a sidebar task pane. \n",
"* Read through the Welcome screen.\n",
"* Click on the **'Get Started'** button.\n",
"* The API URL is already set to: https://api.nixtla.io.\n",
"* Copy your API key from [Nixtla Dashboard](http://dashboard.nixtla.io). Paste it into the box that say **API Key, Bearer**.\n",
"* Click the gray arrow next to that box on the right. \n",
"* You'll get to a screen with options for 'Forecast' and 'Anomaly Detection'.\n",
"\n",
"To access the settings later, click the gear icon in the top left.\n",
"\n",
"### Data Requirements\n",
"\n",
"* Put your dates in one column and your values in another.\n",
"* Ensure your date format is recognized as a valid date by excel.\n",
"* Ensure your values are recognized as valid number by excel.\n",
"* All data inputs must exist in the same worksheet. The add-in does not support forecasting using multiple worksheets.\n",
"* Do not include headers\n",
"\n",
"Example:\n",
"\n",
"| dates | values | \n",
"| :------------- | :----- | \n",
"| 12/1/16 0:00 | 72 | \n",
"| 12/1/16 1:00 | 65.8 | \n",
"| 12/1/16 2:00 | 59.99 | \n",
"| 12/1/16 3:00 | 50.69 | \n",
"| 12/1/16 4:00 | 52.58 | \n",
"| 12/1/16 5:00 | 65.05 | \n",
"| 12/1/16 6:00 | 80.4 | \n",
"| 12/1/16 7:00 | 200 | \n",
"| 12/1/16 8:00 | 200.63 | \n",
"| 12/1/16 9:00 | 155.47 | \n",
"| 12/1/16 10:00 | 150.91 | \n",
"\n",
"#### Forecasting\n",
"\n",
"Once you've configured your token and formatted your input data then you're all ready to forecast!\n",
"\n",
"With the add-in open, configure the forecasting settings by selecting the column for each input.\n",
"\n",
"* **Frequency** - The frequency of the data (hourly / daily / weekly / monthly)\n",
"\n",
"* **Horizon** - The forecasting horizon. This represents the number of time steps into the future that the forecast should predict.\n",
"\n",
"* **Dates Range** - The column and range of the timeseries timestamps. Must not include header data, and should be formatted as a range, e.g. A2:A145. \n",
"\n",
"* **Values Range** - The column and range of the timeseries values for each point in time. Must not include header data, and should be formatted as a range, e.g. B2:B145. \n",
"\n",
"\n",
"\n",
"\n",
"\n",
"When you're ready, click **Make Prediction** to generate the predicted values. The add-in will generate a plot and append the forecasted data to the end of the column of your existing data and highlight them in green. So, scroll to the end of your data to see the predicted values. \n",
"\n",
"\n",
"\n",
"#### Anomaly Detection\n",
"\n",
"The requirements are the same as for the forecasting functionality, so if you already tried it you are ready to run the anomaly detection one. Go to the main page in the add-in and select \"Anomaly Detection\", then choose your dates and values cell ranges and click on submit. We'll run the model and mark the anomalies cells in yellow while adding a third column for expected values with a green background.\n",
"\n",
"\n",
"\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "python3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TimeGPT in R\n",
"\n",
"TimeGPT is also available in R through the `nixtlar` package, which is available on CRAN. This package can be used in a way almost identical to its Python counterpart. It offers nearly the same functionalities, with missing features and documentation currently under development. Originally developed in Python, TimeGPT is now accessible to the R community through `nixtlar`, providing access to the first foundation model for time series forecasting and embracing our core philosophy that _the future is for everybody_."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"https://github.com/Nixtla/nixtla/blob/main/nbs/img/logo_nixtlar.png?raw=true\" alt=\"Logo for nixtlar\" width=\"700\" />"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## How to use \n",
"\n",
"To learn how to use `nixtlar`, please refer to the [documentation](https://nixtla.github.io/nixtlar/). \n",
"\n",
"To view directly on CRAN, please use this [link](https://cloud.r-project.org/web/packages/nixtlar/index.html). "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 📘 API key required\n",
"> \n",
"> The `nixtlar` package requires an API key. Get yours on the [Nixtla Dashboard](http://dashboard.nixtla.io).\n",
"\n",
"## Support\n",
"\n",
"If you have questions or need support, please email `support@nixtla.io`."
]
}
],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 2
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment