Python数据分析与挖掘实战 11章

因学习中发现《Python数据分析与挖掘实战》中的代码,有些不能实现,自己学习的时候走了很多弯路,特此分享可直接实现的代码,希望能让有需要的朋友少走弯路。

11-1部分

#属性变换
import pandas as pd
inputfile='../11.2/discdata.xls'
outfile='../11.2/processed.xls'
data=pd.read_excel(inputfile)
data=data[data['TARGET_ID']==184]
data_group=data.groupby('COLLECTTIME')

def arrt(x):
    result=pd.Series(index=['SYS_NAME','CWXT_DB:184:C\\','CWXT_DB:184:D\\','COLLECTTIME'])
    result['SYS_NAME']=x['SYS_NAME'].iloc[0]
    result['COLLECTTIME'] = x['COLLECTTIME'].iloc[0]
    result['CWXT_DB:184:C\\']=x['VALUE'].iloc[0]
    result['CWXT_DB:184:D\\'] = x['VALUE'].iloc[1]
    return result

data_processed=data_group.apply(arrt)
print(data_processed)
data_processed.to_excel(outfile,index=False)

11-2部分

#平稳性检验
import pandas as pd
from statsmodels.tsa.stattools import adfuller as ADF
inputfile='../11.2/processed.xls'
data=pd.read_excel(inputfile)
data=data[:len(data)-5]
d=0
adf=ADF(data['CWXT_DB:184:D\\'])
while adf[1]>=0.05:
    d=d+1
    adf=ADF(data['CWXT_DB:184:D\\'].diff(d).dropna())

print(u'原始序列经过%s阶差分后归于平稳,p值为%s'%(d,adf[1]))

11-3部分

#白噪音检验
import pandas as pd
from statsmodels.stats.diagnostic import acorr_ljungbox
inputfile='../11.2/processed.xls'
data=pd.read_excel(inputfile)
data=data[:len(data)-5]
a=acorr_ljungbox(data['CWXT_DB:184:D\\'],lags=1)

if a[1]<0.05:
    print(u'原始序列为非白噪音序列,对应的P值为%s'%a[1])
else:
    print(u'原始序列为白噪音序列,对应的P值为%s' % a[1])

a=acorr_ljungbox(data['CWXT_DB:184:D\\'].diff().dropna(),lags=1)

if a[1]<0.05:
    print(u'一阶差分序列为非白噪音序列,对应的P值为%s'%a[1])
else:
    print(u'一阶差分序列为白噪音序列,对应的P值为%s' % a[1])

11-4部分

#模型识别
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
inputfile='../11.2/processed.xls'
data=pd.read_excel(inputfile,index_col='COLLECTTIME')
data=data.iloc[:len(data)-5]

xdata=data['CWXT_DB:184:D\\']

pmax=int(len(xdata)/10)
qmax=int(len(xdata)/10)
bic_matrix=[]
for p in range(pmax+1):
    tmp=[]
    for q in range(qmax+1):
        try:
            tmp.append(ARIMA(xdata,(p,1,q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)
bic_matrix=pd.DataFrame(bic_matrix)
bic_matrix=bic_matrix.astype('float64')
p,q=bic_matrix.stack().idxmin()
print(u'BIC最小的p值和q值为:%s、%s'%(p,q))

11-5部分

#模型检验
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.stats.diagnostic import acorr_ljungbox
inputfile='../11.2/processed.xls'
data=pd.read_excel(inputfile,index_col='COLLECTTIME')
data=data.iloc[:len(data)-5]
lagnum=12
xdata=data['CWXT_DB:184:D\\']

arima=ARIMA(xdata,(0,1,1)).fit()        #建立并训练模型
xdata_pred=arima.predict(typ='levels')  #预测
pred_error=(xdata_pred-xdata).dropna()

lb,p=acorr_ljungbox(pred_error,lags=lagnum)

h=(p<0.05).sum()

if h>0:
    print(u'模型ARIMA(0,1,1)不符合白噪声检验')
else:
    print(u'模型ARIMA(0,1,1)符合白噪声检验')

11-6部分

#模型评价
import pandas as pd
inputfile='../11.2/predictdata.xls'
data=pd.read_excel(inputfile)
abs_=(data[u'预测值']-data[u'实际值']).abs()  #绝对值
mae_=abs_.mean()                                #平均值

rmse_=((abs_**2).mean())**0.5                   #平方根
mape_=(abs_/data[u'实际值']).mean()
print(u'平均绝对误差为:%0.4f,\n均方差根误差为:%0.4f,\n平均绝对百分误差为:%0.6f.'%(mae_,rmse_,mape_))

猜你喜欢

转载自blog.csdn.net/lonely2018/article/details/80178745