【问题标题】:Statsmodels - TypeError: ufunc 'isnan' not supported for the input typesStatsmodels - TypeError:输入类型不支持 ufunc 'isnan'
【发布时间】:2020-07-14 14:49:04
【问题描述】:

我试图运行一段代码,用于评估 SARIMAX 模型中 P、D 和 Q 不同值的均方误差。这个确切的代码块以前对我来说工作得很好,我没有在任何地方更改它,所以我只能假设问题是数据,但我也以同样的方式处理了它,所以我不知道为什么不行吗?


def evaluate_sarima_model(data, arima_order, s_order): 
    split=int(len(data) * 0.8) 
    train, test = data[0:split], data[split:len(data)]
    past=[x for x in train]
    # make predictions
    predictions = list()
    for i in range(len(test)):
        model = sm.tsa.statespace.SARIMAX(past, order=arima_order, seasonal_order = s_order, enforce_stationarity=False, enforce_invertibility=False)
        model_fit = model.fit(disp=0)
        future = model_fit.forecast()[0]
        predictions.append(future)
        past.append(test[i])
    # calculate out of sample error
    error = mean_squared_error(test, predictions)
    return error
      
def evaluate_models(dataset, p_values, d_values, q_values, P_values, D_values, Q_values):
    best_score, best_cfg = float("inf"), None
    for p in p_values:
        for d in d_values:
            for q in q_values:
                for P in P_values:
                    for D in D_values:
                        for Q in Q_values:
                            order = (p,d,q)
                            s_order = (P, D, Q, 12)
                            try:
                                mse = evaluate_sarima_model(dataset, order, s_order)
                                if mse < best_score:
                                    best_score, best_cfg, seas = mse, order, s_order
                                print('SARIMA%s %s MSE=%.3f' % (order,seas, mse))
                            except:
                                continue
    return print('Best SARIMA%s %s MSE=%.3f' % (best_cfg, seas, best_score))
p_values = [1]
d_values = [1] 
q_values = [1] 
P_values = [x for x in range(0, 3)]
D_values = [x for x in range(0, 3)]
Q_values = [x for x in range(0, 3)] 

我正在使用以下数据集:

DatetimeIndex: 175 entries, 2005-12-01 to 2020-06-01
Freq: MS
Data columns (total 1 columns):
 #   Column    Non-Null Count  Dtype
---  ------    --------------  -----
 0   turnover  175 non-null    int32
dtypes: int32(1)
memory usage: 7.1 KB 

当我运行它时,我收到以下错误:


evaluate_models(turnover_month, p_values, d_values, q_values, P_values, D_values, Q_values)

UnboundLocalError: local variable 'seas' referenced before assignment 

如果我尝试使用 P、D 和 Q 的随机值运行单个模型线,我会得到以下结果,因此我的假设是问题出在第一个块中以及它如何处理此数据集:

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''

【问题讨论】:

  • 看起来变量 seas 只是没有在条件 if mse &lt; best_score: 之外定义。因此,如果条件不满足 seas 未定义并且 return 语句尝试使用未定义的变量。
  • 但是为什么完全相同的代码块在其他地方工作得非常好?我也不确定如何重写代码以在其他地方定义它?
  • 可能是运气。有什么阻止您将seas = mse 移动到if mse &lt; best_score: 上方吗?
  • 刚刚尝试过,不幸的是仍然遇到同样的错误。因此,作为参考,代码块现在说:try: mse = evaluate_sarima_model(dataset, order, s_order) seas = mse if mse &lt; best_score: best_score, best_cfg, seas, order, s_order print('SARIMA%s %s MSE=%.3f' % (order,seas, mse))
  • 拿出尝试和例外。您可能在定义 seas 之前发生了未报告的错误。

标签: python datetime statsmodels arima


【解决方案1】:

在浏览完每一行之后,很明显问题在于数据,而 SARIMA 模型无法处理 DataFrame,而是需要 Series。我只需要 df 上的一个简单的 .Squeeze()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 2021-12-01
    • 2020-02-16
    • 1970-01-01
    • 2019-03-10
    • 2020-02-18
    • 2020-07-28
    • 2020-07-21
    相关资源
    最近更新 更多