|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
报错信息:ValueError: attempt to get argmin of an empty sequence
销量预测用的ARIMA模型,前面自相关偏相关都正常,最后BIC矩阵都是none,而且最后报错,直接用ARIMA模型也会出错
import pandas as pd
import pylab
import seaborn as sns
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.stattools import adfuller as ADF
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import acf
discfile = "E:/邮电器材/销管/销量预测/手机产业销量预测/销量数据.xlsx" #参数初始化
#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus'] = False #正常显示负号
#pylab.rcParams['figure.figsize'] = (10,6) #设置输出图片大小
#sns.set(color_codes=True) #seaborn设置背景
data = pd.read_excel(discfile,index_col=u'日期')
data.plot() #时序图
plt.show()
plot_acf(data).show() #自相关图
#平稳性检测
print(u'原始序列的ADF检验结果为:', ADF(data[u'销量'])) #Pdf值大于三个水平值,p值显著大于0.05,该序列为非平稳序列。
#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
#一阶差分
D_data = data.diff().dropna()
D_data.columns = [u'销量差分']
D_data.plot() #时序图
plt.show()
plot_acf(D_data).show() #自相关图
plt.show()
plot_pacf(D_data,lags=9).show() #偏自相关图
#平稳性检测
print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #Pdf值小于两个水平值,p值显著小于0.05,一阶差分后序列为平稳序列。
#白噪声检验
#返回统计量和p值
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #P值小于0.05,所以一阶差分后的序列为平稳非白噪声序列。
data[u'销量'] = data[u'销量'].astype(float)
#定阶
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10) #一般阶数不超过length/10
bic_matrix = [] #bic矩阵
for p in range(pmax+1):
tmp = []
for q in range(qmax+1):
try: # 存在部分报错,所以用try来跳过报错。
tmp.append(ARIMA(data['销量'], order=(p,1,q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
print(bic_matrix)
#输出BIC矩阵
bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值
#先用stack展平,然后用idxmin找出最小值位置。
p,q = bic_matrix.stack().astype(float).idxmin()
print(u'BIC最小的p值和q值为:%s、%s' %(p,q))
#取BIC信息量达到最小的模型阶数,结果p为0,q为1,定阶完成。
#建立ARIMA(0, 1, 1)模型
model = ARIMA(data, order=(p,1,q)).fit(disp=0)
model.summary2() #给出一份模型报告
model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。 |
-
|