tsfresh中extract_relevant_features两类报错的解决方法咨询
tsfresh extract_relevant_features 两类报错解决方案
问题1:传入df.notnull()触发ValueError
报错信息
features_filtered_direct = extract_relevant_features(df.notnull(), File "C:\Users\username\anaconda3\envs\ts-env\lib\site-packages\tsfresh\convenience\relevant_extraction.py", line 172, in extract_relevant_features raise ValueError( ValueError: The following ids are in the time series container but are missing in y: {True}
错误原因
df.notnull()返回的是布尔值组成的DataFrame,并非tsfresh要求的有效时间序列数据。extract_relevant_features要求第一个参数是包含数值型特征的数据集,且需通过id列对时间序列分组。传入布尔矩阵后,函数错误地将布尔值True识别为时间序列id,而该id在标签y中不存在,导致匹配失败。
解决方案
- 先处理缺失值,再传入原数据结构:
- 删除含缺失值的行:
df_clean = df.dropna(),将df_clean传入函数; - 填充缺失值:
df_clean = df.fillna(method='ffill')(或指定填充值如df_clean = df.fillna(0)),再传入处理后的数据集。
- 删除含缺失值的行:
- 明确指定时间序列分组参数:
从数据样例看,数据集包含日期列和多列数值/分类列,调用函数时需指定分组id列和时间排序列:features_filtered_direct = extract_relevant_features( df_clean, y, column_id='你的id列名', # 比如样例中第二列的0/1列 column_sort='日期列名' )
问题2:传入df后触发TypeError
报错信息
Traceback (most recent call last): File "C:\Users\username\anaconda3\envs\ts-env\lib\multiprocessing\pool.py", line 125, in worker result = (True, func(*args, **kwds)) File "C:\Users\username\anaconda3\envs\ts-env\lib\site-packages\tsfresh\utilities\distribution.py", line 43, in _function_with_partly_reduce results = list(itertools.chain.from_iterable(results)) File "C:\Users\username\anaconda3\envs\ts-env\lib\site-packages\tsfresh\utilities\distribution.py", line 42, in <genexpr> results = (map_function(chunk, **kwargs) for chunk in chunk_list) File "C:\Users\username\anaconda3\envs\ts-env\lib\site-packages\tsfresh\feature_extraction\extraction.py", line 386, in _do_extraction_on_chunk return list(_f()) File "C:\Users\username\anaconda3\envs\ts-env\lib\site-packages\tsfresh\feature_extraction\extraction.py", line 372, in _f result = [("", func(x))] File "C:\Users\username\anaconda3\envs\ts-env\lib\site-packages\tsfresh\feature_extraction\feature_calculators.py", line 1704, in sample_entropy if np.isnan(x).any(): TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
错误原因
报错发生在计算sample_entropy特征时,np.isnan无法处理非数值类型数据。结合数据样例,大概率是以下情况:
- 数据包含字符串类型列(如日期列、样例中"04"这类带前导零的字符串数字);
- 部分列的 dtype 为 object 而非数值型(int/float)。
解决方案
- 过滤/转换非数值列:
- 移除非数值列(如日期列):
df_numeric = df.drop(columns=['日期列名']); - 将字符串格式数字转为数值类型:
# 遍历列,转换object类型为数值 for col in df.columns: if df[col].dtype == 'object': df[col] = pd.to_numeric(df[col], errors='coerce')
- 移除非数值列(如日期列):
- 禁用引发错误的特征:
若不需要sample_entropy特征,可在调用时通过参数禁用:from tsfresh.feature_extraction import ComprehensiveFCParameters fc_params = ComprehensiveFCParameters() del fc_params['sample_entropy'] features_filtered_direct = extract_relevant_features( df, y, default_fc_parameters=fc_params, # 其他参数如column_id、column_sort ) - 检查并修正数据类型:
通过df.dtypes查看列类型,对异常列手动转换,确保所有特征列为数值型。
内容的提问来源于stack exchange,提问作者Rebel
相关产品推荐
相关产品推荐

