使用tsfresh按指定时间窗口提取DataFrame特征报错求助
原代码核心错误
- 函数内引用未定义的
time变量,运行会直接触发NameError。 - 时间窗口配对逻辑缺失:未先按参与者id分组整理窗口端点,直接按索引切片会混淆不同参与者的时间范围;且原逻辑默认时间窗口是连续排列的全局切片,和实际按id配对的规则不符。
- tsfresh接口传参错误:
extract_features要求输入包含分组id字段的DataFrame,原代码按DataFrame列逐列apply,传入的是单独的B1/B2/B3序列,不存在id字段,完全不符合接口输入要求。 - 循环逻辑错误:return语句写在for循环内部,第一次迭代就会终止函数,无法遍历所有时间窗口。
- 维度不匹配:tsfresh输出的是每个分组对应数百个特征列,原代码直接将多列特征赋值给原始单列的切片,会触发维度对齐错误。
- 存在变量拼写错误:
extracted_freatures拼写错误,正确写法为extracted_features。
正确实现代码
先整理结构化时间窗口,再逐窗口截取数据,最后调用tsfresh批量提取特征,避免逐行逐列循环的低效问题:
import pandas as pd from tsfresh import extract_features # 1. 按参与者id整理配对时间窗口 window_records = [] for uid, group in time_window.groupby("id"): # 同一id的时间点排序后相邻两个组成[起始,结束]窗口 time_points = group["time"].sort_values().to_list() for idx in range(0, len(time_points), 2): window_records.append({ "window_id": f"{uid}_{time_points[idx]}_{time_points[idx+1]}", "id": uid, "start_t": time_points[idx], "end_t": time_points[idx+1] }) window_meta = pd.DataFrame(window_records) # 2. 截取所有窗口对应的原始数据片段,打窗口标签 segment_list = [] for _, win in window_meta.iterrows(): # 筛选同id、时间落在窗口闭区间内的数据 cur_seg = df[ (df["id"] == win["id"]) & (df["time"] >= win["start_t"]) & (df["time"] <= win["end_t"]) ].copy() cur_seg["window_id"] = win["window_id"] segment_list.append(cur_seg) all_segments = pd.concat(segment_list, ignore_index=True) # 3. 按窗口批量提取时序特征 extracted_features = extract_features( all_segments, column_id="window_id", # 按窗口id分组,每个窗口输出一行特征 column_sort="time" # 按时间列排序保证时序顺序正确 ) # 关联窗口元信息,方便识别每个特征行对应的参与者和时间范围 extracted_features = extracted_features.reset_index().rename(columns={"index": "window_id"}) extracted_features = extracted_features.merge(window_meta, on="window_id", how="left")
结果说明
- 最终输出每一行对应一个独立的时间窗口,
window_id格式为参与者ID_窗口起始时间_窗口结束时间,可直接区分不同参与者的不同窗口片段。 - 输出列分为两类:一类是窗口基础信息(参与者id、窗口起始/结束时间),其余列均为tsfresh默认配置下计算的B1/B2/B3字段时序特征,包含统计值、趋势特征、自相关特征等,具体特征数量以tsfresh默认计算结果为准。
- 如果需要自定义提取的特征范围,可给
extract_features传入default_fc_parameters参数,指定需要计算的特征函数即可。
内容的提问来源于stack exchange,提问作者pythonhater
相关产品推荐
相关产品推荐

