Пример #1
0
def arima_regression():
    # 参数初始化
    discfile = SRC_PATH + '/data/arima_data.xls'
    forecastnum = 5

    # 读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式
    data = pd.read_excel(discfile, index_col=u'日期')

    # 时序图
    data.plot()
    plt.show()

    # 自相关图
    plot_acf(data).show()
    print u'原始序列的ADF检验结果为:', ADF(data[u'销量'])

    # 差分后的结果
    D_data = data.diff().dropna()
    D_data.columns = [u'销量差分']
    D_data.plot()  # 时序图
    plt.show()

    print data
    print D_data

    plot_acf(D_data).show()  # 自相关图
    plot_pacf(D_data).show()  # 偏自相关图
    print u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])  # 平稳性检测

    # 白噪声检验
    print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值

    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, (p, 1, q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)

    bic_matrix = pd.DataFrame(bic_matrix)  # 从中可以找出最小值

    p, q = bic_matrix.stack().idxmin()  # 先用stack展平,然后用idxmin找出最小值位置。
    print(u'BIC最小的p值和q值为:%s、%s' % (p, q))
    model = ARIMA(data, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
    model.summary2()  # 给出一份模型报告
    model.forecast(5)  # 作为期5天的预测,返回预测结果、标准误差、置信区间。
Пример #2
0
def arima():


    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np

    test_data = list([random.randint(1, 20) for i in range(49)])

    # 时序图
    data = pd.Series(test_data)
    data.plot()
    plt.show()

    # 自相关
    from statsmodels.graphics.tsaplots import plot_acf
    #plot_acf(data).show()

    # 平稳性检测
    from statsmodels.tsa.stattools import adfuller as ADF
    print('original ADF result is', ADF(data))

    D_data = data.diff(3).dropna()
    #print(D_data)
    D_data.plot()
    plt.show()
    print('Diffenciate ADF result is', ADF(D_data))

    from statsmodels.tsa.arima_model import ARIMA

    # 定阶
    pmax = int(len(D_data) / 10)
    qmax = int(len(D_data) / 10)
    bic_matrix = []
    for p in range(pmax + 1):
        tmp = []
        for q in range(qmax + 1):
            try:
                tmp.append(ARIMA(data, (p, 1, q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)

    print(bic_matrix)
    # 展平后找出最小的位置
    bic_matrix = pd.DataFrame(bic_matrix)
    p, q = bic_matrix.stack().idxmin()
    print('BIC minimum p and q is', p, q)
    model = ARIMA(data, (p, 1, q)).fit()
    model.summary2()
    model.forecast(5)
Пример #3
0
def test():
    #'''
    #使用指数衰减方法来做
    #'''
    #ewma = test.ewm(span=7).mean()

    test2 = test.diff(7)
    test2.dropna(inplace=True)
    '''
    使用ACF图对MA部分定阶,由于自相关系数拖尾,偏自相关系数也拖尾,因此使用ARMI模型,
    由于偏自相关图从二阶开始在置信区间内,因此AR部分p = 1,
    自相关图从二阶开始控制在置信区间内,因此MA部分q = 1
    '''
    plot_acf(test2).show
    plot_pacf(test2).show
    '''
    建立ARIMA模型,BIC 500多。。。
    '''
    model = ARIMA(test2, (1, 0, 1)).fit()
    print(model.summary2())
    '''
    使用python的forcast方法
    传入step = 14 预测下面14个时间步,返回值tuple第一个为预测值
    '''
    res = model.forecast(steps=7)[0]
    '''
    trainingSet和validationSet基本呈现稳定的7天周期性,后续在前面加入指数衰减,另外剔除trainingSet异常点效果会更好,对数值进行平滑处理
    指数衰减同时也是对结果做的一次平滑处理
    '''
    trainingSet, validationSet = data.getUserPay()
    '''
    先按照shop_id, datetime做聚合再count
    '''
    return res
Пример #4
0
 def arima_forecast(
     self,
     ts,
     p,
     i,
     q,
 ):
     arima = ARIMA(ts, order=(p, i, q)).fit(disp=-1)
     # ts_predict = arima.predict()
     next_ret = arima.forecast(1)[0]
     return next_ret, arima.summary2()
Пример #5
0
 def arima_forecast(self, ts,  p, i, q,):
     arima = ARIMA(ts, order=(p, i, q)).fit(disp=-1)
     ts_predict = arima.predict()
     next_ret = arima.forecast(1)[0]
     #print("Forecast stock extra return of next day: ", next_ret)
     # plt.clf()
     # plt.plot(ts_predict, label="Predicted")
     # plt.plot(ts, label="Original")
     # plt.legend(loc="best")
     # plt.title("AR Test {},{}".format(p, q))
     # #plt.show()
     return next_ret, arima.summary2()
Пример #6
0
def bulidModel(data, p, q):
    '''
    建立ARIMA 模型,修复平稳性检测不通过的情况
    :param data:
    :param p:
    :param q:
    :return:
    '''
    try:
        model = ARIMA(data, (p, 1, q)).fit()
    except:
        # 平稳性检测不通过,参考:https://github.com/statsmodels/statsmodels/issues/1155/
        model = ARIMA(data, (4, 1, 1)).fit()
    try:
        # 检测模型是否可用
        model.summary2()
    except:
        # 模型平衡性查,就固定p,d,q固定为4,1,1
        model = ARIMA(data, (4, 1, 1)).fit()
        model.summary2()
    # 保存模型
    # model.save('model.pkl')
    return model
Пример #7
0
def test():
    #参数初始化
    discfile = "menori.xlsx"
    forecastnum = 5
    #读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式
    data = pd.read_excel(discfile, index_col=u'Time')
    #时序图
    print(data)
    #用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['SimHei']
    #用来正常显示负号
    plt.rcParams['axes.unicode_minus'] = False
    data.plot()
    plt.show()
    plot_acf(data).show()
    print('原始序列的检验结果为:', adfuller(data[u'nums']))
    D_data = data.diff().dropna()
    D_data.columns = [u'差分']
    D_data.plot()  # 画出差分后的时序图
    plt.show()

    plot_acf(D_data)  # 画出自相关图
    plt.show()
    # plot_pacf(D_data)  # 画出偏相关图
    # plt.show()
    dta = D_data.diff().dropna()
    dta.plot()  # 画出差分后的时序图
    plt.show()
    plot_acf(dta)  # 画出自相关图
    plt.show()
    print(u'差分序列的ADF 检验结果为: ', adfuller(D_data[u'差分']))  # 平稳性检验
    # 差分序列的ADF 检验结果为:  (-3.1560562366723537, 0.022673435440048798, 0, 35, {'1%': -3.6327426647230316,
    # '10%': -2.6130173469387756, '5%': -2.9485102040816327}, 287.5909090780334)
    # 一阶差分后的序列的时序图在均值附近比较平稳的波动, 自相关性有很强的短期相关性, 单位根检验 p值小于 0.05 ,所以说一阶差分后的序列是平稳序列
    # 对一阶差分后的序列做白噪声检验
    from statsmodels.stats.diagnostic import acorr_ljungbox
    print(u'差分序列的白噪声检验结果:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和 p 值
    # 差分序列的白噪声检验结果: (array([11.30402222]), array([0.00077339])) p值为第二项, 远小于 0.05
    # 对模型进行定阶
    model = ARIMA(np.array(data, dtype=np.float), (0, 1, 1)).fit()
    print(
        "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    )
    print(model.summary2())  # 生成一份模型报告
    print(
        "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    )
    print(model.forecast(12))  # 为未来5天进行预测, 返回预测结果, 标准误差, 和置信区间
Пример #8
0
def bulid_arima_predict(data, p, d, q, predict_days):
    #根据给定的数据与参数来构建arima模型
    from statsmodels.tsa.arima_model import ARIMA
    model = ARIMA(data, order=(p, d, q)).fit()
    S = model.summary2()  #给出一份模型报告
    if predict_days > 0:
        P = model.forecast(predict_days)  #作为期5天的预测,返回预测结果、标准误差、置信区间。
        print(
            '================================================report========================================================'
        )
        print(S)
        print(
            '=================================================predict of the 5 days in future============================================================='
        )
        print(pd.Series(list(P)).iloc[0])

        predict_data = []  #构造一个预测序列列表,其中包括历史数据(经过d次查分)以及最终预测出来的数据
        for i in range(len(data)):
            predict_data.append(data[i])
        for i in range(predict_days):
            predict_data.append(pd.Series(list(P)).iloc[0][i])

    return predict_data
Пример #9
0
def ts_arima(tsdata, forenum=5):
    tsdata = tsdata.astype(float)
    # 定阶
    D_data = ts_diff(tsdata)
    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(tsdata, (p, 1, q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)

    bic_matrix = pd.DataFrame(bic_matrix)  # 从中可以找出最小值

    # 可视化BIC矩阵
    fig, ax = plt.subplots(figsize=(10, 8))
    ax = sns.heatmap(
        bic_matrix,
        mask=bic_matrix.isnull(),
        ax=ax,
        annot=True,
        fmt='.2f',
    )
    ax.set_title('BIC')
    plt.show()

    p, q = bic_matrix.stack().idxmin()  # 先用stack展平,然后用idxmin找出最小值位置。
    # print(u'BIC最小的p值和q值为:%s、%s' % (p, q))

    model = ARIMA(tsdata, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
    summary = model.summary2()  # 给出一份模型报告
    forecast = model.forecast(forenum)  # 作为期forenum天的预测,返回预测结果、标准误差、置信区间。
    return bic_matrix, p, q, model, summary, forecast
Пример #10
0
def programmer_6():
    """
    警告解释:
    # UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "
    调用了多次plt.show()
    解决方案,使用plt.subplot()

    # RuntimeWarning: overflow encountered in exp
    运算精度不够

    forecastnum-->预测天数
    plot_acf().show()-->自相关图
    plot_pacf().show()-->偏自相关图
    """
    discfile = 'data/arima_data.xls'
    forecastnum = 5
    data = pd.read_excel(discfile, index_col=u'日期')

    fig = plt.figure(figsize=(8, 6))
    # 第一幅自相关图
    ax1 = plt.subplot(411)
    fig = plot_acf(data, ax=ax1)

    # 平稳性检测
    print(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))
    # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

    # 差分后的结果
    D_data = data.diff().dropna()
    D_data.columns = [u'销量差分']
    # 时序图
    D_data.plot()
    plt.show()
    # 第二幅自相关图
    fig = plt.figure(figsize=(8, 6))
    ax2 = plt.subplot(412)
    fig = plot_acf(D_data, ax=ax2)
    # 偏自相关图
    ax3 = plt.subplot(414)
    fig = plot_pacf(D_data, ax=ax3)
    plt.show()
    fig.clf()

    print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分']))  # 平稳性检测

    # 白噪声检验
    print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值
    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矩阵
    data.dropna(inplace=True)

    # 存在部分报错,所以用try来跳过报错;存在warning,暂未解决使用warnings跳过
    import warnings
    warnings.filterwarnings('error')
    for p in range(pmax + 1):
        tmp = []
        for q in range(qmax + 1):
            try:
                tmp.append(ARIMA(data, (p, 1, q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)
    # 从中可以找出最小值
    bic_matrix = pd.DataFrame(bic_matrix)
    # 用stack展平,然后用idxmin找出最小值位置。
    p, q = bic_matrix.stack().idxmin()
    print(u'BIC最小的p值和q值为:%s、%s' % (p, q))
    model = ARIMA(data, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
    model.summary2()  # 给出一份模型报告
    model.forecast(forecastnum)  # 作为期5天的预测,返回预测结果、标准误差、置信区间。
Пример #11
0
pmax = int(len(D_O3) / 10)  #一般阶数不超过length/10
qmax = int(len(D_O3) / 10)  #一般阶数不超过length/10
e_matrix = []  #评价矩阵
for p in range(pmax + 1):
    tmp = []
    for q in range(qmax + 1):
        try:  #存在部分报错,所以用try来跳过报错。
            tmp.append(ARIMA(O3last2month, (p, 1, q)).fit().aic)
        except:
            tmp.append(None)
    e_matrix.append(tmp)
e_matrix = pd.DataFrame(e_matrix)  #从中可以找出最小值
p, q = e_matrix.stack().idxmin()  #先用stack展平,然后用找出最小值位置。
print('AIC最小的p值和q值为:%s、%s' % (p, q))
model = ARIMA(O3last2month, (p, 1, q)).fit()
model.summary2()  #给出模型报告
print(model.forecast(5))  #作为期5天的预测,返回预测结果、标准误差、置信区间。
preO3 = model.forecast(1)[0]
#PM2.5
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data10.loc[:, 'PM2.5'])
from statsmodels.stats.diagnostic import acorr_ljungbox
print('白噪声-检验结果:', acorr_ljungbox(data1.loc[:, 'PM2.5'], lags=1))
from statsmodels.tsa.stattools import adfuller as ADF
print('ADF-检验结果:', ADF(data10.loc[:, 'PM2.5']))

PM25last2month = data10.iloc[-60:, 2]
from statsmodels.tsa.arima_model import ARIMA
PM25last2month = PM25last2month.astype(float)
pmax = int(len(PM25last2month) / 10)  #一般阶数不超过length/10
qmax = int(len(PM25last2month) / 10)  #一般阶数不超过length/10
Пример #12
0
print('差分序列的ADF检验结果为:', ADF(D_data['销量差分']))  # 平稳性检测

# 白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox

print('差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值

from statsmodels.tsa.arima_model import ARIMA

# 定阶
data['销量'] = data['销量'].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, (p, 1, q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)

bic_matrix = pd.DataFrame(bic_matrix)  # 从中可以找出最小值

p, q = bic_matrix.stack().idxmin()  # 先用stack展平,然后用idxmin找出最小值位置。
print('BIC最小的p值和q值为:%s、%s' % (p, q))
model = ARIMA(data, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
print('模型报告为:\n', model.summary2())
print('预测未来5天,其预测结果、标准误差、置信区间如下:\n', model.forecast(5))
plot_acf(D_data).show() #自相关图
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show() #偏自相关图
print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测

#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值

from statsmodels.tsa.arima_model import ARIMA

#定阶
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, (p,1,q)).fit().bic)
    except:
      tmp.append(None)
  bic_matrix.append(tmp)

bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值

p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值为:%s、%s' %(p,q)) 
model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #给出一份模型报告
model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。
# print(data.head(3))
data['销量'] = data['销量'].astype(float)
# print(data.head(3))

p_max = int(len(D_data) / 10)  # 一般不超过len/10
q_max = int(len(D_data) / 10)  # 一般不超过len/10
# print(p_max)
bic_matrix = []

for p in range(p_max + 1):
    temp = []
    for q in range(q_max + 1):
        try:
            temp.append(ARIMA(data, (p, 1, q)).fit().bic)
        except:
            temp.append(None)
    bic_matrix.append(temp)

# print(bic_matrix)
bic_df = pd.DataFrame(bic_matrix)
# print(bic_df)

p, q = bic_df.stack().idxmin()  # 先用stack展平,再用idxmin找出最小值位置
print("BIC中p和q分别为: {p}、{q}".format(p=p, q=q))

model = ARIMA(data, (p, 1, q)).fit()  # 建立模型

print('输出模型报告:', '\n', model.summary2())
print('输出预测5的结果:', '\n', model.forecast(5))  # 预测值、标准误差、置信区间
# print(model.summary.tables[1])
Пример #15
0
for p in range(pmax+1):
    tmp = []
    for q in range(qmax+1):
        try:
            tmp.append(ARIMA(data,(p,1,q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)


bic_matrix = pd.DataFrame(bic_matrix) #从中找出最小值
print(bic_matrix)

p,q = bic_matrix.stack().idxmin() #使用stack展平 然后找出最小值位置 
print('bic最小的p和最小的q为: %s \ %s'  %(p,q))
model = ARIMA(data,(p,1,q)).fit() #建立模型arima(0,1,1)
result = model.summary2()
print(result)

test = model.forecast(5) #给出未来五天的预测 返回预测结果 标准误差 置信区间
print(test)









Пример #16
0
def arima_test():
    discfile = 'arima_data.xls'
    forecastnum = 5
    data = pd.read_excel(discfile, index_col=u'日期')

    fig = plt.figure(figsize=(8, 6))
    # 第一幅自相关图
    ax1 = plt.subplot(411)
    fig = plot_acf(data, ax=ax1)

    # 平稳性检测
    print(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))
    # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

    # 差分后的结果
    D_data = data.diff().dropna()
    D_data.columns = [u'销量差分']
    # 时序图
    D_data.plot()
    plt.show()
    # 第二幅自相关图
    fig = plt.figure(figsize=(8, 6))
    ax2 = plt.subplot(412)
    fig = plot_acf(D_data, ax=ax2)
    # 偏自相关图
    ax3 = plt.subplot(414)
    fig = plot_pacf(D_data, ax=ax3)
    plt.show()
    fig.clf()

    print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分']))  # 平稳性检测

    # 白噪声检验
    print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值
    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矩阵 贝叶斯似然值
    data.dropna(inplace=True)

    # 存在部分报错,所以用try来跳过报错;存在warning,暂未解决使用warnings跳过
    data = np.array(data, dtype=np.float)
    #     print('*'*20,ARIMA(data, (1, 1, 1)).fit().bic)
    import warnings
    warnings.filterwarnings('error')
    for p in range(pmax + 1):
        tmp = []
        for q in range(qmax + 1):
            try:
                tmp.append(ARIMA(data, (p, 1, q)).fit().bic)  #一阶差分
            except:
                tmp.append(None)
        bic_matrix.append(tmp)
    # 从中可以找出最小值
    bic_matrix = pd.DataFrame(bic_matrix)
    print(bic_matrix)
    # 用stack展平,然后用idxmin找出最小值位置。
    p, q = bic_matrix.stack().idxmin()
    print(u'BIC最小的p值和q值为:%s、%s' % (p, q))
    #     model = ARIMA(data, np.array(p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
    model = ARIMA(data, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
    model.summary2()  # 给出一份模型报告
    model.forecast(forecastnum)  # 作为期5天的预测,返回预测结果、标准误差、置信区间。
Пример #17
0
print(u'1-diff series white noise test result: ',
      acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值

data[u'SALES_VOLUME'] = data[u'SALES_VOLUME'].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, (p, 1, q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)

bic_matrix = pd.DataFrame(bic_matrix)  # 从中可以找出最小值

p, q = bic_matrix.stack().idxmin()  # 先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC minimal p-value and q-value is:%s、%s' % (p, q))
model = ARIMA(data, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型

# 给出一份模型报告
print("************************************************************")
print(model.summary2())
print("************************************************************")
print()
print("************************************************************")
print(model.forecast(forecastnum))  # 作为期forecastnum天的预测,返回预测结果、标准误差、置信区间。
                tmp.append(ARIMA(D_data, (p, 1, q)).fit().bic)
            except:
                tmp.append(100000)
        bic_matrix.append(tmp)

    bic_matrix = pd.DataFrame(bic_matrix)
    p, q = bic_matrix.stack().idxmin()
    print(u'BIC最小的p值和q值为:%s、%s' % (p, q))


# set_pq(data)

from statsmodels.tsa.arima_model import ARIMA

model_8_1 = ARIMA(data, (2, 1, 3)).fit()
print(model_8_1.summary2())  # 给出一份模型报告

# 预测结果进行评估
test_81 = data0['data'][500:505]
predictions__81 = model_8_1.predict(start=len(data),
                                    end=len(data) + len(test_81) - 1,
                                    dynamic=False,
                                    typ='levels')
predictions__81 = np.matrix(predictions__81)
test_81 = np.matrix(test_81)

for i in range(5):
    # print(test[i])
    print('predicted_81=%f, expected=%f', predictions__81[0, i], test_81[0, i])

from sklearn.metrics import mean_squared_error
Пример #19
0
qmax = int(len(data_1) / 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, (p, 1, q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix)  #从中可以找出最小值
p, q = bic_matrix.stack().idxmin()  #先用stack展平,然后用idxmin找出最小值位置。
print(p, q)
model = ARIMA(data, (p, 1, q)).fit()
model.summary2()
model.forecast(6)[0]

#%% --对定阶前的处理
columns = df.columns.tolist()
test = {}
for i in columns:
    city = df[i].values.astype(float)
    print(i, city)
    test[i] = city

#%%
#从一阶差分后的序列是平稳的非白噪声序列可以看出ARIMA模型中的d=1
from statsmodels.tsa.arima_model import ARIMA
for k, i in test.items():
    data = i
def programmer_6():
    """
    警告解释:
    # UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "
    调用了多次plt.show()
    解决方案,使用plt.subplot()

    # RuntimeWarning: overflow encountered in exp
    运算精度不够

    forecastnum-->预测天数
    plot_acf().show()-->自相关图
    plot_pacf().show()-->偏自相关图
    """
    discfile = 'data/arima_data.xls'
    forecastnum = 5
    data = pd.read_excel(discfile, index_col=u'日期')

    fig = plt.figure(figsize=(8, 6))
    # 第一幅自相关图
    ax1 = plt.subplot(411)
    fig = plot_acf(data, ax=ax1)

    # 平稳性检测
    print(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))
    # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

    # 差分后的结果
    D_data = data.diff().dropna()
    D_data.columns = [u'销量差分']
    # 时序图
    D_data.plot()
    plt.show()
    # 第二幅自相关图
    fig = plt.figure(figsize=(8, 6))
    ax2 = plt.subplot(412)
    fig = plot_acf(D_data, ax=ax2)
    # 偏自相关图
    ax3 = plt.subplot(414)
    fig = plot_pacf(D_data, ax=ax3)
    plt.show()
    fig.clf()

    print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分']))  # 平稳性检测

    # 白噪声检验
    print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值
    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矩阵
    data.dropna(inplace=True)

    # 存在部分报错,所以用try来跳过报错;存在warning,暂未解决使用warnings跳过
    import warnings
    warnings.filterwarnings('error')
    for p in range(pmax + 1):
        tmp = []
        for q in range(qmax + 1):
            try:
                tmp.append(ARIMA(data, (p, 1, q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)
    # 从中可以找出最小值
    bic_matrix = pd.DataFrame(bic_matrix)
    # 用stack展平,然后用idxmin找出最小值位置。
    p, q = bic_matrix.stack().idxmin()
    print(u'BIC最小的p值和q值为:%s、%s' % (p, q))
    model = ARIMA(data, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
    model.summary2()  # 给出一份模型报告
    model.forecast(forecastnum)  # 作为期5天的预测,返回预测结果、标准误差、置信区间。
Пример #21
0
plot_pacf(D_data).show()
print(u'1阶差分序列的ADF检验结果为:',ADF(D_data[u'销量差分']))
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:',acorr_ljungbox(D_data,lags=1))
from statsmodels.tsa.arima_model import ARIMA
data[u'销量'] = data[u'销量'].astype(float)
pmax=int(len(D_data)/10)
qmax=int(len(D_data)/10)
bic_matrix=[]
for p in range(pmax+1):
    tmp=[]
    for q in range(qmax+1):
        try:
            tmp.append(ARIMA(data,(p,1,q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)
bic_matrix=pd.DataFrame(bic_matrix)
print(bic_matrix)
p,q=bic_matrix.stack().idxmin()
print(u'bic最小的P值和q值为:%s、%s'%(p,q))
model=ARIMA(data,(p,1,q)).fit()
model.summary2()
forecast=model.forecast(5)
print(forecast)





Пример #22
0
rishouyi = shoupanjia.diff(1)
plt.plot(rishouyi,'r-')
plt.show()

Close_log = np.log(Close)
rishouyi_log = Close_log.diff(1)
rishouyi_log.dropna(inplace=True)

mydata=rishouyi[1:500]
plt.plot(mydata,'r-')
plt.show()

##########首先是ARIMA(1,2,3)模型
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(mydata, (1,2,3)).fit()
print(model.summary2()) #给出一份模型报告

####评估模型预测结果
test=rishouyi[500:505]
predictions = model.predict(start=len(mydata), end=len(mydata)+len(test)-1,
                            dynamic=False,typ='levels')######有差分,要加typ='levels'
predictions=np.matrix(predictions)
test=np.matrix(test)
# print(predictions[0,1])
# print(test[0,1])
#print(test)
for i in range(5):
    #print(test[i])
    print('predicted=%f, expected=%f' ,predictions[0,i], test[0,i])

from sklearn.metrics import mean_squared_error
print(u'差分序列的ADF检验结果为:', ADF(D_data['positive_sum_diff']))  #平稳性检测

#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  #返回统计量和p值

from statsmodels.tsa.arima_model import ARIMA

positive_time['positive_sum'] = positive_time['positive_sum'].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(positive_time, (p, 1, q)).fit().bic)
#     except:
#       tmp.append(None)
#   bic_matrix.append(tmp)
#
# bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值

# p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
# print(u'BIC最小的p值和q值为:%s、%s' %(p,q))

model = ARIMA(positive_time, (1, 0, 1)).fit()  #建立ARIMA(0, 1, 1)模型
model.summary2()  #给出一份模型报告
predict_value, wucha, qujian = model.forecast(5)  #作为期5天的预测,返回预测结果、标准误差、置信区间。
print(predict_value, wucha, qujian)
Пример #24
0
plt.rcParams['axes.unicode_minus'] = False
data.plot()
plt.show()

from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()

from statsmodels.tsa.stattools import adfuller as ADF 

print 'ADF test result:', ADF(data['value'])

D_data = data.diff().dropna()
D_data.columns = ['diff value']
D_data.plot()
plt.show()
plot_acf(D_data).show()
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show()
print 'diff seq ADF test result:', ADF(D_data['diff value'])

from statsmodels.stats.diagnostic import acorr_ljungbox
print 'dff white noise test result:', acorr_ljungbox(D_data, lags = 1)

from statsmodels.tsa.arima_model import ARIMA


model = ARIMA(data, (1,1,1)).fit()
model.summary2()
model.forecast(5*6)