You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SKforecast时遇DatetimeIndex无频率警告的技术求助

SKforecast时间序列分析中DatetimeIndex仍触发频率缺失警告

问题详情

已将数据索引设置为DatetimeIndex,但执行grid_search_forecaster时仍收到如下警告:

UserWarning: y has 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设置频率,两种可选方式:

  1. 显式调用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
                    )
  1. 直接修改索引的freq属性
y_input = data.loc[:end_validation, 'Close']
# 手动指定频率
y_input.index.freq = 'D'
  1. 验证方法
    可以提前打印索引频率确认问题:
print(data.loc[:end_validation, 'Close'].index.freq)
# 如果输出为None,说明频率丢失,需要修复

内容的提问来源于stack exchange,提问作者Sam.H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:20:33