函数内的Python for循环不返回值

2024-03-29 06:41:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了这个相当简单的Python函数,但由于某种原因,在for循环结束后,函数中没有返回或打印出任何内容。我可以很好地调用函数,并在for循环中调用prints以确保值是正确的。我有什么明显的遗漏吗?底部的print语句不打印任何内容。你知道吗

def evaluate_arima_model(X, arima_order, s_arima_order):
    scores = []
    train_steps = [36, 48, 60, 72, 84]
    for i in train_steps:
        Train = X[0:i]
        Test = X[i:i + 12]
        model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
        model_fit = model.fit(trend='nc', disp=0)
        yhat = model_fit.forecast(12)
        rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
        scores.append(rmse)
    print(scores)
    return scores

这就是函数的调用方式(由另一个具有嵌套循环的函数调用)

def evaluate_models(dataset, p_values, d_values, q_values, sp_values, sd_values, sq_values, s_values):
dataset = dataset.astype('float32')
best_score, best_cfg, best_cfg2 = float("inf"), None, None 
for p in p_values:
    for d in d_values:
        for q in q_values:
            order = (p,d,q)
            for sp in sp_values:
                for sd in sd_values:
                    for sq in sq_values:
                        for s in s_values:
                            sorder = (sp,sd,sq,s)
                            try:
                                rmse = evaluate_arima_model(dataset, order, sorder)
                                if rmse < best_score:
                                    best_score, best_cfg, best_cfg2 = rmse, order, sorder
                                print('ARIMA%s SARIMA%s RMSE=%.3f' % (order,sorder,rmse))
                            except:
                                continue
print('\n','Best ARIMA%s SARIMA%s RMSE=%.3f' % (best_cfg, best_cfg2, best_score))


series = read_csv('dataset.csv', header=None, index_col=0, parse_dates=True, squeeze=True)
series = numpy.log(series)

# Evaluate parameters
p_values = range(0, 2)
d_values = range(0, 2)
q_values = range(0, 2)

# Evaluate seasonal parameters
sp_values = range(0, 2)
sd_values = range(0, 2)
sq_values = range(0, 2)

#Set seasonality
s_values = [12]

#Call grid loop
evaluate_models(series, p_values, d_values, q_values, sp_values, sd_values, sq_values, s_values)

输出:最佳ARIMANone SARIMANone RMSE=inf

新版本仍不起作用:

def evaluate_arima_model(X, arima_order, s_arima_order):
scores = []
train_steps = [36, 48, 60, 72, 84]
for i in train_steps:
    Train = X[0:i]
    Test = X[i:i + 12]
    model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
    model_fit = model.fit(trend='nc', disp=0)
    yhat = model_fit.forecast(12)
    rmse = None
    rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
    scores.append(rmse)
    print(scores)
print(scores)
return scores

Tags: informodelsqorderrangesdsp
3条回答

最后解决了这个问题,问题是返回一个列表和一个标量,这正是我所需要的。所以“返回分数[0]”修正了它。你知道吗

def evaluate_arima_model(X, arima_order, s_arima_order):
    scores = []
    train_steps = [36]
    for i in train_steps:
        Train = X[0:i]
        Test = X[i:i + 12]
        model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
        model_fit = model.fit(trend='nc', disp=0)
        yhat = model_fit.forecast(12)
        rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
        scores.append(rmse)
    return scores[0] 

你需要写返回语句而不是打印。你知道吗

def evaluate_arima_model(X, arima_order, s_arima_order):
    scores = []
    train_steps = [36, 48, 60, 72, 84]
    for i in train_steps:
        Train = X[0:i]
        Test = X[i:i + 12]
        model = SARIMAX(Train, order=arima_order, seasonal_order=s_arima_order)
        model_fit = model.fit(trend='nc', disp=0)
        yhat = model_fit.forecast(12)
        rmse = sqrt(mean_squared_error(numpy.exp(Test), numpy.exp(yhat)))
        scores.append(rmse)
    return(scores)

你的print()语句必须打印一些东西。但是,因为没有return语句,所以函数不返回任何内容(好吧,它返回None)。如果希望函数返回某些内容,请添加最后一行:

return scores

调试尝试:

简化代码:

In [1]: def evaluate_arima_model(X, arima_order, s_arima_order):
   ...:     scores = []
   ...:     train_steps = [36, 48, 60, 72, 84]
   ...:     for i in train_steps:
   ...:         rmse = None
   ...:         scores.append(rmse)
   ...:     print(scores)
   ...:     return scores
   ...: 
   ...: 

In [2]: evaluate_arima_model(1,1,1)
[None, None, None, None, None]
Out[2]: [None, None, None, None, None]

我不认为这有什么理由不起作用。你知道吗

相关问题 更多 >