在运行以下代码时
x = data1 # service类型数据
y = data2
X = sm.add_constant(x)
result = (sm.OLS(y, X)).fit()
print(result.summary)
报错:ValueError: the indices for endog and exog are not aligned
解决思路:
1、排查数据类型:与service或dataframe类型无关,也与y和X的数据类型是否一致无关
2、排查数据长度:len(y)和len(X)的长度一致
3、发现虽然len长度一致,但是数据的索引值不同。问题出在这里。
因为我的x数据,是2个dataframe数据通过concat方式纵向合并起来的,所以数据的索引值不同。
如下图:
完整数据是:
date
0 20180101
1 20180102
2 20180103
3 20180104
4 20180105
5 20180106
但合并数据是这样展示但:
date
0 20180101
1 20180102
2 20180103
3 20180104
0 20180105
1 20180106
就是因为2组用来计算的service数据,左侧的索引值不同,导致报错。
解决方案:
无论原始数据是dataframe还是service类型,都先转换成list类型。
以dataframe类型数据为例:
datalist = data['close'].tolist() # 将dataframe转换成list
datalist = data + templist # list合并
dataf = pd.DataFrame(datalist, columns=['close']) # list转换成dataframe
经过前期对数据的一系列处理,再次执行程序,报错消失。
正常显示:
OLS Regression Results
==============================================================================
Dep. Variable: close R-squared: 0.326
Model: OLS Adj. R-squared: 0.326
Method: Least Squares F-statistic: 1932.
Date: Tue, 22 Jan 2019 Prob (F-statistic): 0.00
Time: 14:34:33 Log-Likelihood: -11706.
No. Observations: 4000 AIC: 2.342e+04
Df Residuals: 3998 BIC: 2.343e+04
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 6.8217 0.092 74.332 0.000 6.642 7.002
close 0.3305 0.008 43.951 0.000 0.316 0.345
==============================================================================
Omnibus: 786.494 Durbin-Watson: 0.009
Prob(Omnibus): 0.000 Jarque-Bera (JB): 1384.316
Skew: 1.260 Prob(JB): 2.51e-301
Kurtosis: 4.399 Cond. No. 15.7
==============================================================================