ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

tsfresh 工具层全解析:DataFrame 规范化、滚动切窗与特征计算分发机制

tsfresh 工具层全解析:DataFrame 规范化、滚动切窗与特征计算分发机制 特征工程机器学习数据分析【免费下载链接】tsfreshAutomatic extraction of relevant features from time series:项目地址https://gitcode.com/gh_mirrors/ts/tsfresh点击查看免费下载导读本文围绕 tsfresh 的tsfresh.utilities工具包展开它承担着时间序列数据从用户输入到内部规范格式的转换、NaN/Inf 填充、滚动窗口切分、并行计算分发以及性能剖析等底层职责。读完本文你将掌握 tsfresh 输入数据格式的硬性约束、roll_time_series的滚动切窗细节与参数语义、Distributor 并行架构的选型逻辑以及如何在特征提取前后利用 profiling 定位性能瓶颈。tsfresh.utilities是 tsfresh 内部的一组辅助工具官方文档将其定位为“仅供 tsfresh 内部使用”的模块见 tsfresh/utilities/init.py。但它的四个子模块几乎覆盖了特征提取全流程的数据工程问题dataframe_functions数据格式转换与清洗、distribution计算分发与并行化、profiling性能剖析、string_manipulation特征名列解析。API 文档索引位于 docs/api/tsfresh.utilities.rst下文将结合源码逐一展开。一、dataframe_functions输入数据规范化的第一道关口1.1 三种输入格式与内部规范表示tsfresh 的特征提取入口extract_features接受两种时间序列容器扁平 pandas.DataFrame或{kind: DataFrame} 字典。无论哪种最终都会被归一化到内部统一表示源码注释明确说明“Always use the standardized way of storing the data”见 tsfresh/feature_extraction/extraction.py。一个规范的输入 DataFrame 通常需要包含以下列列名作用约束id标识不同时间序列样本必须存在不允许有 NaNtime/sort时间顺序列可选若提供不允许有 NaNvalue序列观测值必须存在kind序列类型可选若提供不允许有 NaNcheck_for_nans_in_columns(df, columnsNone)是这一环节的守卫函数当columns为空时检查整个 DataFrame否则只检查指定列一旦发现 NaN 立即抛出ValueError并列出包含 NaN 的具体列名tsfresh/utilities/dataframe_functions.py。单元测试覆盖了“检查全部列”“检查部分列”“以字符串单传列名”等场景见 tests/units/utilities/test_dataframe_functions.py。1.2 NaN / Inf 的三种填充策略特征提取计算器常会产出非有限值例如除零产生inf空窗口产生NaN因此工具层提供了三种填充函数1.impute(df_impute)——按列统计量填充最常用规则固定为-inf→ 该列最小值mininf→ 该列最大值maxNaN→ 该列中位数median若整列都没有有限值则整列填 0并发出RuntimeWarning函数原地修改 DataFrame填充后保证不再含非有限值且所有列转为np.float64。空 DataFrame 直接返回dataframe_functions.py。测试用例test_toplevel_impute验证了含np.nan、np.inf、-np.inf混合列的替换结果tests/units/utilities/test_dataframe_functions.py。2.impute_dataframe_zero(df_impute)——全部置 0将所有 NaN、±inf 统一替换为 0同样原地修改并转为np.float64dataframe_functions.py。3.impute_dataframe_range(df_impute, col_to_max, col_to_min, col_to_median)——外部统计量填充由调用方预先提供每列最大值、最小值、中位数三个字典适用于“训练集统计量应用到测试集”的典型场景。若 DataFrame 的列与三个字典的键不匹配或字典内存在非有限值都会抛出ValueErrordataframe_functions.py。配套的get_range_values_per_column(df)用掩码数组计算每列的有限值 max/min/mediandataframe_functions.py。注意特征提取入口的impute_function参数只作用于结果特征矩阵绝不修改原始输入数据见 tsfresh/feature_extraction/extraction.py。1.3 restrict_input_to_index 与 get_ids样本对齐在特征选择阶段tsfresh 需要保证时间序列容器与目标向量y的样本一一对应restrict_input_to_index(df_or_dict, column_id, index)将容器裁剪到只保留index中出现的 id若两者完全没有交集抛出AttributeError提示“时间序列容器的 id 与 X 的索引不共享任何标识符”dataframe_functions.py。get_ids(df_or_dict, column_id)聚合所有 id 为集合字典输入则对每个 kind 取并集dataframe_functions.py。二、roll_time_series把长序列切成可预测的窗口2.1 滚动切窗的本质roll_time_series是工具层中最核心的算法函数。它针对每个 id及可选 kind在“时间域”上滚动一个固定长度窗口max_timeshift每滚动一步就把窗口内看到的子序列作为一个新的时间序列样本并用(原id, timeshift值)二元组生成新 id。可以形象地理解为“一个固定长度的窗口在时间轴上逐步滑动每次滑动切出的片段都是一条新序列”。2.2 参数全景与语义参数默认值含义与约束df_or_dict必填DataFrame 或 {kind: DataFrame} 字典字典模式下不允许再传column_kind否则抛ValueErrorcolumn_id必填id 列名不允许 NaN未指定直接抛ValueErrorcolumn_sortNone时间顺序列不允许 NaN为 None 时按行序生成递增序号充当“时间”column_kindNone仅 DataFrame 模式可用为 None 时默认每列除 id/sort 列都是一个 kindrolling_direction1符号决定方向正数向前正向滚动负数向后负向滚动绝对值决定每步移动量不允许为 0max_timeshiftNone窗口最大长度None 表示窗口无限增长min_timeshift0丢弃长度小于等于该值的窗口必须 ≥ 0chunksizeNone每次提交给 worker 的滚动步数n_jobs默认N_PROCESSES并行进程数0/1 表示串行show_warnings默认False是否显示滚动过程中的警告disable_progressbar默认False是否禁用进度条distributorNone高级参数自定义分发器类见 tsfresh/utilities/distribution.py2.3 方向语义与窗口编号规则源码中的实现注释给出了精确的示例。设原始序列为1 2 3 4正向滚动rolling_direction1窗口右边界随时间步移动timeshift1得到[1]timeshift2得到[1 2]timeshift3得到[1 2 3]timeshift4得到[1 2 3 4]。子序列名称取窗口内最后一个时间点例如max_timeshift3时名为(id4, timeshift5)的样本包含时间点 3、4、5 的数据。负向滚动rolling_direction-1窗口左边界移动timeshift1得到[1 2 3 4]timeshift2得到[2 3 4]timeshift3得到[3 4]timeshift4得到[4]。负向滚动时(id4, timeshift5)包含的是时间点 5、6、7。实现细节上虽然负向滚动窗口在视觉上是“从后往前”但计数依然从第一行开始滚动按每个 id 与 kind 分别进行长度小于min_timeshift 1的切片被丢弃见 dataframe_functions.py。2.4 前置校验与均匀采样检查源码在滚动前执行一系列校验dataframe_functions.pyrolling_direction 0抛ValueErrormax_timeshift 0抛ValueErrormin_timeshift 0抛ValueError容器行数 ≤ 1 抛ValueErrorcolumn_id不在 DataFrame 中抛AttributeError若column_sort为数值型会逐组计算相邻时间差并检查是否一致不一致时发出警告“Your time stamps are not uniformly sampled, which makes rolling nonsensical in some domains.”测试见 tests/units/utilities/test_dataframe_functions.py。2.5 与 make_forecasting_frame 的配合make_forecasting_frame(x, kind, max_timeshift, rolling_direction, min_timeshift0)是滚动功能的封装入口输入单条序列xnp.array或pd.Series内部先构造id/time/value/kind四列 DataFrame调用roll_time_series得到滚动容器再剔除每个窗口最后一个点作为待预测目标最后把y与滚动后的 id 对齐返回(df_shift, y)即“特征容器 目标向量”可直接用于监督学习dataframe_functions.py。这正是 tsfresh 官方 forecasting 示例见 notebooks/05 Timeseries Forecasting.ipynb 与 docs/text/forecasting.rst背后的核心工具。2.6 add_sub_time_series_index按长度分包add_sub_time_series_index(df_or_dict, sub_length, column_idNone, column_sortNone, column_kindNone)用于把长测量序列按固定长度切成子包sub_length2、长度 11 的数据会得到编号0,0; 1,1; 2,2; 3,3; 4,4; 5共 6 个包若提供column_id则每个 id 内部再分包新 id 由(子包号, 原id)构成dataframe_functions.py。该函数常用于把长测量切分为多条可独立提取特征的短序列。三、distribution特征计算的分发与并行化3.1 架构Map-Reduce 抽象tsfresh.utilities.distribution定义了一套“分发器”抽象。核心接口是DistributorBaseClass.map_reduce(map_function, data, function_kwargs, chunk_size, data_length)把map_function应用到每个数据项再将结果扁平化汇总。抽象基类要求子类实现distribute与closetsfresh/utilities/distribution.py。IterableDistributorBaseClass进一步提供了两个重要机制partition(data, chunk_size)把可迭代对象切成固定大小的块惰性逐块产出内存友好distribution.pycalculate_best_chunk_size(data_length)经验公式chunk_size ceil(data_length / (n_workers * 5))即保证每个 worker 大约处理 5 个批次distribution.py。3.2 四种内置分发器对比分发器执行方式适用场景MapDistributorPython 内置map完全串行chunk_size 固定为 1小数据、调试、无并行环境MultiprocessingDistributormultiprocessing.Pool.imap_unordered本机多进程并行单机多核默认选择LocalDaskDistributor本地 Dask 集群LocalClusterprocessesFalse线程模式需要在本地用 Dask 协议测试分布式逻辑ClusterDaskDistributor连接远端 Dask SchedulerClient(address)集群/多机分布式计算其中MultiprocessingDistributor会通过initialize_warnings_in_workers在子进程中初始化 warnings 状态——在 Windows 上进程由 spawn 启动、不继承父进程 warnings 状态因此必须在计算前显式设置distribution.py。ClusterDaskDistributor在运行期根据len(self.client.scheduler_info()[workers])动态计算最优 chunk_sizedistribution.py。3.3 自动选型逻辑与 Chunk 机制在extract_features与roll_time_series中当distributorNone时按如下规则自动选型见 dataframe_functions.pyif n_jobs 0 or n_jobs 1: distributor MapDistributor(disable_progressbar..., progressbar_titleRolling) else: distributor MultiprocessingDistributor(n_workersn_jobs, ...)数据以 chunk 为单位提交给 worker而不是逐条传输——这样每个 worker 处理的是大小合适的批任务避免进程间通信成为瓶颈distribution.py。当n_jobs默认取max(1, cpu_count // 2)见 tsfresh/defaults.py即默认使用一半 CPU 核心数并行。四、string_manipulation特征名列的双向解析特征提取完成后特征列名形如kind__function__param_value工具层提供了两个对称函数get_config_from_string(parts)输入按__切分的列名片段跳过 kind 名与函数名后把param_value段按最后一个_拆成参数名与参数值再用ast.literal_eval还原为 Python 对象tuple、int、float 等特殊处理nan、inf、-inf字符串为np.nan、np.inf、-np.inf无参数时返回Nonetsfresh/utilities/string_manipulation.py。convert_to_output_format(param)反向操作把参数字典按参数名排序后序列化为param_value__param_value...形式字符串参数值会用双引号包裹string_manipulation.py。这两个函数是settings.from_columns反向推断特征配置的基础通过列名即可还原“这个特征是用什么函数、什么参数算出来的”便于特征工程的可复现与迁移。五、profiling定位特征计算性能瓶颈tsfresh.utilities.profiling基于标准库cProfile与pstats实现start_profiling()创建并启用cProfile.Profile返回 profiler 对象end_profiling(profiler, filename, sortingNone)禁用 profiler按sorting如cumulative排序统计并写入指定文件get_n_jobs()/set_n_jobs(n_jobs)读写全局默认并行进程数defaults.N_PROCESSEStsfresh/utilities/profiling.py。典型用法源码 docstring 中的示例from tsfresh.utilities.profiling import start_profiling, end_profiling profiler start_profiling() # ... 执行 extract_features 等需要剖析的代码 ... end_profiling(profiler, profile.txt, cumulative)extract_features的profileTrue参数正是内部调用了这两个函数tsfresh/feature_extraction/extraction.py。剖析结果按累计耗时排序可直接定位最耗时的特征计算器。此外仓库还提供了独立的耗时测量脚本 tsfresh/scripts/measure_execution_time.py 与对比实验 notebook notebooks/advanced/compare-runtimes-of-feature-calculators.ipynb可用于评估不同计算器之间的运行时间差异。六、默认配置与相关文档导航上述工具函数的许多默认值来自 tsfresh/defaults.py包括N_PROCESSES默认max(1, 核心数//2)、CHUNKSIZENone交给分发器启发式决定、DISABLE_PROGRESSBARFalse、SHOW_WARNINGSFalse等用户可以通过tsfresh.defaults模块按需调整。进一步阅读建议数据格式的完整定义见 docs/text/data_formats.rst滚动窗口在预测场景中的详细说明见 docs/text/forecasting.rst特征提取入口与参数总览见 docs/text/feature_calculation.rst大规模数据与集群并行实践见 docs/text/large_data.rst 与 docs/text/tsfresh_on_a_cluster.rst。结语tsfresh.utilities虽然定位为内部模块却是整个特征提取流水线的“地基”它保证了输入数据格式的统一与干净dataframe_functions、把长序列转化为可监督学习的窗口样本roll_time_series、用可插拔的分发器架构支撑从单机到集群的扩展distribution、还原特征列的可解释性string_manipulation并为性能优化提供剖析入口profiling。理解这一层是深入使用和二次开发 tsfresh 的关键一步。赞分享特征工程机器学习数据分析【免费下载链接】tsfreshAutomatic extraction of relevant features from time series:项目地址https://gitcode.com/gh_mirrors/ts/tsfresh点击查看免费下载相关推荐TSFRESH特征选择统计显著性过滤机制TSFRESH特征选择统计显著性过滤机制 TSFRESH通过系统化的假设检验框架实现自动化特征选择根据特征和目标变量的数据类型智能选择四种统计检验方法二元特征工程机器学习数据分析深入TSFRESH特征提取引擎与计算器详解深入TSFRESH特征提取引擎与计算器详解 本文全面解析了TSFRESH库中ComprehensiveFCParameters参数配置系统的架构设计与功能特性特征工程机器学习数据分析CANN/metadef预提交指南pre commit Usage Guide TOC 1 Usage Background This guide provides instructions o人工智能CANNAscend上一篇Pyroscope UI 完全指南使用 Tag Explorer、单视图、对比与 Diff 分析性能数据下一篇让经典魔兽争霸III在现代电脑上流畅运行的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表