时间序列数据是指按照时间顺序排列的一系列数据点或观测值,通常用于描述某个变量随时间的变化情况。例如,股价、气温、人口数量等都可以被视为时间序列数据。时间序列数据的预处理是进行时间序列分析的重要步骤。常见的时间序列预处理步骤包括:
- 构建时间序列数据:在处理时间序列数据之前,需要将原始数据按照时间顺序排序,并构建时间序列数据。
- 查找缺失值:在时间序列数据中,可能存在缺失值,需要对其进行查找。常用的缺失值处理方法有插值法、删除等。
- 查找数据集中存在的异常值:在时间序列数据中,可能存在异常值需要被识别和处理。常用的异常值检测方法有基于统计学的方法和基于机器学习的方法。
构建时间序列数据
原始数据中的时间列,可能存在时间顺序紊乱如下图这样,先将时间数据数据转成datetime格式,再进行升值排序;
import pandas as pd
#将时间列的数据转换成pandas时间格式
datac['time'] = pd.to_datetime(data['time'], format='%Y-%m-%d')
# 对时间列数据进行排序
data= data.sort_values(by='time')
时间列的时间数据是缺失的,比如2022-05-01--2022-05-31时间段的数据,一共31条时间数据,而原始数据中只要28条数据,因此需要对时间数据进行补充;
import pandas as np
datanew = pd.DataFrame()
datanew['time'] = pd.date_range('2022-05-01','2022-05-31')
#tt 为时间序列特征值/目标值
datanew['tt]']=np.nan
data = data.append(datawnew)
data = data.drop_duplicates(subset =['time']).sort_values(by['time']).reset_index(drop=True)
查找缺失值
1、在缺失值比例较大的情况下,可能影响分析的精度和可靠性时,可选择删除;
2、在缺失值较少的情况下,可以通过手动填充、插值等方法近处理;
常见的时间序列缺失值填充方法:
- 前向填充法:用前一时刻的观测值来填充缺失值;
- 后向填充法:用后一时刻的观测值来填充缺失值;
- 线性插值法:使用前后两个缺失值之间的线性函数对缺失值进行插值;
- XGBoost等机器学习模型预测法:使用机器学习模型预测缺失值
前向填充法
代码中,
ffill()
方法表示使用向前填充法对缺失值进行填充。将缺失值替换为该值之前的最近一个非缺失值。
import pandas as pd
# 创建示例时间序列数据,其中第2个和第4个时间点为缺失值
ts = pd.Series([1, None, 3, None, 5], index=pd.date_range('2023-04-01', periods=5, freq='D'))
# 使用向前填充方法填充缺失值
ts_ffill = ts.ffill()
print("原始数据:\n", ts)
print("\n向前填充后的数据:\n", ts_ffill)
** 后向填充法**
上代码中,
bfill()
方法表示使用向后填充法对缺失值进行填充。将缺失值替换为该值之后的最近一个非缺失值。
import pandas as pd
# 创建示例时间序列数据,其中第2个和第4个时间点为缺失值
ts = pd.Series([1, None, 3, None, 5], index=pd.date_range('2023-04-01', periods=5, freq='D'))
# 使用向后填充方法填充缺失值
ts_bfill = ts.bfill()
print("原始数据:\n", ts)
print("\n向后填充后的数据:\n", ts_bfill)
线性插值法
代码中,
interpolate()
方法表示使用线性插值法对缺失值进行填充。线性插值方法是根据已知的数据点进行线性外推或者内插,以得到缺失点的估计值。默认情况下,该方法使用线性插值进行缺失值填充。
import pandas as pd
# 创建示例时间序列数据,其中第2个和第4个时间点为缺失值
ts = pd.Series([1, None, 3, None, 5], index=pd.date_range('2023-04-01', periods=5, freq='D'))
# 使用线性插值方法填充缺失值
ts_interpolated = ts.interpolate()
print("原始数据:\n", ts)
print("\n线性插值填充后的数据:\n", ts_interpolated)
** XGBoost填充缺失值**
首先将时间序列划分为特征(X)和目标值(y)。然后我们使用70%的数据训练XGBoost回归器,并用它来预测缺失值。最后,我们返回填充后的时间序列。
# 导入必要的库
import xgboost as xgb
import numpy as np
# 构建XGBoost模型
def run_xgb(timeseries):
# 构建特征和目标值
X = []
y = []
for i in range(len(timeseries)-1):
if timeseries[i] != None and timeseries[i+1] != None:
X.append([timeseries[i]])
y.append(timeseries[i+1])
X = np.array(X)
y = np.array(y)
# 分割训练集和测试集
split = int(len(X)*0.7)
X_train, y_train = X[:split], y[:split]
X_test, y_test = X[split:], y[split:]
# 训练模型
model = xgb.XGBRegressor()
model.fit(X_train, y_train)
# 预测并填充缺失值
for i in range(len(timeseries)):
if timeseries[i] == None:
timeseries[i] = model.predict(np.array([[timeseries[i-1]]]))
return timeseries
异常值处理
在时间序列分析中,异常值是指在数据集中出现的极端异常的观测值。这些异常值可能会对模型的预测和准确性产生负面影响,因此需要处理。
一般来说,处理时间序列异常值的方法有以下几种:
- 阈值的方法:该方法是将异常值定义为与正常值相比显著偏离的数据点。可以使用统计学方法来确定阈值,例如,Zscore阀值。
- 移动窗口的方法:该方法是计算数据点在固定时间窗口内的平均值和标准差,并识别偏离平均值很多个标准差的点。
- 时间序列异常检测 ADTK:adtk(Anomaly Detection Toolkit)是无监督异常检测的python工具包,它提供常用算法和处理函数;
阀值去除异常值
z-score : z标准分数,它测量数据值到平均值的距离,当数据与平均值相差2个标准差时z-score为2,如果将z-score为3作为异常值判断标准时,便相当于3sigma。(3sigma内包含99.7%的数据)
mean = data[feature].mean()
std = data1[feature].std()
data['z'] = (data[feature]-mean)/std
# 异常数据
dfk = data[data['z']>3.0]
时间序列异常检测 ADTK
详细参考Python 时间序列异常检测 ADTK
以上是时间序列数据预处理过程;
版权归原作者 数虫 所有, 如有侵权,请联系我们删除。