使用SKforecast时遇DatetimeIndex无频率警告的技术求助
SKforecast时间序列分析中DatetimeIndex仍触发频率缺失警告
问题详情
已将数据索引设置为DatetimeIndex,但执行grid_search_forecaster时仍收到如下警告:
UserWarning:
yhas DatetimeIndex index but no frequency. Index is overwritten with a RangeIndex of step 1
相关代码:
import yfinance as yf import datetime as dt spxl = yf.Ticker("SPXL") hist = spxl.history(start="2015-01-01") hist = hist.asfreq("D") data = hist.dropna() type(data.index) #Output: pandas.core.indexes.datetimes.DatetimeIndex #Split data into train-val-test #============================================================================== data = data.loc['2015-01-01': '2022-12-31'] end_train = '2019-12-31' end_validation = '2020-12-31' data_train = data.loc[: end_train, :].copy() data_val = data.loc[end_train:end_validation, :].copy() data_test = data.loc[end_validation:, :].copy() #Create forecaster #============================================================================== forecaster = ForecasterAutoreg( regressor = LGBMRegressor(), lags = 7 ) #Grid search of hyper-parameters and lags #============================================================================== #Regressor hyper-parameters param_grid = { 'n_estimators': [100, 500], 'max_depth': [3, 5, 10], 'learning_rate': [0.01, 0.1] } #Lags used as predictors lags_grid = [7]
警告触发代码:
results_grid_q10 = grid_search_forecaster( forecaster = forecaster, y = data.loc[:end_validation, 'Close'], param_grid = param_grid, lags_grid = lags_grid, steps = 7, refit = True, metric = 'mean_squared_error', initial_train_size = int(len(data_train)), fixed_train_size = False, return_best = True, verbose = False )
原因与解决办法
原因
尽管你通过asfreq("D")给原数据设置了日频率,但对DataFrame执行切片操作(如data.loc[:end_validation, 'Close'])后,生成的Series的DatetimeIndex会丢失freq属性(变为None),SKforecast检测不到明确的频率,因此触发警告。
解决办法
在将数据传入grid_search_forecaster前,重新为目标Series设置频率,两种可选方式:
- 显式调用
asfreq重置频率
# 先处理y参数 y_input = data.loc[:end_validation, 'Close'].asfreq('D') # 再传入函数 results_grid_q10 = grid_search_forecaster( forecaster = forecaster, y = y_input, param_grid = param_grid, lags_grid = lags_grid, steps = 7, refit = True, metric = 'mean_squared_error', initial_train_size = int(len(data_train)), fixed_train_size = False, return_best = True, verbose = False )
- 直接修改索引的
freq属性
y_input = data.loc[:end_validation, 'Close'] # 手动指定频率 y_input.index.freq = 'D'
- 验证方法
可以提前打印索引频率确认问题:
print(data.loc[:end_validation, 'Close'].index.freq) # 如果输出为None,说明频率丢失,需要修复
内容的提问来源于stack exchange,提问作者Sam.H
相关产品推荐
相关产品推荐

