时间序列预测 — 时间序列数据预处理

 专栏链接:https://blog.csdn.net/qq_41921826/category_12495091.html

专栏内容

 所有文章提供源代码、数据集、效果可视化

 文章多次上领域内容榜、每日必看榜单、全站综合热榜

时间序列预测存在的问题

 现有的大量方法没有真正的预测未来值,只是用历史数据做验证

 利用时间序列分解算法存在信息泄露的问题:有人用emd+lstm对时间序列进行预测,是否存在原理上的问题? - 知乎


目录

1 缺失值处理

1.1 统计缺失值

1.2 删除缺失值

1.3 指定值填充

1.4 均值/中位数/众数填充

1.5 前后项填充

2 异常值处理

2.1 3σ原则分析

2.2 箱型图分析

3 重复值处理

3.1 重复值计数

3.2 drop_duplicates重复值处理

3 数据归一化/标准化 

3.1 0-1标准化

3.2 Z-score标准化


1 缺失值处理

数据缺失主要包括记录缺失和字段信息缺失等情况,其对数据分析会有较大影响,导致结果不确定性更加显著,缺失值的处理:

  • 删除记录
  • 数据插补
  • 不处理

首先导入相应的库文件,处理缺失值的库主要是pandas。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

首先参加示例数据用于分析:

# 创建数据
df = pd.DataFrame({'time':['2023-12-11 00:00','2023-12-11 01:00','2023-12-11 02:00','2023-12-11 03:00','2023-12-11 04:00','2023-12-11 05:00','2023-12-11 06:00','2023-12-11 07:00','2023-12-11 08:00','2023-12-11 09:00','2023-12-11 010:00'],
                  'feature1':[12,33,45,23,np.nan,np.nan,66,54,np.nan,99,190],
                  'feature2':[np.nan,3.3,4.5,np.nan,5.2,np.nan,6.6,5.4,np.nan,9.9,1.0]})

1.1 统计缺失值

(1) df.info()和df.describe()函数

可以通过df.info()函数大概查看缺失值情况,df.info()可以查看列的数据类型,数据数量信息,df.describe()函数用于查看数据的统计信息。

  • info:info方法返回DataFrame中的行数,列数,DataFrame中每一列的名称以及该列的非空值的数目以及每一列的数据类型。
  • describe:describe方法返回有关DataFrame中数字数据的一些有用统计信息,例如均值,标准偏差,最大值和最小值以及一些百分位数
df.info()

(2) isnull,notnull判断是否是缺失值

  • isnull:缺失值为True,非缺失值为False
  • notnull:缺失值为False,非缺失值为True
# 直接判断是否是缺失值
df.notnull() 
# 输出没有缺失值的行
df[df['feature2'].notnull()]
# 查看每列是否有缺失值
df.isnull().any()
# 统计每列缺失值的数量
df.isnull().sum(axis=0)
# 统计每行缺失值的数量
df.isnull().sum(axis=1)
# 查看DataFrame所有缺失值的数量
df.isnull().sum().sum()
# 统计某一列的缺失值
df["column_name"].isnull().sum(axis=0)
 

1.2 删除缺失值

当数据存在缺失值,可以通过不同的方式删除缺失值

# 删除某行缺失值
df.dropna()#只要某个数据行中有缺失值,则此操作就会将该行删除
# 指定列删除行缺失值
df.dropna(subset=['column_1', 'column_2'])#如果column_1和column_2两列数据中存在缺失值,则将缺失值所在的行删除,而不需要考虑其他列是否为缺失值
# 删除全为缺失值的那些行
df.dropna(how="all")
# 删除全为缺失值的那些列
df.dropna(axis=1,how="all")
# 删除有缺失值的列
df.dropna(axis=1)
# 删除指定列中有缺失值的行
df.dropna(axis=0,subset=["Name","Age"])#将会删除"Name"和“Age"中有缺失值的行

1.3 指定值填充

缺失值插补有多种方法,可以通过df.fillna()函数实现:

  • 均值/中位数/众数插补
  • 临近值插补
  • 插值法
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None,
**kwargs)
  • value 参数表示要填充的值
  • method 参数表示填充的方法
  • axis 参数表示要填充的轴(0 表示行,1 表示列)
  • inplace 参数表示是否在原数据框上进行修改
  • limit 参数表示最多填充多少个空值
  • downcast 参数表示在填充完成后对数据进行类型转换。

指定值填充可以通过df.fillna和df.replace实现

# value:填充值
# inplace:参数
df1 = df.copy()
df1.fillna(0,inplace = True)
# df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
# to_replace → 被替换的值
# value → 替换值
df2 = df.copy()
df2['feature1'].replace(np.nan,'0',inplace = True)

1.4 均值/中位数/众数填充

均值/中位数/众数可以通过 mean()、median()、mode()实现

df4 = df.copy()
# 均值
df4['feature1'].fillna(df4['feature1'].mean(),inplace = True)
# 中位数
df4['feature1'].fillna(df4['feature1'].median(),inplace = True)
# 中位数
df4['feature1'].fillna(df4['feature1'].mode(),inplace = True)

1.5 前后项填充

前后项填充用前面和后面的值进行填充,一般两个一起用,避免最前面和最后面一行的值填充不到。

# 临近值插补
# method参数:
# pad / ffill → 用之前的数据填充 
# backfill / bfill → 用之后的数据填充 
df4 = df.copy()
df4['feature2'].fillna(method = 'pad',inplace = True)
df4

2 异常值处理

异常值是指样本中的个别值,其数值明显偏离其余的观测值,异常值也称离群点,异常值的分析也称为离群点的分析

  • 异常值分析 → 3σ原则 / 箱型图分析
  • 异常值处理方法 → 删除 / 修正填补

首先创建一组数据用于分析:

data = pd.Series(np.random.randn(10000)*100)

2.1 3σ原则分析

首先计算均值和标准差,然后绘制密度曲线,发现数据服从正态分布。

# 正态性检验
mean = data.mean()  # 计算均值
std = data.std()  # 计算标准差
print('均值为:%.3f,标准差为:%.3f' % (mean, std))
stats.kstest(data, 'norm', (mean, std))

# 绘制数据密度曲线和异常值分析图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
# 绘制数据密度曲线
data.plot(kind='kde', grid=True, style='-k', title='密度曲线', ax=ax1)

然后根据计算的均值和标准差通过3σ原则可视化异常值。

# 异常值分析
error = data[np.abs(data - mean) > 3 * std]
data_c = data[np.abs(data - mean) <= 3 * std]
print('异常值共%i条' % len(error))

# 筛选出异常值error、剔除异常值之后的数据data_c
ax2.scatter(data_c.index, data_c, color='b', marker='.', alpha=0.3, label='正常值')
ax2.scatter(error.index, error, color='r', marker='.', alpha=0.5, label='异常值')
ax2.set_xlim([-10, 10010])
ax2.grid()
ax2.legend()
plt.show()

2.2 箱型图分析

与上面3σ原则分析类似,知识检测的标准笔筒,箱型图分析采用四分位数进行统计。首先计算基本的统计量,然后绘值箱型图。

# 创建数据
data = pd.Series(np.random.randn(10000) * 100)
# 箱型图分析异常值
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))

# 计算基本统计量
s = data.describe()
q1 = s['25%']
q3 = s['75%']
iqr = q3 - q1
mi = q1 - 1.5 * iqr
ma = q3 + 1.5 * iqr
print(s)
print('分位差为:%.3f,下限为:%.3f,上限为:%.3f' % (iqr, mi, ma))

# 绘制箱型图
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
data.plot.box(vert=False, grid=True, color=color, ax=ax1, label='样本数据')

然后根据计算的统计量通过四分位数可视化异常值。

# 筛选出异常值error、剔除异常值之后的数据data_c
error = data[(data < mi) | (data > ma)]
data_c = data[(data >= mi) & (data <= ma)]
print('异常值共%i条' % len(error))

# 绘制异常值分析图
ax2.scatter(data_c.index, data_c, color='b', marker='.', alpha=0.3, label='正常值')
ax2.scatter(error.index, error, color='r', marker='.', alpha=0.5, label='异常值')
ax2.set_xlim([-10, 10010])
ax2.grid()
ax2.legend()

plt.show()

3 重复值处理

3.1 重复值计数

同样创建一组数据用于分析,数据的1和2行是重复数据:

# 创建数据
df = pd.DataFrame({'time':['2023-12-11 00:00','2023-12-11 00:00','2023-12-11 01:00','2023-12-11 02:00','2023-12-11 03:00','2023-12-11 04:00','2023-12-11 05:00','2023-12-11 06:00','2023-12-11 07:00','2023-12-11 08:00','2023-12-11 09:00','2023-12-11 010:00'],
                  'feature1':[12,12,33,45,23,np.nan,np.nan,66,54,np.nan,99,190],
                  'feature2':[5.8,5.8,3.3,4.5,np.nan,5.2,np.nan,6.6,5.4,np.nan,9.9,1.0]})

 可以通过下面的的语句查看重复值,可以看到有1个重复项:

df.duplicated().value_counts()

3.2 drop_duplicates重复值处理

用df.drop_duplicates的方法对某几列下面的重复行删除。

df.drop_duplicates(subset=None, keep='first', inplace=False)
  • subset:是用来指定特定的列,默认为所有列
  • keep:

        当keep='first'时,就是保留第一次出现的重复行,其余删除
        当keep='last'时,就是保留最后一次出现的重复行,其余删除
        当keep=False时,就是删除所有重复行

  • inplace是指是否直接在原数据上进行修改,默认为否
df.drop_duplicates(keep='first',inplace=True)

3 数据归一化/标准化 

数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上

  • 0-1标准化
  •  Z-score标准化

3.1 0-1标准化

将数据的最大最小值记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理,计算公式

  • x = (x - Min) / (Max - Min)

同样创建一组数据用于分析:

# 创建数据
df = pd.DataFrame({"feature1": np.random.rand(10) * 20, 'feature2': np.random.rand(10) * 100})

 使用公式进行标准化:

# 封装功能函数,实现标准化数据
def data_norm(df, *cols):
    df_n = df.copy()
    for col in cols:
        max_val = df_n[col].max()
        min_val = df_n[col].min()
        df_n[col] = (df_n[col] - max_val) / (max_val - min_val)
    return df_n
# 使用功能函数实现标准化数据
df_n = data_norm(df, 'feature1', 'feature2')

使用库函数实现0-1标准化:

from sklearn.preprocessing import MinMaxScaler

# 初始化MinMaxScaler对象
scaler = MinMaxScaler()
# 进行特征标准化处理
X_scaled = scaler.fit_transform(df['feature1'].values.reshape(-1, 1))

3.2 Z-score标准化

Z分数(z-score),是一个分数与平均数的差再除以标准差的过程 → z=(x-μ)/σ,其中x为某一具体分数,μ为平均数,σ为标准差,Z值的量代表着原始分数和母体平均值之间的距离,是以标准差为单位计算。在原始分数低于平均值时Z则为负数,反之则为正数。

同样创建一组数据用于分析:

df = pd.DataFrame({"feature1":np.random.rand(10) * 100,
                  'feature2':np.random.rand(10) * 100})

 使用公式进行标准化,归一化后可以检测数据的均值和标准差:

# 封装功能函数,实现Z-score标准化
def data_Znorm(df, *cols):
    df_n = df.copy()
    for col in cols:
        u = df_n[col].mean()
        std = df_n[col].std()
        df_n[col] = (df_n[col] - u) / std
    return df_n

# 使用功能函数实现Z-score标准化并替换原始数据
df = data_Znorm(df, 'feature1', 'feature2')

使用库函数实现z-score标准化:

from sklearn.preprocessing import StandardScaler

# 初始化StandardScaler对象
scaler = StandardScaler()
# 将特征进行标准化处理
X_scaled = scaler.fit_transform(df['feature1'].values.reshape(-1, 1))

  • 21
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在LSTM时间序列预测中,数据预处理是非常重要的一步。一般来说,数据预处理包括归一化和数据集装入两个步骤。 首先,我们可以使用sklearn中的preprocessing模块中的归一化函数对数据进行归一化处理。具体而言,可以使用MinMaxScaler()函数,该函数能够将数据缩放到指定的范围内。在进行归一化处理之前,需要先将数据从pandas的DataFrame格式转换为numpy的数组格式。然后,通过fit_transform()函数将数据和标签进行归一化处理,同时返回归一化后的数据、标签以及归一化的标签值。 其次,我们需要将预处理好的数据集装入torch支持的可迭代对象torch.utils.data.DataLoader中。这一步可以通过封装好的函数来实现。该函数接受训练集、测试集、迭代次数、批次大小等参数,并返回train_loader和test_loader两个数据加载器。数据加载器可以使数据集可迭代,方便后续进行模型的搭建。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码)](https://blog.csdn.net/hardworking_T/article/details/126673957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几度春风里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值