时序模式

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pandas as pd

discfile='E:\\pycharm\\python数据分析与挖掘实战数据及源码\\chapter5\\demo\\data\\arima_data.xls'
forecastum=5
data=pd.read_excel(discfile,index_col='日期')

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data.plot()
plt.title('原始序列的时序图')
plt.show()

#自相关图
from statsmodels.graphics.tsaplots import plot_acf

plot_acf(data).show()

#平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF检验结果为:',ADF(data[u'销量']))
#返回结果依次为:adf,pvalue,usedlag,nobs,critcal,values,icbest,trgresults,resstore

#差分后的结果
D_data=data.diff().dropna()#一阶差分
D_data.columns=[u'销量差分']
D_data.plot()
plt.show()#一阶差分之后的序列的时序图
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('差分序列的白噪声检验的结果为:',acorr_ljungbox(D_data,lags=1))#返回统计量和p值

from statsmodels.tsa.arima_model import  ARIMA
#定阶
pmax=int(len(D_data)/10)
qmax=int(len(D_data)/10)
bic_matrix=[]#bic矩阵
for p in range(pmax+1):
    tmp=[]#存在部分报错,所以用try来跳过报错
    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)#从中可以找出最小值
p,q=bic_matrix.stack().idxmin()#先用stack展平,然后用idmin招到最小值位置
print(u'BIC最小p值和q值为:%s %s',(p,q))
model=(ARIMA(data,(p,1,q)).fit())
model.summary2()
model.forecast(5)



在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

离群点检测

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd

#参数初始化
inputfile='E:\\pycharm\\python数据分析与挖掘实战数据及源码\\chapter5\\demo\\data\\consumption_data.xls'
k=3#聚类的类别
threshold=2#离群点阈值
iteration=500 #聚类最大循环次数
data=pd.read_excel(inputfile,index_col='Id')
data_zs=1.0*(data-data.mean())/data.std()#数据标准化

from sklearn.cluster import KMeans
model=KMeans(n_clusters=k,n_jobs=4,max_iter=iteration)#分为k类,并发数为4
model.fit(data_zs)

#标准化数据及其类别
r=pd.concat([data_zs,pd.Series(model.labels_,index=data.index)],axis=1)
r.columns=list(data.columns)+[u'聚类类别']

norm=[]
for i in range(k):
    norm_tmp=r[['R','F','M']][r[u'聚类类别']==i]-model.cluster_centers_[i]
    norm_tmp=norm_tmp.apply(np.linalg.norm,axis=1)
    norm.append(norm_tmp/norm_tmp.median())

norm=pd.concat(norm)

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
norm[norm<=threshold].plot(style='go')#正常点

discrete_points=norm[norm>threshold]
discrete_points.plot(style='ro')

for i in  range(len(discrete_points)):
    id=discrete_points.index[i]
    n=discrete_points.iloc[i]
    plt.annotate('(%s,%0.2f)'%(id,n),xy=(id,n),xytext=(id,n))
plt.xlabel(u'编号')
plt.ylabel(u'相对距离')
plt.show()




Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐