前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文囊括时间序列方法(源码)

一文囊括时间序列方法(源码)

作者头像
算法进阶
发布于 2022-06-01 00:44:43
发布于 2022-06-01 00:44:43
84900
代码可运行
举报
文章被收录于专栏:算法进阶算法进阶
运行总次数:0
代码可运行

1 时间序列

时间序列是指将某种现象某一个统计指标在不同时间上的各个数值,按时间先后顺序排列而形成的序列。典型的时间序列问题,例如股价预测、制造业中的电力预测、传统消费品行业的销售预测、客户日活跃量预测等等。(本文以客户日活跃量预测为例。)

2 预测方法

时间序列的预测方法可以归纳为三类:1、时间序列基本规则法-周期因子法;2、传统序列预测方法,如均值回归、ARIMA等线性模型;3、机器学习方法,将序列预测转为有监督建模预测,如XGBOOST集成学习方法,LSTM长短期记忆神经网络模型。

2.1 周期因子法

当序列存在周期性时,通过加工出数据的周期性特征预测。这种比较麻烦,简述下流程不做展开。1、计算周期的因子 。2、计算base 3、预测结果=周期因子*base

2.1 Ariama

ARIMA模型,差分整合移动平均自回归模型,又称整合移动平均自回归模型 (移动也可称作滑动),时间序列预测分析方法之一。ARIMA(p,d,q)中, AR是"自回归",p为自回归项数;MA为"滑动平均",q为滑动平均项数, d为使之成为平稳序列所做的差分次数(阶数)。建模的主要步骤是:1、数据需要先做平稳法处理:采用(对数变换或差分)平稳化后,并检验符合平稳非白噪声序列;2、观察PACF和ACF截尾/信息准则定阶确定(p, q); 3、 建立ARIMA(p,d,q)模型做预测;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""
ARIMA( 差分自回归移动平均模型)预测DAU指标
"""
import numpy as np
import pandas as pd
import seaborn as sns
import scipy
import matplotlib.pyplot as plt
import statsmodels.api as sm
import warnings
from math import sqrt
from pandas import Series
from sklearn.metrics import mean_squared_error
from statsmodels.graphics.tsaplots import acf, pacf,plot_acf, plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima_model import ARIMA, ARMA, ARIMAResults
from statsmodels.tsa.stattools import adfuller as ADF
from keras.models import load_model

warnings.filterwarnings("ignore")

df = pd.read_csv('DAU.csv')
dau = df["dau"]


# 折线图
df.plot()
plt.show()

# 箱线图
ax = sns.boxplot(y=dau)
plt.show()


# pearsonr时间相关性
# a = df['dau']
# b = df.index
# print(scipy.stats.pearsonr(a,b))
# 自相关性
plot_acf(dau)
plot_pacf(dau)
plt.show()
print('raw序列的ADF')
# p值大于0.05为非平衡时间序列
print(ADF(dau))

#对数变换平稳处理 
# dau_log = np.log(dau)

# dau_log = dau_log.ewm(com=0.5, span=12).mean()
# plot_acf(dau_log)
# plot_pacf(dau_log)
# plt.show()
# print('log序列的ADF')
# print(ADF(dau_log))

# print('log序列的白噪声检验结果')
# # 大于0.05为白噪声序列
# print(acorr_ljungbox(dau_log, lags=1))


#差分平稳处理
diff_1_df = dau.diff(1).dropna(how=any)
diff_1_df = diff_1_df
diff_1_df.plot()
plot_acf(diff_1_df)
plot_pacf(diff_1_df)
plt.show()

print('差分序列的ADF')
print(ADF(diff_1_df))

print('差分序列的白噪声检验结果')
# 大于0.05为白噪声序列
print(acorr_ljungbox(diff_1_df, lags=1))


# # 在满足检验条件后,给出最优p q值 ()
r, rac, Q = sm.tsa.acf(diff_1_df, qstat=True)
prac = pacf(diff_1_df, method='ywmle')
table_data = np.c_[range(1,len(r)), r[1:], rac, prac[1:len(rac)+1], Q]
table = pd.DataFrame(table_data, columns=['lag', "AC","Q", "PAC", "Prob(>Q)"])
order = sm.tsa.arma_order_select_ic(diff_1_df, max_ar=7, max_ma=7, ic=['aic', 'bic', 'hqic'])
p, q =order.bic_min_order
print("p,q")
print(p, q)

# 建立ARIMA(p, d, q)模型  d=1
order = (p, 1, q)
train_X = diff_1_df[:]
arima_model = ARIMA(train_X, order).fit()

# 模型报告
# print(arima_model.summary2())

# 保存模型
arima_model.save('./data/arima_model.h5')

# # load model
arima_model = ARIMAResults.load('./data/arima_model.h5')


# 预测未来两天数据
predict_data_02 = arima_model.predict(start=len(train_X), end=len(train_X) + 1, dynamic = False)

# 预测历史数据
predict_data = arima_model.predict(dynamic = False)

# 逆log化
# original_series = np.exp(train_X.values[1:] + np.log(dau.values[1:-1]))
# predict_series = np.exp(predict_data.values + np.log(dau.values[1:-1]))
# 逆差分
original_series = train_X.values[1:] + dau.values[1:-1]
predict_series = predict_data.values + dau.values[1:-1]

# comp = pd.DataFrame()
# comp['original'] = original_series
# comp['predict'] = predict_series
split_num = int(len(dau.values)/3) or 1
rmse = sqrt(mean_squared_error(original_series[-split_num:], predict_series[-split_num:]))
print('Test RMSE: %.3f' % rmse)
# (0,1,0)Test RMSE

plt.title('ARIMA RMSE: %.3f' % rmse)
plt.plot(original_series[-split_num:], label="original_series")
plt.plot(predict_series[-split_num:], label="predict_series")
plt.legend()
plt.show()

2.2 lstm

Long Short Term 网络是一种 RNN 特殊的类型,可以学习长期依赖序列信息。LSTM区别于RNN的地方,主要就在于它在算法中加入了一个判断信息有用与否的“处理器”,这个处理器作用的结构被称为cell。一个cell当中被放置了三扇门,分别叫做输入门、遗忘门和输出门。一个信息进入LSTM的网络当中,只有符合信息才会留下,不符的信息则通过遗忘门被遗忘。通过这机制减少梯度爆炸/消失的风险。

建模主要的步骤:1、数据处理:差分法数据平稳化;MAX-MIN法数据标准化;构建监督学习训练集;(对于LSTM,差分及标准化不是必要的) 2、模型训练并预测;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""
LSTM预测DAU指标
"""
import numpy as np
from pandas import DataFrame, datetime, concat,read_csv, Series
from matplotlib import pyplot as plt
from sklearn.metrics import mean_squared_error
from math import sqrt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.models import load_model
from keras.layers import Dense
from keras.layers import LSTM
from keras.callbacks import EarlyStopping
from keras import regularizers
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.stattools import adfuller as ADF

# convert date
def parser(x):
    return datetime.strptime(x,"%Y-%m-%d")

#supervised
def timeseries_to_supervised(data, lag=1):
  df = DataFrame(data)
  columns = [df.shift(1) for i in range(1, lag+1)]
  columns.append(df)
  df = concat(columns, axis=1)
  df.fillna(0, inplace=True)
  return df

# diff series
def difference(dataset, interval=1):
    diff = list()
    for i in range(interval, len(dataset)):
        value = dataset[i] - dataset[i - interval]
        diff.append(value)
    return Series(diff)

# invert diff value
def inverse_difference(history, yhat, interval=1):
    return yhat + history[-interval]

# max_min标准化  [-1, 1]
def scale(train, test):
  # fit scaler
  scaler = MinMaxScaler(feature_range=(-1, 1))
  scaler = scaler.fit(train)
  # transform train
  train = train.reshape(train.shape[0], train.shape[1])
  train_scaled = scaler.transform(train)
  # transform test
  test = test.reshape(test.shape[0], test.shape[1])
  test_scaled = scaler.transform(test)
  return scaler, train_scaled, test_scaled

# invert scale transform
def invert_scale(scaler, X, value):
  new_row = [x for x in X] + [value]
  array = np.array(new_row)
  array = array.reshape(1, len(array))
  inverted = scaler.inverse_transform(array)
  return inverted[0, -1]

# model train
def fit_lstm(train, batch_size, nb_epoch, neurons):
  X, y = train[:,0:-1], train[:,-1]
  # reshp
  X = X.reshape(X.shape[0], 1, X.shape[1])
  model = Sequential()
  # stateful
  # input(samples:batch row, time steps:1, features:one time observed)
  model.add(LSTM(neurons,
                 batch_input_shape=(batch_size, X.shape[1], X.shape[2]),
                 stateful=True, return_sequences=True, dropout=0.2))
  model.add(Dense(1))
  model.compile(loss="mean_squared_error", optimizer="adam")
# train
  train_loss = []
  val_loss = []
  for i in range(nb_epoch):
    # shuffle=false
    history = model.fit(X, y, batch_size=batch_size, epochs=1,verbose=0,shuffle=False,validation_split=0.3)
    train_loss.append(history.history['loss'][0])
    val_loss.append(history.history['val_loss'][0])
    # clear state
    model.reset_states()
    # 提前停止训练
    if i > 50 and sum(val_loss[-10:]) < 0.3:
      print(sum(val_loss[-5:]))
      print("better epoch", i)
      break

    # print(history.history['loss'])

  plt.plot(train_loss)
  plt.plot(val_loss)
  plt.title('model train vs validation loss')
  plt.ylabel('loss')
  plt.xlabel('epoch')
  plt.legend(['train', 'validation'], loc='upper right')
  plt.show()
  return model

# model predict
def forecast_lstm(model, batch_size, X):
  X = X.reshape(1, 1, len(X))
  yhat = model.predict(X, batch_size=batch_size)
  return yhat[0,0]

# 开始加载数据
series = read_csv('DAU.csv')["dau"]
print(series.head())
series.plot()
plt.show()

# 数据平稳化
raw_values = series.values
diff_values = difference(raw_values, 1)
print(diff_values.head())
plt.plot(raw_values, label="raw")
plt.plot(diff_values, label="diff")
plt.legend()
plt.show()
print('差分序列的ADF')
print(ADF(diff_values)[1])
print('差分序列的白噪声检验结果')
# (array([13.95689179]), array([0.00018705]))
print(acorr_ljungbox(diff_values, lags=1)[1][0])
# 序列转监督数据
supervised = timeseries_to_supervised(diff_values, 1)
print(supervised.head())
supervised_values = supervised.values

# split data
split_num = int(len(supervised_values)/3) or 1
train, test = supervised_values[0:-split_num], supervised_values[-split_num:]

# 标准化
scaler, train_scaled, test_scaled = scale(train, test)

#fit model
lstm_model = fit_lstm(train_scaled, 1, 200, 5)
train_reshaped = train_scaled[:, 0].reshape(len(train_scaled), 1, 1)
train_predict = lstm_model.predict(train_reshaped, batch_size=1)
train_raw = train_scaled[:, 0]

# # train RMSE plot
# train_raw = raw_values[0:-split_num]
# predictions = list()
# for i in range(len(train_scaled)):
#   # make one-step forecast
#   X, y = train_scaled[i, 0:-1], train_scaled[i, -1]
#   yhat = forecast_lstm(lstm_model, 1, X)
#   # invert scaling
#   yhat = invert_scale(scaler, X, yhat)
#   # invert differencing
#   yhat = inverse_difference(raw_values, yhat, len(train_scaled)+1-i)
#   # store forecast
#   predictions.append(yhat)
#   expected = train_raw[i]
#   mae = abs(yhat-expected)
#   print('data=%d, Predicted=%f, Expected=%f, mae=%.3f' % (i+1, yhat, expected,mae))
#   print(mae)
# plt.plot(train_raw, label="train_raw")
# plt.plot(predictions, label="predict")
# plt.legend()
# plt.show()
# 保存模型
lstm_model.save('./data/lstm_model_epoch50.h5')
# # load model
lstm_model = load_model('./data/lstm_model_epoch50.h5')

# validation
predictions = list()
for i in range(len(test_scaled)):
  # make one-step forecast
  X, y = test_scaled[i, 0:-1], test_scaled[i, -1]
  yhat = forecast_lstm(lstm_model, 1, X)
  # invert scaling
  yhat = invert_scale(scaler, X, yhat)
  # invert differencing
  yhat = inverse_difference(raw_values, yhat, len(test_scaled)+1-i)
  # store forecast
  predictions.append(yhat)
  expected = raw_values[len(train) + i + 1]
  mae = abs(yhat-expected)
  print('data=%d, Predicted=%f, Expected=%f, mae=%.3f' % (i+1, yhat, expected, mae))
mae = np.average(abs(predictions - raw_values[-split_num:]))
print("Test MAE: %.3f",mae)
#report performance
rmse = sqrt(mean_squared_error(raw_values[-split_num:], predictions))
print('Test RMSE: %.3f' % rmse)
# line plot of observed vs predicted
plt.plot(raw_values[-split_num:], label="raw")
plt.plot(predictions, label="predict")
plt.title('LSTM Test RMSE: %.3f' % rmse)
plt.legend()
plt.show()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 附数据集dau.csv
log_date,dau
2018-06-01,257488
2018-06-02,286612
2018-06-03,287405
2018-06-04,246955
2018-06-05,249926
2018-06-06,252951
2018-06-07,255467
2018-06-08,262498
2018-06-09,288368
2018-06-10,288440
2018-06-11,255447
2018-06-12,251316
2018-06-13,251654
2018-06-14,250515
2018-06-15,262155
2018-06-16,288844
2018-06-17,296143
2018-06-18,298142
2018-06-19,264124
2018-06-20,262992
2018-06-21,263549
2018-06-22,271631
2018-06-23,296452
2018-06-24,296986
2018-06-25,271197
2018-06-26,270546
2018-06-27,271208
2018-06-28,275496
2018-06-29,284218
2018-06-30,307498
2018-07-01,316097
2018-07-02,295106
2018-07-03,290675
2018-07-04,292231
2018-07-05,297510
2018-07-06,298839
2018-07-07,302083
2018-07-08,301238
2018-07-09,296398
2018-07-10,300986
2018-07-11,301459
2018-07-12,299865
2018-07-13,289830
2018-07-14,297501
2018-07-15,297443
2018-07-16,293097
2018-07-17,293866
2018-07-18,292902
2018-07-19,292368
2018-07-20,290766
2018-07-21,294669
2018-07-22,295811
2018-07-23,297514
2018-07-24,297392
2018-07-25,298957
2018-07-26,298101
2018-07-27,298740
2018-07-28,304086
2018-07-29,305269
2018-07-30,304827
2018-07-31,299689
2018-08-01,300526
2018-08-02,59321
2018-08-03,31731
2018-08-04,36838
2018-08-05,42043
2018-08-06,42366
2018-08-07,37209
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
lstm怎么预测长时间序列_时间序列预测代码
LSTM模型的一个常见用途是对长时间序列数据进行学习预测,例如得到了某商品前一年的日销量数据,我们可以用LSTM模型来预测未来一段时间内该商品的销量。但对于不熟悉神经网络或者对没有了解过RNN模型的人来说,想要看懂LSTM模型的原理是非常困难的,但有些时候我们不得不快速上手搭建一个LSTM模型来完成预测任务。下面我将对一个真实的时间序列数据集进行LSTM模型的搭建,不加入很多复杂的功能,快速的完成数据预测功能。
全栈程序员站长
2022/09/30
3.1K1
lstm怎么预测长时间序列_时间序列预测代码
如何使用带有Dropout的LSTM网络进行时间序列预测
长短期记忆模型(LSTM)是一类典型的递归神经网络,它能够学习观察所得的序列。
风飘叶扬
2018/02/05
21.2K1
用Python的长短期记忆神经网络进行时间序列预测
长短期记忆递归神经网络具有学习长的观察序列的潜力。
QiqiHe
2018/02/08
9.7K2
用Python的长短期记忆神经网络进行时间序列预测
基于长短期记忆神经网络LSTM的多步长时间序列预测
长短时记忆网络(LSTM)是一种能够学习和预测长序列的递归神经网络。LSTMs除了学习长序列外,还可以学习一次多步预测,这对于时间序列的预测非常有用。LSTMs的一个困难在于,它们可能难以配置,而且需要大量的准备工作才能获得适合学习的格式的数据。
代码医生工作室
2020/06/16
6.9K0
基于长短期记忆神经网络LSTM的多步长时间序列预测
在Keras中如何对超参数进行调优?
由于没有一个成熟的理论来解释神经网络,所以配置神经网络通常是困难的,经常被同学们调侃为“炼丹”。
花落花飞去
2018/02/05
17.2K2
在Keras中如何对超参数进行调优?
Keras中带LSTM的多变量时间序列预测
像长短期记忆(Long Short-Term Memory ) LSTM 递归神经网络这样的神经网络几乎可以完美地模拟多个输入变量的问题。
QiqiHe
2018/02/09
46.7K8
Keras中带LSTM的多变量时间序列预测
深入探讨Python中的时间序列分析与预测技术
时间序列分析是数据科学中的重要领域,它涵盖了从数据收集到模型构建和预测的整个过程。Python作为一种强大的编程语言,在时间序列分析和预测方面有着丰富的工具和库。本文将介绍Python中常用的时间序列分析与预测技术,并通过代码实例演示其应用。
一键难忘
2024/08/15
2240
时间序列基于监督学习的LSTM模型为什么可以预测股票走势(附完整代码)
疫情期间,在家学习Python,调通了基于监督学习的LSTM神经网络预测模型代码,在一般代码的基础上,做了单步和多步通用版的改进。调通的代码附后,供各位大咖指正。
用户7017302
2020/03/01
4K0
Keras中的多变量时间序列预测-LSTMs
神经网络诸如长短期记忆(LSTM)递归神经网络,几乎可以无缝地对多变量输入问题进行建模。
派大星的数据屋
2022/04/02
3.4K0
Keras中的多变量时间序列预测-LSTMs
时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」
我于2019年发布此篇文章至今收获了许多人的指点,当时的代码的确晦涩难懂,近期有空,将代码重新整理了一遍,重新发送至此。希望能够帮助大家更好地理解。
全栈程序员站长
2022/08/25
7.8K0
时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」
Python时间序列预测案例研究:巴尔的摩年度用水量
时间序列预测是一个过程,获得良好预测的唯一方法就是练习这个过程。
花落花飞去
2018/02/06
7.3K0
darts 时序预测入门
darts是一个强大而易用的Python时间序列建模工具包。在github上目前拥有超过7k颗stars。
lyhue1991
2024/06/14
3350
darts 时序预测入门
基于SARIMA、XGBoost和CNN-LSTM的时间序列预测对比
本文将讨论通过使用假设测试、特征工程、时间序列建模方法等从数据集中获得有形价值的技术。我还将解决不同时间序列模型的数据泄漏和数据准备等问题,并且对常见的三种时间序列预测进行对比测试。
deephub
2023/02/01
1.4K0
用python做时间序列预测九:ARIMA模型简介
c是常数项,εt是随机误差项。 对于一个AR(1)模型而言: 当 ϕ1=0 时,yt 相当于白噪声; 当 ϕ1=1 并且 c=0 时,yt 相当于随机游走模型; 当 ϕ1=1 并且 c≠0 时,yt 相当于带漂移的随机游走模型; 当 ϕ1<0 时,yt 倾向于在正负值之间上下浮动。
AI粉嫩特工队
2020/06/17
32.3K1
基于深度学习模型的空气污染时序预测
Blog: http://yishuihancheng.blog.csdn.net
郭好奇同学
2022/06/07
2.2K0
基于深度学习模型的空气污染时序预测
使用LSTM模型预测多特征变量的时间序列
使用LSTM模型预测多特征变量的时间序列,能够帮助我们在各种实际应用中进行更准确的预测。这些应用包括金融市场预测、气象预报、能源消耗预测等。
Python编程爱好者
2024/07/12
1.5K0
使用LSTM模型预测多特征变量的时间序列
时间序列预测(二)基于LSTM的销售额预测
O:小H,Prophet只根据时间趋势去预测,会不会不太准啊 小H:你这了解的还挺全面,确实,销售额虽然很大程度依赖于时间趋势,但也会和其他因素有关。如果忽略这些因素可能造成预测结果不够准确 小O:那有没有什么办法把这些因素也加进去呢? 小H:那尝试下LSTM吧~
HsuHeinrich
2023/05/25
1.4K0
时间序列预测(二)基于LSTM的销售额预测
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测|附代码数据
根据频率,时间序列可以是每年(例如:年度预算),每季度(例如:支出),每周(例如:销售数量),每天(例如天气),每小时(例如:股票价格),分钟(例如:来电提示中的呼入电话),甚至是几秒钟(例如:网络流量)。
拓端
2023/07/17
1K0
第14节:lstm原理及numpy
文章目录 lstm原理 rnn lstm实例 lstm原理 文本相关。主要应用于自然语言处理(NLP)、对话系统、情感分析、机器翻译等等领域,Google翻译用的就是一个7-8层的LSTM模型。 时序相关:就是时间序列的预测,诸如预测天气/温度/. 为何全连接层和卷积神经网络无法处理序列问题,因为缺乏记忆模块,无法记忆之前输入的内容. rnn - 简单的rnn。输入是2维的(timesteps, input_features). 这里的loop就是在timesteps上的loop:每一个时刻t,RNN
AI拉呱
2022/04/13
4340
第14节:lstm原理及numpy
Forecast at energy(Smart meters in London)
数据源: https://www.kaggle.com/jeanmidev/smart-meters-in-london
李玺
2021/11/22
5790
Forecast at energy(Smart meters in London)
推荐阅读
相关推荐
lstm怎么预测长时间序列_时间序列预测代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验