GluonTS中基于pandas.DataFrame的时间序列数据处理指南
概述
本文将详细介绍如何在GluonTS项目中使用pandas.DataFrame格式处理时间序列数据。GluonTS作为一个强大的时间序列预测工具库,提供了PandasDataset
这一专门针对pandas数据结构的接口,极大简化了时间序列数据的预处理和建模流程。
核心数据结构:PandasDataset
PandasDataset
是GluonTS中专门设计用于处理pandas数据结构的类,它能够接受多种格式的输入:
- 单个DataFrame(单变量时间序列)
- DataFrame列表(多变量时间序列)
- 字典形式的DataFrame集合
- 长格式(Long-Format)DataFrame(包含item_id列)
基本数据要求
最基本的时间序列数据应包含两列:
timestamp
:单调递增的时间戳,具有固定频率target
:对应的目标值
示例格式:
| timestamp | target | |---------------------|--------| | 2021-01-01 00:00:00 | -0.21 | | 2021-01-01 01:00:00 | -0.33 |
实战案例解析
案例1:长格式数据处理
当数据以长格式存储时(即多个时间序列堆叠在一个DataFrame中,通过item_id区分),处理流程如下:
from gluonts.dataset.pandas import PandasDataset
# 假设df是包含item_id列的长格式DataFrame
ds = PandasDataset.from_long_dataframe(df, target="target", item_id="item_id")
案例2:缺失值处理
时间序列数据常见的问题是存在缺失时间点,解决方法是对齐时间索引并填充缺失值:
# 创建完整的时间索引
new_index = pd.date_range(start_time, end_time, freq="1H")
# 对每个时间序列重新索引
filled_dfs = {
item_id: gdf.reindex(new_index).fillna(method="ffill")
for item_id, gdf in df.groupby("item_id")
}
ds = PandasDataset(filled_dfs, target="target")
案例3:宽格式数据处理
当数据以宽格式存储时(每个时间序列作为单独列),转换方法如下:
# 假设df_wide的每列代表一个时间序列
ds = PandasDataset(dict(df_wide))
高级特性应用
特征工程
GluonTS支持丰富的特征类型:
- 静态特征(static features):不随时间变化的特征
- 动态特征(dynamic features):随时间变化的特征
示例代码:
# 创建包含特征的DataFrame
ts_with_features = pd.DataFrame({
"timestamp": date_range,
"target": target_values,
"static_cat": static_categories,
"dynamic_real": dynamic_values
})
# 构建数据集时指定特征类型
dataset = PandasDataset(
ts_with_features,
target="target",
feat_static_cat=["static_cat"],
feat_dynamic_real=["dynamic_real"]
)
模型训练与评估
使用包含特征的DataFrame训练模型:
from gluonts.mx import DeepAREstimator
estimator = DeepAREstimator(
freq="1H",
prediction_length=24,
use_feat_static_cat=True,
use_feat_dynamic_real=True,
cardinality=[num_categories] # 静态分类特征的基数
)
predictor = estimator.train(dataset)
训练测试集划分
正确划分训练测试集对评估模型性能至关重要:
# 划分数据集
train = PandasDataset([ts.iloc[:-prediction_length] for ts in time_series_list])
test = PandasDataset(time_series_list)
# 训练评估
predictor = estimator.train(train)
forecasts = predictor.predict(test)
# 可视化部分结果
for i in range(3): # 展示3个样本
test[i][-100:].plot() # 绘制真实值
forecasts[i].plot() # 绘制预测值
最佳实践建议
- 数据质量检查:确保时间戳单调递增且频率一致
- 特征标准化:对连续型特征进行标准化处理
- 缺失值处理:根据业务场景选择合适的填充策略
- 模型选择:根据数据特性选择合适的GluonTS模型
- 超参数调优:合理设置预测长度、训练轮次等参数
通过本文介绍的方法,开发者可以高效地将pandas格式的时间序列数据转换为GluonTS可用的格式,并利用其强大的预测能力解决实际问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考