zoukankan      html  css  js  c++  java
  • 时间序列预测入(二)

    ARIMA预测

    # -*- coding: utf-8 -*-
    """
    Created on Fri Mar 22 21:03:34 2019
    
    @author: Administrator
    """
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from datetime import datetime
    from datetime import timedelta
    
    num = 14
    filenames = []
    basepath = 'D:\pworkspace\data\Metro_train\'
    for i in range(1, num+1):
        if i < 10:
            filenames.append(basepath + 'record_2019-01-0' + str(i) + '.csv')
        else:
            filenames.append(basepath + 'record_2019-01-' + str(i) + '.csv')
    
    flag = True      
    for filename in filenames:
        df = pd.read_csv(filename)
        df['time'] = df['time'].str[:-4] + '0:00'
        df['time'] = pd.to_datetime(df['time'])
        df0 = df[df['stationID'] == 0].copy()
        del df
        user_in = df0[df0['status'] == 1]
        user_out = df0[df0['status'] == 0]
        user_in = user_in.groupby('time')
        user_out = user_out.groupby('time')
        user_in = user_in.count()
        user_out = user_out.count()
        user_in['count'] = user_in['userID']
        user_out['count'] = user_out['userID']
        user_in = user_in.drop(['lineID', 'stationID', 'deviceID',
                                'status', 'payType', 'userID'], axis=1)
        user_out = user_out.drop(['lineID', 'stationID', 'deviceID',
                                'status', 'payType', 'userID'], axis=1)
        if flag:
            user_in_all = user_in
            #user_out_all = user_out
            flag = False
        else:
            user_in_all = pd.concat([user_in_all,user_in], axis=0)
            #user_out_all = pd.concat([user_out_all,user_out], axis=0)
            
    
    #start = datetime(2019,1,1,0,0,0)
    #timelist = [ str(start + timedelta(seconds=600*i)) for i in range(24 * 6 * 2)]
    
    startdate = datetime(2019,1,1,0,0,0)
    enddate = startdate + timedelta(days=num-1, minutes=50, hours=23)
    
    all_time_data = pd.DataFrame({'time' : pd.date_range(start=str(startdate), 
                                   end=str(enddate),  freq='10T')})
    all_time_data['count'] = 0
    all_time_data.index = all_time_data['time']
    all_time_data = all_time_data.drop('time', axis=1)
    
    user_in_all = pd.merge(all_time_data, user_in_all, right_on='time', 
             left_index=True, how='outer')
    user_in_all[np.isnan(user_in_all['count_y'])] = 0
    user_in_all['count_x'] = user_in_all['count_x'] + user_in_all['count_y']
    
    user_in_all['count'] = user_in_all['count_x']
    user_in_all = user_in_all.drop(['count_x', 'count_y'], axis=1)
    user_in_all.plot(figsize=(15,8))
    plt.show()
    
    ts = user_in_all['count']
    ts_ewma = pd.DataFrame(ts).ewm(span=60).mean()
    ts_ewma.plot(figsize=(15,8))
    plt.show()
    
    from statsmodels.tsa.stattools import acf, pacf, adfuller
    from statsmodels.stats.diagnostic import acorr_ljungbox
    from statsmodels.tsa.arima_model import ARIMA
    #import statsmodels.api as sm
    
    ts_diff_1 = ts_ewma.diff(1).dropna(axis=0, how='any')
    ts_diff_1 = ts_diff_1['count']
    
    # ADF平稳性检验
    adfuller(ts_diff_1, autolag='AIC')
    # 白噪声检验
    acorr_ljungbox(ts_diff_1, 1)
    # ACF PACF
    lag_acf = acf(ts_diff_1, nlags=50)
    lag_pacf = pacf(ts_diff_1, nlags=50)
    plt.figure(facecolor='white', figsize=(15, 8))
    plt.plot(lag_acf)
    plt.show()
    plt.figure(facecolor='white', figsize=(15, 8))
    plt.plot(lag_pacf)
    plt.axhline(y=-1.9/np.sqrt(len(ts_diff_1)), linestyle='--', color='gray')
    plt.axhline(y=1.9/np.sqrt(len(ts_diff_1)), linestyle='--', color='gray')
    plt.show()
    
    model = ARIMA(ts_diff_1, order=(6, 0, 0))
    ts_predict = model.fit().predict()
    rmse = np.sqrt(sum((ts_predict - ts_diff_1)**2) / ts_diff_1.size)
    
    plt.figure(facecolor='white', figsize=(15, 8))
    plt.plot(ts_predict, lw=0.5, color='blue', label='Predict')
    plt.plot(ts_diff_1, lw=0.5, color='red', label='Original')
    plt.legend(loc='lower right')
    #plt.ylim((-1000, 1000))
    plt.show()

    运行结果

  • 相关阅读:
    mbed TLS 介绍
    PostGIS:Working with Raster Data
    TIN数据格式:DEM的三种表示方法之一
    ArcScene显示DEM
    Python与MapNik 等高线渲染&抽稀
    Android GPS定位
    osmdroid通过点击获取当前坐标
    osmdroid高级教程
    mongodb 用户 权限 设置 详解
    Mongodb设置用户权限(整理版)
  • 原文地址:https://www.cnblogs.com/coshaho/p/10590940.html
Copyright © 2011-2022 走看看