使用Darts库时静态协变量无法转浮点数的报错问题排查
问题原因分析
你的报错根源有三点:
value_cols=['y']参数错误——你的数据集里目标列是volume,并非y,这会导致时间序列无法正确加载目标数值;- 字符串类型的
country被设为static_cols——底层的LinearRegression模型仅支持数值型特征,无法直接解析字符串类别,因此抛出无法转换为浮点数的错误; freq='MS'(月初频率)与你的日度数据不匹配,可能引发后续数据对齐问题,建议改为'D'(日度频率)。
解决办法
1. 修正目标列参数
将value_cols=['y']改为value_cols=['volume'],确保时间序列正确加载你的目标数据。
2. 编码类别型静态特征
需要把country这个类别型特征转换为数值型,以下是两种常用实现方式:
方式一:标签编码(Label Encoding)
适合类别数量少或存在有序关系的场景:
from sklearn.preprocessing import LabelEncoder import pandas as pd from darts import TimeSeries from darts.models import RegressionModel from sklearn.linear_model import LinearRegression datasource = pd.read_csv('data/multivariate_test.csv', index_col=False) df = pd.DataFrame(datasource) # 转换日期格式并排序 df['date'] = pd.to_datetime(df['date'], dayfirst=True) df.sort_values(by='date', inplace=True) df.reset_index(drop=True, inplace=True) # 对country进行标签编码 le = LabelEncoder() df['country_encoded'] = le.fit_transform(df['country']) # 创建时间序列,使用编码后的数值列作为静态特征 y = TimeSeries.from_group_dataframe( df, group_cols='country', static_cols='country_encoded', time_col='date', value_cols=['volume'], fill_missing_dates=False, freq='D' ) # 注意:数据集仅2天数据,lags不能超过历史数据长度,这里调整为[-1,-2] model = RegressionModel(lags=[-1,-2], model=LinearRegression()) model.fit(y) y_pred = model.predict(n=12, series=y)
方式二:独热编码(One-Hot Encoding)
适合类别无顺序关系的场景,避免模型误判类别间存在大小关联:
from sklearn.preprocessing import OneHotEncoder import pandas as pd from darts import TimeSeries from darts.models import RegressionModel from sklearn.linear_model import LinearRegression datasource = pd.read_csv('data/multivariate_test.csv', index_col=False) df = pd.DataFrame(datasource) # 转换日期格式并排序 df['date'] = pd.to_datetime(df['date'], dayfirst=True) df.sort_values(by='date', inplace=True) df.reset_index(drop=True, inplace=True) # 对country进行独热编码 ohe = OneHotEncoder(sparse_output=False) encoded_countries = ohe.fit_transform(df[['country']]) encoded_df = pd.DataFrame(encoded_countries, columns=ohe.get_feature_names_out(['country'])) df = pd.concat([df, encoded_df], axis=1) # 创建时间序列,使用所有独热编码列作为静态特征 y = TimeSeries.from_group_dataframe( df, group_cols='country', static_cols=encoded_df.columns.tolist(), time_col='date', value_cols=['volume'], fill_missing_dates=False, freq='D' ) # 数据集仅2天数据,lags调整为[-1] model = RegressionModel(lags=[-1], model=LinearRegression()) model.fit(y) y_pred = model.predict(n=12, series=y)
额外提示
你的数据集仅有2天历史数据,lags参数设置不能超过现有数据的时间步长(比如[-12]会因无足够历史数据报错),需根据实际数据量调整。
内容的提问来源于stack exchange,提问作者LucasCessford
相关产品推荐
相关产品推荐

