【数据分析】时间序列

UTC时间:时间戳是以格林威治时间1970年01月01日00时00分00秒为基准计算所经过时间的秒数,是一个浮点数。Python的内置模块time和datetime都可以对时间格式数据进行转换,如时间戳和时间字符串的相互转换。

报错记录:AR has been removed from statsmodels and replaced with statsmodels.tsa.ar_model.AutoReg.

statsmodels版本太新了。根据提示将sm.tsa.AutoReg换成statsmodels.tsa.ar_model.AutoReg()还是没用,提示module 'statsmodels.tsa.api' has no attribute 'ar_model'。

解决方案:改成sm.tsa.AutoReg. 或者事先from statsmodels.tsa.ar_model import AutoReg

一些小使用

获取当前日期

python 复制代码
# datetime模块date类的today()方法获取当前日期
import datetime
print(datetime.date.min)
print(datetime.date.max)
print(datetime.date.today())
print(datetime.date.today().year)
print(datetime.date.today().month)
print(datetime.date.today().day)

python 复制代码
# datetime模块datetime类的today()方法获取当前日期和时间
import datetime
print(datetime.datetime.now())
print(datetime.datetime.min)
print(datetime.datetime.max)
print(datetime.datetime.today())
print(datetime.datetime.today().year)
print(datetime.datetime.today().month)
print(datetime.datetime.today().day)
print(datetime.datetime.today().hour)
print(datetime.datetime.today().hour)

UTC时间

python 复制代码
import datetime
# 创建一个时间戳(以秒为单位)
timestamp = 22  
# 带UTC时区时间
dt_with_timezone = datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc)
print("带UTC时区时间:", dt_with_timezone)
# 不带UTC时区时间
dt_without_timezone = datetime.datetime.fromtimestamp(timestamp)
print("不带UTC时区时间", dt_without_timezone)

python 复制代码
# 时间戳
import time 
print(time.time())
print(time.localtime())  # 获取到当前时间的元组
print(time.mktime(time.localtime()))  
# 一周的第几天(周一是0,0-6)、一年的第几天(从1开始,1-366)、夏时令(是夏时令1,不是0,未知-1)。

字符串和时间转换

python 复制代码
# 字符串和时间转换
#利用time模块的strftime()函数可以将时间戳转换成系统时间。
import time
time_str = time.strftime(("%Y-%m-%d %H:%M:%S"),time.localtime())
print(time_str)

# 可以用strptime函数将日期字符串转换为datetime数据类型,
import datetime 
print(datetime.datetime.strptime('2022-01-15','%Y-%m-%d'))

# 可以用Pandas的to_datetime()函数将日期字符串转换为datetime数据类型。
# to_datetime()函数转化后的时间是精准到时分秒精度的
import pandas as pd
print(pd.to_datetime('2022/01/15'))

时间差

python 复制代码
# 3. 时间运算--时间差
# 利用datetime将时间类型数据进行转换,然后利用减法运算计算时间的不同之处
# 默认输出结果转换为用("天","秒")表达
import datetime
delta = datetime.datetime(2022,1,16)-datetime.datetime(2021,1,1,9,15)
print(delta)
print(delta.days)
print(delta.seconds)

自回归模型AR(Autoregressive model/AR)

定义

这里只介绍一下AR的定义,具体步骤见参考里的文章

通俗一点讲,就是用过去时间点的数据预测未来时间点的数据。

具体公式如下:
X t = a 1 X t − 1 + a 2 X t − 2 + . . . + a p X t − p = ∑ j = 1 p a j X t − j + ε t X_t = a_1X_{t-1} + a_2X_{t-2} +...+a_pX_{t-p} =\sum^{p}{j=1}a_jX{t-j}+\varepsilon_t Xt=a1Xt−1+a2Xt−2+...+apXt−p=j=1∑pajXt−j+εt
X t X_t Xt=历史数据 X t − j X_{t-j} Xt−j的加权和+随机扰动 ε t \varepsilon_t εt的叠加;

称 p p p为自回归模型的阶数,因此成为 p p p阶自回归模型,记为 A R ( p ) AR(p) AR(p);

称 a 1 , a 2 . . . a p a_1,a_2...a_p a1,a2...ap为 A R ( p ) AR(p) AR(p)模型的自回归系数
ε t ∼ N ( 0 , 2 ) \varepsilon_t \sim N(0,^2 ) εt∼N(0,2)

python实现

python 复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm  # 导入模型

IndexData = pd.read_csv('./data/timeseries_data.csv')
data = IndexData['close']  # 选择关闭交易时的数据
temp = np.array(data)  # 转换成数组
model =sm.tsa.AutoReg(temp,lags = 1)  # 训练模型 
results_AR = model.fit() # 训练模型

plt.figure(figsize=(20,10)) 
plt.plot(temp,'b',label='Close')
plt.plot (results_AR.fittedvalues,'r',label='AR model')  # results_AR.fittedvalues是模型拟合后的结果
plt.legend()

滑动平均模型(moving average model/MA)

滑动平均(moving average model/MA)模型也称移动平均模型,是用过去各个时期的随机干扰预测误差 的线性组合来表达当前预测值。
q q q阶MA模型(MA( q q q))的公式:
X t = μ + a t − θ 1 a t − 1 − . . . − θ q a t − q = μ + a t − ∑ i = 1 p θ i a t − i X_t = \mu+a_t-\theta_1a_{t-1}-...-\theta_qa_{t-q} = \mu + a_t -\sum^{p}{i=1}\theta{i}a_{t-i} Xt=μ+at−θ1at−1−...−θqat−q=μ+at−i=1∑pθiat−i

其中 μ \mu μ为常量。

MA(1)举例: X t X_t Xt为第 t t t天股价,而 a t a_t at为第 t t t天的新闻影响。当天的股价受当天新闻影响,也受昨天新闻影响 a t − 1 a_{t-1} at−1(但影响力要弱些,所以要乘上系数)。

python实现

报错记录:AttributeError: module 'statsmodels.tsa.api' has no attribute 'ARMA'

从版本 0.12 开始,statsmodels 库不再具有单独的 ARMA 类。应该使用 ARIMA 类,该类可以处理自回归 (AR) 和移动平均 (MA) 分量。

python 复制代码
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm

IndexData = pd.read_csv('./data/timeseries_data.csv')
data = IndexData['close']
temp = np.array(data)

model = sm.tsa.ARIMA(temp, order=(0, 0,10))
results_MA = model.fit()

plt.figure(figsize=(20, 10))
plt.plot(temp, 'b', label='close')
plt.plot(results_MA.fittedvalues,color = 'red',label ='MA')
plt.legend(fontsize = 15)
plt.show()

自回归滑动平均(Autoregressive moving average model/ARMA)模型

定义

ARMA模型就是AR模型和MA模型混合,具体公式如下:
X t = [ ∑ i = 1 p a i X t − i ] + [ μ + a t − ∑ i = 1 q θ i a t − i ] X_t = [ \sum^{p}{i=1}a{i}X_{t-i} ]+ [ \mu +a_t -\sum^{q}{i=1}\theta{i}a_{t-i}] Xt=[i=1∑paiXt−i]+[μ+at−i=1∑qθiat−i]

由此可见,ARMA( p p p,0)模型就是AR ( p p p) 模型,ARMA(0, q q q)模型就是MA( q q q)模型。 μ \mu μ?

python实现

python 复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
IndexData= pd.read_csv('./data/timeseries_data.csv')
data =IndexData['close']
temp =np.array(data)
p = 3
q = 10
model = sm.tsa.ARIMA (temp,order=(p,0,q))
results_ARMA = model.fit()

plt.figure(figsize=(20,4*5))
plt.plot(temp,'b',label='close')
plt.plot(results_ARMA.fittedvalues,'r',label='ARMA model')
plt.legend()

自回归差分滑动平均(Autoregressive Integrated Moving Average model/ARIMA)模型

ARIMA模型在ARMA模型基础上考虑了时间序列的差分 ,ARIMA模型有三个参数ARIMA(p,d,q) ,p为自回归AR项数,q为滑动平均MA项数,d为使序列平稳所做的差分次数(阶数)。

差分后是对序列的差分的结果建立模型而不是真正的序列:例如**ARIMA(p,1,q)**相当于对差分序列 { x t -- x t − 1 } \{x_t--x_{t−1}\} {xt--xt−1}进行 ARMA(p,q) 回归。

python 复制代码
# 输出ARIMA模型的拟合效果图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
IndexData = pd.read_csv('./data/timeseries_data.csv')
IndexData = IndexData.set_index(IndexData['date'])

IndexData['colseDiff_1']=IndexData['close'].diff(1)#1阶差分处理
IndexData['closeDiff_2']=IndexData['colseDiff_1'].diff(1)#2阶差分处理
IndexData.plot(subplots=True,figsize=(20,15))

data = IndexData['closeDiff_2']
temp = np.array (data)
p=2;d = 2;q=10
model = sm.tsa.ARIMA(temp,order = (p,d,q))
results_ARIMA = model.fit()
plt.figure (figsize=(20,10))
plt.plot (temp,'b',label='closeDiff_2')
plt.plot (results_ARIMA.fittedvalues,'r',label='ARIMA model')
plt.legend()


参考

时间序列分析---自回归(AR) - 蜡笔小xi的文章 - 知乎
时间序列(二):初识自回归模型AR、滑动平均模型MR - Big冯的文章 - 知乎
建模算法系列二十三:ARMA模型 - Lvy-呀的文章 - 知乎

相关推荐
几两春秋梦_4 小时前
符号回归概念
人工智能·数据挖掘·回归
艾派森6 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
武子康11 小时前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
Q81375746011 小时前
数据挖掘在金融交易中的应用:民锋科技的智能化布局
人工智能·科技·数据挖掘
布说在见11 小时前
魅力标签云,奇幻词云图 —— 数据可视化新境界
信息可视化·数据挖掘·数据分析
Tianyanxiao12 小时前
如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选
大数据·人工智能·科技·数据分析·深度优先·零售
FIT2CLOUD飞致云13 小时前
仪表板展示|DataEase看中国:历年双十一电商销售数据分析
数据分析·开源·数据可视化·dataease·双十一
皓74113 小时前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
菜鸟的人工智能之路14 小时前
桑基图在医学数据分析中的更复杂应用示例
python·数据分析·健康医疗
阡之尘埃21 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控