因学习中发现《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_))