如何在 Python 中对时间序列数据进行重采样

pythonserver side programmingprogramming更新于 2024/1/21 19:35:00

时间序列数据是定期收集的一系列观察结果。这些数据可以是任何领域,例如金融、经济、健康和环境科学。我们收集的时间序列数据有时可能具有不同的频率或分辨率,这可能不适合我们的分析和数据建模过程。在这种情况下,我们可以通过上采样或下采样来更改时间序列的频率或分辨率,从而对我们的时间序列数据进行重采样。本文将介绍对时间序列数据进行上采样或下采样的不同方法。

上采样

上采样意味着增加时间序列数据的频率。这通常在我们需要更高的分辨率或更频繁的观察时进行。 Python 提供了几种对时间序列数据进行上采样的方法,包括线性插值、最近邻插值和多项式插值。

语法

DataFrame.resample(rule, *args, **kwargs)
DataFrame.asfreq(freq, method=None)
DataFrame.interpolate(method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None)

这里,

  • resample 函数是 pandas 库提供的一种方法,用于对时间序列数据进行重新采样。它应用于 DataFrame 并采用规则参数,该参数指定重新采样所需的频率。可以提供附加参数 (*args) 和关键字参数 (**kwargs) 来自定义重采样行为,例如指定聚合方法或处理缺失值。

  • asfreq 方法与 resample 函数结合使用,以转换时间序列数据的频率。它采用 freq 参数,该参数指定输出所需的频率字符串。可选的 method 参数允许指定如何处理重采样过程中引入的任何缺失值,例如正向填充、反向填充或插值。

  • interpolate 方法用于填充时间序列数据中的缺失值或间隙。它根据指定的方法(例如"线性"、"最近"、"样条")执行插值,以估计现有观测值之间的值。附加参数允许控制执行插值的轴、要填充的连续 NaN 值的限制,以及是否就地修改 DataFrame 或返回新的 DataFrame。

线性插值

线性插值用于对时间序列数据进行上采样。它通过在数据点之间绘制直线来填充数据点之间的间隙。pandas 库中的 resample 函数可用于实现线性插值。

示例

在下面的示例中,我们有一个时间序列 DataFrame,其中包含三个非连续日期的观测值。我们将"日期"列转换为日期时间格式并将其设置为索引。resample 函数用于使用 asfreq 方法将数据上采样为每日频率("D")。最后,带有"线性"选项的 interpolate 方法使用线性插值填充数据点之间的间隙。 DataFrame df_upsampled 包含带有插值值的上采样时间序列数据。

import pandas as pd

# 创建示例时间序列 DataFrame
data = {'Date': ['2023-06-01', '2023-06-03', '2023-06-06'],
    'Value': [10, 20, 30]}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 使用线性插值对数据进行上采样
df_upsampled = df.resample('D').asfreq().interpolate(method='linear')

# 打印上采样的 DataFrame
print(df_upsampled)

输出

                Value
Date                 
2023-06-01  10.000000
2023-06-02  15.000000
2023-06-03  20.000000
2023-06-04  23.333333
2023-06-05  26.666667
2023-06-06  30.000000

最近邻插值

最近邻插值是一种简单的方法,它用最近的可用观测值填充数据点之间的空白。当时间序列出现突然变化或观测顺序很重要时,此方法非常有用。pandas 中的 interpolate 方法可以与 'nearest' 选项一起使用来执行最近邻插值。

示例

在上面的例子中,我们使用与之前相同的原始 DataFrame。在使用 'D' 频率重新采样后,带有 'nearest' 选项的 interpolate 方法通过复制最近的可用观测值来填补空白。生成的 DataFrame df_upsampled 现在具有使用最近邻插值的每日频率。

import pandas as pd

# 创建示例时间序列 DataFrame
data = {'Date': ['2023-06-01', '2023-06-03', '2023-06-06'],
        'Value': [10, 20, 30]}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 使用最近邻插值对数据进行上采样
df_upsampled = df.resample('D').asfreq().interpolate(method='nearest')

# 打印上采样的 DataFrame
print(df_upsampled)

输出

            Value
Date             
2023-06-01   10.0
2023-06-02   10.0
2023-06-03   20.0
2023-06-04   20.0
2023-06-05   30.0
2023-06-06   30.0

下采样

下采样用于降低时间序列数据的频率,通常是为了获得更广泛的数据视图或简化分析。 Python 提供了不同的下采样技术,例如在指定的时间间隔内取平均值、总和或最大值。

语法

DataFrame.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

在这里,重采样后应用聚合方法(例如平均值、总和或最大值)来计算表示每个重采样间隔内分组观测值的单个值。 这些方法通常在对数据进行下采样时使用。它们可以直接应用于重采样的 DataFrame,也可以与重采样函数结合使用,通过指定适当的规则,根据特定频率(例如每周或每月)聚合数据。

均值下采样

均值下采样计算每个间隔内数据点的平均值。此方法在处理高频数据并获取每个间隔的代表值时很有用。重采样函数与均值方法相结合可用于执行均值下采样。<​​/p>

示例

在下面的示例中,我们从涵盖整个 2023 年 6 月的每日时间序列 DataFrame 开始。具有"W"频率的重采样函数将数据下采样到每周间隔。通过应用均值方法,我们可以获得每周内的平均值。生成的 DataFrame df_downsampled 包含均值下采样时间序列数据。

import pandas as pd

# 创建具有每日频率的样本时间序列 DataFrame
data = {'Date': pd.date_range(start='2023-06-01', end='2023-06-30', freq='D'),
        'Value': range(30)}
df = pd.DataFrame(data)
df.set_index('Date', inplace=True)

# 使用平均值进行下采样
df_downsampled = df.resample('W').mean()

# 打印下采样的 DataFrame
print(df_downsampled)

输出

            Value
Date             
2023-06-04    1.5
2023-06-11    7.0
2023-06-18   14.0
2023-06-25   21.0
2023-07-02   27.0

最大下采样

最大下采样计算并设置每个间隔内的最高值。此方法适用于识别时间序列中的峰值或极端事件。在上一个示例中使用 max 代替平均值或总和允许我们执行最大下采样。<​​/p>

示例

在下面的示例中,我们从涵盖整个 2023 年 6 月的每日时间序列 DataFrame 开始。具有"W"频率的重采样函数将数据下采样到每周间隔。通过应用 max 方法,我们获得每周内的最大值。生成的 DataFrame df_downsampled 包含最大下采样时间序列数据。

import pandas as pd
# 创建具有每日频率的样本时间序列 DataFrame
data = {'Date': pd.date_range(start='2023-06-01', end='2023-06-30', freq='D'),
    'Value': range(30)}
df = pd.DataFrame(data)
df.set_index('Date', inplace=True)

# 使用平均值进行下采样
df_downsampled = df.resample('W').max()

# 打印下采样的 DataFrame
print(df_downsampled)

输出

            Value
Date             
2023-06-04      3
2023-06-11     10
2023-06-18     17
2023-06-25     24
2023-07-02     29

结论

在本文中,我们讨论了如何使用 Python 对时间序列数据进行重新采样。Python 提供了各种上采样和下采样技术。我们探索了用于上采样的线性和最近邻插值以及用于下采样的均值和最大插值。您可以根据手头的问题使用任何上采样或下采样技术。


相关文章