核心
数据格式
所需的输入格式是一个数据框,至少包含以下列:* unique_id
,表示每个时间序列的唯一标识符 * ds
,表示日期戳列 * y
,表示序列的值。
除非在 TimeSeries.fit
中另有说明,否则其他所有列都被视为静态特征
unique_id | ds | y | static_0 | static_1 | |
---|---|---|---|---|---|
0 | id_00 | 2000-01-01 | 7.404529 | 27 | 53 |
1 | id_00 | 2000-01-02 | 35.952624 | 27 | 53 |
2 | id_00 | 2000-01-03 | 68.958353 | 27 | 53 |
3 | id_00 | 2000-01-04 | 84.994505 | 27 | 53 |
4 | id_00 | 2000-01-05 | 113.219810 | 27 | 53 |
… | … | … | … | … | … |
4869 | id_19 | 2000-03-25 | 400.606807 | 97 | 45 |
4870 | id_19 | 2000-03-26 | 538.794824 | 97 | 45 |
4871 | id_19 | 2000-03-27 | 620.202104 | 97 | 45 |
4872 | id_19 | 2000-03-28 | 20.625426 | 97 | 45 |
4873 | id_19 | 2000-03-29 | 141.513169 | 97 | 45 |
为简单起见,我们这里只取一个时间序列。
unique_id | ds | y | static_0 | static_1 | |
---|---|---|---|---|---|
0 | id_00 | 2000-01-01 | 7.404529 | 27 | 53 |
1 | id_00 | 2000-01-02 | 35.952624 | 27 | 53 |
2 | id_00 | 2000-01-03 | 68.958353 | 27 | 53 |
3 | id_00 | 2000-01-04 | 84.994505 | 27 | 53 |
4 | id_00 | 2000-01-05 | 113.219810 | 27 | 53 |
… | … | … | … | … | … |
217 | id_00 | 2000-08-05 | 13.263188 | 27 | 53 |
218 | id_00 | 2000-08-06 | 38.231981 | 27 | 53 |
219 | id_00 | 2000-08-07 | 59.555183 | 27 | 53 |
220 | id_00 | 2000-08-08 | 86.986368 | 27 | 53 |
221 | id_00 | 2000-08-09 | 119.254810 | 27 | 53 |
源代码
TimeSeries
用于存储和转换时间序列数据的实用类。
TimeSeries
类负责定义要执行的变换(lags
、lag_transforms
和 date_features
)。如果 num_threads > 1
,可以使用多线程计算这些变换。
频率被转换为一个偏移量。
日期特征按传递给构造函数的方式存储。
变换存储为一个字典,其中键是变换的名称(数据框中包含计算特征的列名),它是使用 build_transform_name
构建的,值是一个元组,其中第一个元素是应用该变换的滞后量,然后是函数,然后是函数参数。
注意,对于 lags
,我们将变换定义为其对应滞后量应用的恒等函数。这是因为 _transform_series
将滞后量作为参数,并在计算变换之前移动数组。
源代码
TimeSeries.fit_transform
*将特征添加到 data
中,并保存预测步骤所需的信息。*
如果并非所有特征都是静态的,请在 static_features
中指定哪些是静态的。如果不想在变换后丢弃包含空值的行,请设置 dropna=False
。如果 keep_last_n
不是 None,则保留跨所有序列的该数量的观测值用于更新。*
序列值作为 GroupedArray 存储在属性 ga
中。如果序列值的数据类型是整型,则将其转换为 np.float32
,这是因为滞后会生成 np.nan
,因此我们需要浮点数据类型来存储它们。
序列 ID 存储在 uids
属性中。
对于每个时间序列,最后一个观测日期会被存储,以便预测从最后一个日期 + 频率开始。
每个序列的最后一行(不包含 y
和 ds
列)被视为静态特征。
如果您将 static_features
传递给 TimeSeries.fit_transform
,则只保留这些特征。
您还可以在 TimeSeries.fit_transform 中指定 keep_last_n,这意味着在计算用于训练的特征后,我们只想保留每个时间序列的最后 n 个样本用于计算更新。这既节省内存又节省时间,因为更新是通过再次对所有时间序列运行变换函数并只保留最后一个值(即更新值)来执行的。
如果您的时间序列非常长,并且更新只需要少量样本,建议您将 keep_last_n 设置为计算更新所需的最小样本数,在这种情况下是 15,因为我们在滞后 2 上有一个大小为 14 的滚动平均,并且在第一次更新中,滞后 2 变成了滞后 1。这是因为在第一次更新中,滞后 1 是序列的最后一个值(或滞后 0),滞后 2 是滞后 1,依此类推。
TimeSeries.fit_transform
要求 y 列不包含任何空值。这是因为变换可能会将空值向前传播,因此如果 y 列中存在空值,您将会收到错误。
源代码
TimeSeries.predict
训练好模型后,我们可以使用 TimeSeries.predict
,传入模型和预测范围,以获得预测结果。
如果存在动态特征,我们可以将它们传递给 X_df
。
源代码
TimeSeries.update
更新存储序列的值。