在机器学习和深度学习的世界当中,存在众多经典且有效的(时间)序列模型。这些模型通常通过三种方式来建立样本与样本之间的关联:
ARIMA家族算法群:过去影响未来,因此未来的值由过去的值加权求和而成,以此构建样本与样本之间的关联。
循环网络家族:遍历时间点/样本点,将过去的时间上的信息传递存储在中间变量中,传递给下一个时间点,以此构建样本和样本之间的关联。
卷积网络家族:使用卷积核扫描时间点/样本点,将上下文信息通过卷积计算整合到一起,以此构建样本和样本之间的关联。
时间序列相关参考文章
时间序列预测算法—ARIMA
时间序列预测算法—Prophet
时间序列预测算法—LSTM
长时间序列预测算法—Informer
时间序列分类任务—tsfresh
有季节效应的非平稳序列分析
python时间序列处理
时间序列异常值检测方法
时间序列异常值处理方法

一、时间类型

主要有以下几种:
(1)时间戳:表示特定时刻的数值
(2)时期:表示某个特定的时间段,通常包括开始和结束时间。
(3)时间间隔:表示两个时间点之间的持续时间,通常以天、小时、分钟等单位表示。

1.1、时间戳

t1=pd.Timestamp('2024-01-04')
t2=pd.Timestamp('2024-01-04 08')
t3=pd.Timestamp('2024-01-04 8:20')
print(t1,t2,t3)

在这里插入图片描述

1.2、时期

p1=pd.Period('2024-01-04')
p2=pd.Period('2024-01')
print(p1,p2)

在这里插入图片描述

tm=pd.period_range('2024-01-04 08:08',freq='1D1H',periods=10)
tm

在这里插入图片描述
指定索引

rng=pd.date_range('2024-01-02',periods=10,freq='D')
pd.Series(range(len(rng)),index=rng)

在这里插入图片描述

periods=pd.period_range('2024-01',freq='M',periods=3)
ts=pd.Series(np.random.randn(len(periods)),index=periods)
ts

在这里插入图片描述
time offsets

pt=pd.Period('2024-01-04 08:08')+pd.Timedelta('1 days')
tt=pd.Timestamp('2024-01-04 8:20')+pd.Timedelta('1 days')
print(pt,tt)

在这里插入图片描述
时间戳与时期转换

ts=pd.Series(range(10),pd.date_range('2024-01-04 08:08',periods=10,freq='H'))
ts_period=ts.to_period()
ts_period

在这里插入图片描述

1.3、字符串与datetime的相互转换

1.3.1、字符串转datetime

利用str或者strftime方法,datetime对象和pandas的时间戳对象可以被格式化为字符串。

from datetime import datetime
dt_str=datetime(2024,1,2)
str(dt_str)

在这里插入图片描述

dt_str.strftime("%Y-%m-%d")

在这里插入图片描述

1.3.2、datetime转字符串

利用strptime的方法

str_dt='2024-01-02'
datetime.strptime(str_dt,"%Y-%m-%d")

str_dt=['2024-01-02','2024-01-03','2024-01-04']
[datetime.strptime(x,"%Y-%m-%d") for x in str_dt]

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

1.3.3、parse方法

datetime.strptime是通过已知格式进行日期解析的最佳方式。但是每次都要编写格式定义,尤其是对于一些常见的日期格式,这种情况下,可以使用dateutil这个第三方包中的parser.parse方法。

from dateutil.parser import parse
parse('2022-01-02')

在这里插入图片描述

parse('Jan 30 2011 10:23 2:00 PM')

在这里插入图片描述
注意:parse可以解析很多日期表示形式,但是有时它会把一些原本不是日期的字符串认作是日期。

1.3.4、to_datetime方法

pandas最基本的时间序列类型就是以时间戳为索引的Series。
pandas通常是用于处理成组日期的,不管这些日期是DataFrame的轴索引还是列。to_datetime方法可以解析多种不同的日期表示形式。

import pandas as pd
str_dt=['2024-01-02','2024-01-03','2024-01-04']
pd.to_datetime(str_dt)

在这里插入图片描述

二、date_range

可以指定开始时间与周期。H:小时 .D:天 .M:月

df=pd.date_range('2024/1/4',periods=10,freq='H') #freq=D,M,H,3D
df
df=pd.date_range('2023/1/4','2024/1/4',freq='M') #freq=D,M,H,3D
df

freq常见参数
在这里插入图片描述
锚定偏移
在这里插入图片描述
具体可参考 https://blog.51cto.com/u_16099261/7139400

import datetime as dt  # 导入 datetime 模块并命名为 dt
time=pd.Series(np.random.randn(10),index=pd.date_range(dt.datetime(2024,1,4),periods=10))
time

在这里插入图片描述

三、Truncate 过滤

time.truncate(before='2024-1-10')

在这里插入图片描述

time.truncate(after='2024-1-10')

在这里插入图片描述

四、时间数据重采样(resample)

时间数据由一个频率转换到另一个频率,主要分为:降采样升采样
降采样:

rng=pd.date_range('2024/1/1',periods=90,freq='D')
ts=pd.Series(np.random.randn(len(rng)),index=rng)
ts.resample('M').sum()  #M可以修改D或者3D等参数;sum()也可以修改mean()

在这里插入图片描述
升采样:插值方法
ffill:空值取前面的值
bfill:空值取后面的值
interpolate:线性取值

day3ts=ts.resample('3D').sum()
day3ts.resample('D').asfreq() #asfreq()将一个时间序列从一个频率转换为另一个频率

在这里插入图片描述

day3ts.resample('D').ffill(1)

在这里插入图片描述

day3ts.resample('D').interpolate('linear')

在这里插入图片描述

五、时间滑动窗口(rolling)

import numpy as np
import pandas as pd
df=pd.Series(np.random.randn(100),index=pd.date_range('2024-01-01',freq='D',periods=100))
rt=df.rolling(window=5)
rt.mean()

在这里插入图片描述

import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(15,6))
df.plot(style='r--')
df.rolling(window=5).mean().plot(style='b')

在这里插入图片描述

六、数据预处理

6.1、处理缺失值

import pandas as pd
 
df = pd.DataFrame({"value": [1, None, 2, 3, None, 4]})
 
# 使用线性插值填充缺失值
df = df.interpolate(method='linear')

在这里插入图片描述

6.2、季节调整

  时间序列数据中可能包含季节性变化,这会掩盖数据的真实趋势。季节性调整是一种方法,可以去除数据中的季节性效应,使得趋势更加明显。

import statsmodels.api as sm
df = pd.DataFrame({"value": [11,5,8,14,5,9,7,18,13,20,11,18]})
# 进行季节性分解
res = sm.tsa.seasonal_decompose(df.value, model='additive', period=3) #加法模型,还有乘法模型
# 季节性调整
df_deseasonalized = df.value - res.seasonal
df_deseasonalized

在这里插入图片描述

6.3、去噪

  时间序列数据可能包含噪声,这可能会影响预测的准确性。去噪方法可能包括平滑技术(如:移动平均法)或者更复杂的方法(如:滤波器)

df = pd.DataFrame({"value": [11,5,8,14,5,9,7,18,13,20,11,18]})
# 使用移动平均方法去噪
df_smooth = df.value.rolling(window=3).mean()
df_smooth

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐