分类变量
分类变量是可能影响预测的外部因素。这些变量取有限的、固定数量的可能值之一,并对观测数据进行分组。
例如,如果您正在预测零售商的每日产品需求,您可以从一个事件变量中受益,该变量可能告诉您在特定日期发生了什么样的事件,例如“无”、“体育”或“文化”事件。
要在 TimeGPT 中整合分类变量,您需要将时间序列数据中的每个点与相应的外部数据配对。
1. 导入包
首先,我们安装并导入所需的包并初始化 Nixtla 客户端。
👍 使用 Azure AI 端点
要使用 Azure AI 端点,请记住也要设置
base_url参数
nixtla_client = NixtlaClient(base_url="you azure ai endpoint", api_key="your api_key")
2. 加载 M5 数据
我们来看一个预测 M5 数据集 中产品销售的例子。M5 数据集包含美国 10 家零售店的每日产品需求(销售额)。
首先,我们使用 datasetsforecast 加载数据。这将返回
Y_df,包含每个唯一产品(unique_id列)在每个时间戳(ds列)的销售额(y列)。X_df,包含每个唯一产品(unique_id列)在每个时间戳(ds列)的额外相关信息。
| unique_id | ds | y | |
|---|---|---|---|
| 0 | FOODS_1_001_CA_1 | 2011-01-29 | 3.0 |
| 1 | FOODS_1_001_CA_1 | 2011-01-30 | 0.0 |
| 2 | FOODS_1_001_CA_1 | 2011-01-31 | 0.0 |
| 3 | FOODS_1_001_CA_1 | 2011-02-01 | 1.0 |
| 4 | FOODS_1_001_CA_1 | 2011-02-02 | 4.0 |
| 5 | FOODS_1_001_CA_1 | 2011-02-03 | 2.0 |
| 6 | FOODS_1_001_CA_1 | 2011-02-04 | 0.0 |
| 7 | FOODS_1_001_CA_1 | 2011-02-05 | 2.0 |
| 8 | FOODS_1_001_CA_1 | 2011-02-06 | 0.0 |
| 9 | FOODS_1_001_CA_1 | 2011-02-07 | 0.0 |
对于此示例,我们将只保留 event_type_1 列中的额外相关信息。此列是一个分类变量,指示在某个日期是否发生了可能影响产品销售的重要事件。
| unique_id | ds | event_type_1 | |
|---|---|---|---|
| 0 | FOODS_1_001_CA_1 | 2011-01-29 | nan |
| 1 | FOODS_1_001_CA_1 | 2011-01-30 | nan |
| 2 | FOODS_1_001_CA_1 | 2011-01-31 | nan |
| 3 | FOODS_1_001_CA_1 | 2011-02-01 | nan |
| 4 | FOODS_1_001_CA_1 | 2011-02-02 | nan |
| 5 | FOODS_1_001_CA_1 | 2011-02-03 | nan |
| 6 | FOODS_1_001_CA_1 | 2011-02-04 | nan |
| 7 | FOODS_1_001_CA_1 | 2011-02-05 | nan |
| 8 | FOODS_1_001_CA_1 | 2011-02-06 | 体育 |
| 9 | FOODS_1_001_CA_1 | 2011-02-07 | nan |
正如您所见,在 2011 年 2 月 6 日,有一个体育赛事。
3. 使用分类变量预测产品需求
我们将只预测单个产品的需求。我们选择一个由 FOODS_3_090_CA_3 标识的高销量食品产品。
我们合并两个数据框以创建将在 TimeGPT 中使用的数据集。
| unique_id | ds | y | event_type_1 | |
|---|---|---|---|---|
| 0 | FOODS_3_090_CA_3 | 2011-01-29 | 108.0 | nan |
| 1 | FOODS_3_090_CA_3 | 2011-01-30 | 132.0 | nan |
| 2 | FOODS_3_090_CA_3 | 2011-01-31 | 102.0 | nan |
| 3 | FOODS_3_090_CA_3 | 2011-02-01 | 120.0 | nan |
| 4 | FOODS_3_090_CA_3 | 2011-02-02 | 106.0 | nan |
| 5 | FOODS_3_090_CA_3 | 2011-02-03 | 123.0 | nan |
| 6 | FOODS_3_090_CA_3 | 2011-02-04 | 279.0 | nan |
| 7 | FOODS_3_090_CA_3 | 2011-02-05 | 175.0 | nan |
| 8 | FOODS_3_090_CA_3 | 2011-02-06 | 186.0 | 体育 |
| 9 | FOODS_3_090_CA_3 | 2011-02-07 | 120.0 | nan |
为了在 TimeGPT 中使用分类变量,需要对变量进行数值编码。在本教程中,我们将使用独热编码。
我们可以使用 pandas 内置的 get_dummies 功能对 event_type_1 列进行独热编码。对 event_type_1 变量进行独热编码后,我们可以将其添加到数据框中并删除原始列。
| unique_id | ds | y | 文化 | 国家 | 宗教 | 体育 | nan | |
|---|---|---|---|---|---|---|---|---|
| 1959 | FOODS_3_090_CA_3 | 2016-06-10 | 140.0 | 0 | 0 | 0 | 0 | 1 |
| 1960 | FOODS_3_090_CA_3 | 2016-06-11 | 151.0 | 0 | 0 | 0 | 0 | 1 |
| 1961 | FOODS_3_090_CA_3 | 2016-06-12 | 87.0 | 0 | 0 | 0 | 0 | 1 |
| 1962 | FOODS_3_090_CA_3 | 2016-06-13 | 67.0 | 0 | 0 | 0 | 0 | 1 |
| 1963 | FOODS_3_090_CA_3 | 2016-06-14 | 50.0 | 0 | 0 | 0 | 0 | 1 |
| 1964 | FOODS_3_090_CA_3 | 2016-06-15 | 58.0 | 0 | 0 | 0 | 0 | 1 |
| 1965 | FOODS_3_090_CA_3 | 2016-06-16 | 116.0 | 0 | 0 | 0 | 0 | 1 |
| 1966 | FOODS_3_090_CA_3 | 2016-06-17 | 124.0 | 0 | 0 | 0 | 0 | 1 |
| 1967 | FOODS_3_090_CA_3 | 2016-06-18 | 167.0 | 0 | 0 | 0 | 0 | 1 |
| 1968 | FOODS_3_090_CA_3 | 2016-06-19 | 118.0 | 0 | 0 | 0 | 1 | 0 |
正如您所见,我们现在添加了 5 列,每列都有一个二进制指标(1 或 0),指示当天是否存在文化、国家、宗教、体育或无(nan)事件。例如,在 2016 年 6 月 19 日,有一个体育赛事。
接下来我们进行预测任务。我们将预测 2016 年 2 月的前 7 天。这包括 2016 年 2 月 7 日——第 50 届超级碗 举办的日期。此类大型全国性事件通常会影响零售产品的销售。
要在 TimeGPT 中使用编码后的分类变量,我们需要将它们作为未来值添加。因此,我们创建一个未来值数据框,其中包含 unique_id、时间戳 ds 和编码后的分类变量。
当然,我们删除了目标列,因为这通常是不可用的——这是我们寻求预测的数量!
| unique_id | ds | 文化 | 国家 | 宗教 | 体育 | nan | |
|---|---|---|---|---|---|---|---|
| 1829 | FOODS_3_090_CA_3 | 2016-02-01 | 0 | 0 | 0 | 0 | 1 |
| 1830 | FOODS_3_090_CA_3 | 2016-02-02 | 0 | 0 | 0 | 0 | 1 |
| 1831 | FOODS_3_090_CA_3 | 2016-02-03 | 0 | 0 | 0 | 0 | 1 |
| 1832 | FOODS_3_090_CA_3 | 2016-02-04 | 0 | 0 | 0 | 0 | 1 |
| 1833 | FOODS_3_090_CA_3 | 2016-02-05 | 0 | 0 | 0 | 0 | 1 |
| 1834 | FOODS_3_090_CA_3 | 2016-02-06 | 0 | 0 | 0 | 0 | 1 |
| 1835 | FOODS_3_090_CA_3 | 2016-02-07 | 0 | 0 | 0 | 1 | 0 |
接下来,我们将输入数据框限制为除这 7 个预测日之外的所有数据
| unique_id | ds | y | 文化 | 国家 | 宗教 | 体育 | nan | |
|---|---|---|---|---|---|---|---|---|
| 1819 | FOODS_3_090_CA_3 | 2016-01-22 | 94.0 | 0 | 0 | 0 | 0 | 1 |
| 1820 | FOODS_3_090_CA_3 | 2016-01-23 | 144.0 | 0 | 0 | 0 | 0 | 1 |
| 1821 | FOODS_3_090_CA_3 | 2016-01-24 | 146.0 | 0 | 0 | 0 | 0 | 1 |
| 1822 | FOODS_3_090_CA_3 | 2016-01-25 | 87.0 | 0 | 0 | 0 | 0 | 1 |
| 1823 | FOODS_3_090_CA_3 | 2016-01-26 | 73.0 | 0 | 0 | 0 | 0 | 1 |
| 1824 | FOODS_3_090_CA_3 | 2016-01-27 | 62.0 | 0 | 0 | 0 | 0 | 1 |
| 1825 | FOODS_3_090_CA_3 | 2016-01-28 | 64.0 | 0 | 0 | 0 | 0 | 1 |
| 1826 | FOODS_3_090_CA_3 | 2016-01-29 | 102.0 | 0 | 0 | 0 | 0 | 1 |
| 1827 | FOODS_3_090_CA_3 | 2016-01-30 | 113.0 | 0 | 0 | 0 | 0 | 1 |
| 1828 | FOODS_3_090_CA_3 | 2016-01-31 | 98.0 | 0 | 0 | 0 | 0 | 1 |
我们首先调用 forecast 方法,不包含分类变量。
| unique_id | ds | TimeGPT | TimeGPT-lo-90 | TimeGPT-lo-80 | TimeGPT-hi-80 | TimeGPT-hi-90 | |
|---|---|---|---|---|---|---|---|
| 0 | FOODS_3_090_CA_3 | 2016-02-01 | 73.304092 | 53.449049 | 54.795078 | 91.813107 | 93.159136 |
| 1 | FOODS_3_090_CA_3 | 2016-02-02 | 66.335518 | 47.510669 | 50.274136 | 82.396899 | 85.160367 |
| 2 | FOODS_3_090_CA_3 | 2016-02-03 | 65.881630 | 36.218617 | 41.388896 | 90.374364 | 95.544643 |
| 3 | FOODS_3_090_CA_3 | 2016-02-04 | 72.371864 | -26.683115 | 25.097362 | 119.646367 | 171.426844 |
| 4 | FOODS_3_090_CA_3 | 2016-02-05 | 95.141045 | -2.084882 | 34.027078 | 156.255011 | 192.366971 |
📘 Azure AI 中可用的模型
如果您使用 Azure AI 端点,请务必设置
model="azureai"
nixtla_client.forecast(..., model="azureai")对于公共 API,我们支持两个模型:
timegpt-1和timegpt-1-long-horizon。默认情况下使用
timegpt-1。关于何时以及如何使用timegpt-1-long-horizon,请参阅本教程。
我们绘制了预测结果和预测期前的最后 28 天数据
TimeGPT 已经提供了合理的预测,但似乎对 2016 年 2 月 6 日的峰值(超级碗前一天)有所低估。
我们再次调用 forecast 方法,这次是包含分类变量的。
| unique_id | ds | TimeGPT | TimeGPT-lo-90 | TimeGPT-lo-80 | TimeGPT-hi-80 | TimeGPT-hi-90 | |
|---|---|---|---|---|---|---|---|
| 0 | FOODS_3_090_CA_3 | 2016-02-01 | 70.661271 | -0.204378 | 14.593348 | 126.729194 | 141.526919 |
| 1 | FOODS_3_090_CA_3 | 2016-02-02 | 65.566941 | -20.394326 | 11.654239 | 119.479643 | 151.528208 |
| 2 | FOODS_3_090_CA_3 | 2016-02-03 | 68.510010 | -33.713710 | 6.732952 | 130.287069 | 170.733731 |
| 3 | FOODS_3_090_CA_3 | 2016-02-04 | 75.417710 | -40.974649 | 4.751767 | 146.083653 | 191.810069 |
| 4 | FOODS_3_090_CA_3 | 2016-02-05 | 97.340302 | -57.385361 | 18.253812 | 176.426792 | 252.065965 |
📘 Azure AI 中可用的模型
如果您使用 Azure AI 端点,请务必设置
model="azureai"
nixtla_client.forecast(..., model="azureai")对于公共 API,我们支持两个模型:
timegpt-1和timegpt-1-long-horizon。默认情况下使用
timegpt-1。关于何时以及如何使用timegpt-1-long-horizon,请参阅本教程。
我们绘制了预测结果和预测期前的最后 28 天数据
我们可以通过视觉验证,预测结果更接近实际观测值,这是在预测中包含分类变量的结果。
我们通过计算我们创建的预测的平均绝对误差来验证这一结论。
| unique_id | TimeGPT-无分类变量 | TimeGPT-有分类变量 | |
|---|---|---|---|
| 0 | FOODS_3_090_CA_3 | 24.285649 | 20.028514 |
确实,我们发现使用包含分类变量的 TimeGPT 时,误差比不包含分类变量的 TimeGPT 低约 20%,这表明包含分类变量时性能更佳。

