时间序列模型

import pandas as pd
import numpy as np
import matplotlib.pylab as plt
from scipy import stats
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima_model import ARMA
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.api import qqplot
from matplotlib.pylab import rcParams
rcParams["figure.figsize"] = 15,6

f = open(r"D:\公司\miss_predict\突变算法数据.txt")
dataf = pd.read_table(f)

data_bs = dataf[dataf["指标"] == "本省率"][["时间","指标值"]].reset_index(drop = True)
data_bw = dataf[dataf["指标"] == "本网率"].reset_index(drop = True)
data_ddzq = dataf[dataf["指标"] == "调度准确率"].reset_index(drop = True)
data_ddbw = dataf[dataf["指标"] == "调度本网率"].reset_index(drop = True)

# #时间序列
# data_bs["时间"] = [str(one) + "00" for one in data_bs["时间"]]
# data_bs["时间"] = pd.to_datetime(data_bs["时间"])
# data_bs.rename(columns = {"时间":"date", "指标值":"value"}, inplace= True)
# #时间做索引
# data_bs.set_index("date", inplace = True)
# data = data_bs["value"]

data_bs.index = pd.date_range(start='2018-08-01 00:00:00',periods=744,freq='h',normalize=True)
data = data_bs["指标值"]

#判断数据的平稳性
get_ipython().run_line_magic('pylab', 'inline')
plt.figure(figsize(12,5))
plt.plot(data)

#均值,使用均值填充0值
mean = round(data.mean(),2)
for one in range(data.shape[0]):
    if data[one] < 32:
        data[one] = mean
mean2 = round(data[data.index>'2018-08-24 04:00:00'].mean())
for one in range(742 - data[data.index >'2018-08-24 04:00:00'].shape[0], data.shape[0]):
    if data[one] < 42:
        data[one] = mean2

#填充后,判断数据的平稳性
get_ipython().run_line_magic('pylab', 'inline')
plt.figure(figsize(12,8))
plt.plot(data)

#时间序列差分,以确定模型
fig = plt.figure(figsize = (12,8))
diff1 = data.diff(1)
diff1.plot()

#ADF单位根平稳型检验
diff2 = data.diff(2)
fig = plt.figure(figsize(12,5))
ax1 = fig.add_subplot(211)
fig = plot_acf(diff1, lags = 40, ax = ax1)
ax2 = fig.add_subplot(212)
fig = plot_pacf(diff1, lags = 40, ax = ax2)

model1 = ARMA(data, order = (2,1))
result1 = model1.fit(disp = False)
model2 = ARMA(data, order = (3,0))
result2 = model2.fit(disp = False)
model4 = ARMA(data, order = (1,2))
result4 = model4.fit(disp = False)
model5 = ARMA(data, order = (1,0))
result5 = model5.fit(disp = False)

print(result1.aic, result1.bic, result1.hqic)
print(result2.aic, result2.bic, result2.hqic)
print(result4.aic, result4.bic, result4.hqic)
print(result5.aic, result5.bic, result5.hqic)


#残差
resid = result1.resid
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(resid, lags=40, ax=ax2)

fig = plt.figure(figsize=(12,5))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q', ax=ax, fit=True)

model = ARMA(data[0:700], order = (1,1))
result = model.fit(disp = False)

pred = result.predict("2018-08-21 14:00:00", "2018-08-31 22:00:00")

plt.plot(data[0:741], c = 'r')
plt.plot(pred)


# pd.date_range(start='2017-08-01 00:00:00',periods=744,freq='h',normalize=True)
一阶差分及还原
import pandas as pd
time_series = pd.Series([2,4,3,5,6,7,4,5,6,3,2,4], index=pd.date_range(start='2000', periods=12, freq='a'))
time_series_diff = time_series.diff(1).dropna()

time_series_restored = pd.Series([time_series[0]], index=[time_series.index[0]]) .append(time_series_diff).cumsum()

猜你喜欢

转载自blog.csdn.net/weixin_41512727/article/details/82893144