Azure机器学习实战:时间序列表格数据集过滤操作详解
概述
在时间序列数据分析中,高效地按时间窗口筛选数据是常见需求。本文将详细介绍如何在Azure机器学习环境中使用时间序列表格数据集(Tabular Time Series Dataset)的相关API进行数据过滤操作。我们将以NOAA气象数据为例,演示完整的时间序列数据处理流程。
环境准备
安装必要组件
确保已安装Azure机器学习Python SDK,版本需1.0.60或更高以支持时间序列特性:
import azureml.core
print(azureml.data.__version__)
导入关键包
from datetime import datetime, timedelta
from azureml.core import Dataset, Workspace
工作区配置
建立与Azure机器学习工作区的连接:
ws = Workspace.from_config()
dstore = ws.get_default_datastore()
dset_name = 'weather-data-florida'
数据准备与加载
上传数据到Blob存储
将气象数据上传至Blob存储以便后续处理:
dstore.upload('weather-data', dset_name, overwrite=True, show_progress=True)
创建时间序列表格数据集
从Parquet文件创建表格数据集,并设置分区格式:
datastore_path = [(dstore, dset_name + '/*/*/data.parquet')]
dataset = Dataset.Tabular.from_parquet_files(
path=datastore_path,
partition_format=dset_name + '/{partition_time:yyyy/MM}/data.parquet'
)
时间戳列配置
指定时间戳列
激活时间序列相关API需要指定时间戳列和分区时间戳列:
tsd = dataset.with_timestamp_columns(
timestamp='datetime',
partition_timestamp='partition_time'
)
注册数据集
将数据集注册到工作区以便复用:
registered_ds = tsd.register(
ws,
dset_name,
create_new_version=True,
description='时间序列表格数据集演示数据',
tags={'type': 'TabularDataset'}
)
时间窗口过滤操作
1. 指定时间点前的数据
tsd_filtered = tsd.time_before(datetime(2019, 6, 12))
tsd_filtered.to_pandas_dataframe().tail(5)
2. 指定时间点后的数据
tsd_filtered = tsd.time_after(datetime(2019, 5, 30))
tsd_filtered.to_pandas_dataframe().head(5)
3. 时间范围过滤(链式调用)
tsd_filtered = tsd.time_after(datetime(2019, 1, 1)) \
.time_before(datetime(2019, 1, 10))
tsd_filtered.to_pandas_dataframe().head(5)
4. 时间范围过滤(单次调用)
tsd_filtered = tsd.time_between(
start_time=datetime(2019, 1, 31, 23, 59, 59),
end_time=datetime(2019, 2, 7)
)
tsd_filtered.to_pandas_dataframe().head(5)
5. 最近时间段数据
获取最近N天的数据:
tsd_filtered = tsd.time_recent(timedelta(days=2))
tsd_filtered.to_pandas_dataframe().tail(5)
列操作与时间序列特性
删除列注意事项
删除时间戳列会导致失去时间序列特性:
# 错误示例 - 删除时间戳列
try:
tsd2 = tsd.drop_columns(columns=['datetime'])
tsd2.time_before(datetime(2019, 6, 12))
except Exception as e:
print(f"预期错误: {str(e)}")
保留列注意事项
保留列时需包含时间戳列以保持时间序列特性:
# 正确做法 - 保留时间戳列
tsd2 = tsd.keep_columns(columns=['snowDepth', 'datetime', 'partition_time'])
tsd2.time_before(datetime(2019, 6, 12)).to_pandas_dataframe().tail(5)
时间戳列重置
重置时间戳列的规则:
- 不能单独设置timestamp为None而保留partition_timestamp
- 设置timestamp为None会清除所有时间戳列
- 可单独清除partition_timestamp
# 清除所有时间戳列
tsd_cleared = tsd.with_timestamp_columns(timestamp=None, partition_timestamp=None)
# 仅清除分区时间戳列
tsd_partial_cleared = tsd.with_timestamp_columns(
timestamp='datetime',
partition_timestamp=None
)
最佳实践建议
- 数据分区:合理设置分区格式可显著提高时间范围查询效率
- 时间戳列选择:确保选择的时间戳列数据类型正确
- 列操作谨慎:进行列操作时注意保留时间序列特性
- 错误处理:对可能丢失时间序列特性的操作添加异常处理
- 数据注册:重要数据集注册到工作区以便复用和版本控制
通过掌握这些时间序列表格数据集的操作方法,您可以高效地处理各类时间序列数据分析任务,为机器学习模型准备高质量的时间特征数据。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考