使用Statsmodels拟合线性曲线时遇TypeError:float不可迭代
问题解决:OLS回归中TypeError: 'float' object is not iterable
错误根源
你使用list(map(param, GDP, stock))时,map()会将GDP和stock两个列表的单个元素逐一配对传入param函数。也就是说,每次调用param时,factor是GDP里的单个float值,stock是stock列表里的单个float值,而sm.OLS要求输入是一维数组/序列类型,单个float自然触发"不可迭代"的错误。
修正后的代码
#############REGRESSION################### import csv from scipy import stats import statsmodels.api as sm from scipy.optimize import curve_fit from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.stattools import adfuller from sklearn.model_selection import train_test_split from pmdarima.arima.utils import ndiffs import pmdarima as pm from pmdarima import auto_arima from statsmodels.tsa.statespace.sarimax import SARIMAX from statsmodels.tsa.arima_model import ARIMA from statsmodels.tsa.seasonal import seasonal_decompose import numpy as np #First, three stock factors with GDP GDP=list(df1['GDP']) GDP=GDP[:len(stockdf)] GDP.reverse() print(GDP) def param(factor, stock): # 给因子添加常数项,转为符合OLS要求的输入格式 factor_with_const = sm.add_constant(factor) print(type(factor_with_const)) model = sm.OLS(stock, factor_with_const) fit_result = model.fit() params = fit_result.params.tolist() # 返回拟合参数,若需要生成拟合直线,可返回参数计算后的序列 return params print(type(stockdf['SSE'])) stock=list(stockdf['SSE']) print(type(stock)) # 直接传入整个数组,无需使用map遍历单个元素 model_params = param(GDP, stock) print("拟合参数:", model_params) # 生成拟合直线的预测值(可选) fitted_line = model_params[1] * np.array(GDP) + model_params[0] print("拟合序列:", fitted_line)
关键修正点
- 移除
map()调用:直接将整个GDP和stock列表传入param,而非逐个传递单个元素。 - 修正未定义变量:原代码中
return p[1]*x+p[0]的x未定义,改为返回拟合参数,或根据参数计算完整的拟合序列。 - 确保输入维度合规:
sm.add_constant接受一维数组,传入整个GDP列表会自动转为带常数项的二维数组,满足sm.OLS的输入要求。
扩展:多组因子批量回归
如果需要对多组因子和因变量分别做回归,可改用循环遍历数组组,而非单个元素:
def batch_regress(factors_list, stocks_list): fit_results = [] for factor, stock in zip(factors_list, stocks_list): model = sm.OLS(stock, sm.add_constant(factor)) fit_results.append(model.fit().params.tolist()) return fit_results
内容的提问来源于stack exchange,提问作者Jessicaus
相关产品推荐
相关产品推荐

