如何在 Python 中对时间序列数据重新采样
时间序列数据是一段时间内定期收集的一系列观察结果。这些数据可以属于任何领域,例如金融、经济、健康和环境科学。我们收集的时间序列数据有时可能具有不同的频率或分辨率,这可能不适合我们的分析和数据建模过程。在这种情况下,我们可以通过上采样或下采样更改时间序列的频率或分辨率来重新采样时间序列数据。本文将解释对时间序列数据进行上采样或下采样的不同方法。
上采样
上采样意味着增加时间序列数据的频率。当我们需要更高分辨率或更频繁的观察时通常会这样做。 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 参数,该参数指定输出所需的频率字符串。可选的方法参数允许指定如何处理重采样过程中引入的任何缺失值,例如前向填充、后向填充或插值。
-
插值方法用于填充时间序列数据中的缺失值或间隙。它根据指定的方法(例如“线性”、“最近”、“样条”)执行插值来估计现有观测值之间的值。其他参数允许控制执行插值的轴、要填充的连续 NaN 值的限制以及是就地修改 DataFrame 还是返回新的 DataFrame。
线性插值
线性插值用于对时间序列数据进行上采样。它通过在数据点之间绘制直线来填充数据点之间的间隙。 pandas 库中的 resample 函数可用于实现线性插值。
例子
在下面的示例中,我们有一个时间序列 DataFrame,其中包含对非连续日期的三个观察值。我们将“日期”列转换为日期时间格式并将其设置为索引。重采样函数用于使用 asfreq 方法将数据上采样到每日频率 ('D')。最后,带有“线性”选项的插值方法使用线性插值填充数据点之间的间隙。 DataFrame df_upsampled 包含带有插值的上采样时间序列数据。
import pandas as pd
# Create a sample time series 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)
# Upsample the data using linear interpolation
df_upsampled = df.resample('D').asfreq().interpolate(method='linear')
# Print the upsampled DataFrame
print(df_upsampled)
输出
Value
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 中的插值方法可以与“nearest”选项一起使用来执行最近邻插值。
例子
在上面的示例中,我们使用与之前相同的原始 DataFrame。使用“D”频率重新采样后,具有“最近”选项的插值方法通过复制最近的可用观测值来填补空白。生成的 DataFrame df_upsampled 现在具有最近邻插值的每日频率。
import pandas as pd
# Create a sample time series 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)
# Upsample the data using nearest neighbor interpolation
df_upsampled = df.resample('D').asfreq().interpolate(method='nearest')
# Print the upsampled DataFrame
print(df_upsampled)
输出
Value
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,也可以与重新采样函数结合使用,通过指定适当的规则,根据特定频率(例如每周或每月)聚合数据。
平均下采样
平均下采样计算每个间隔内数据点的平均值。该方法在处理高频数据并获取每个区间的代表值时非常有用。 resample函数结合mean方法可以进行均值下采样。
例子
在下面的示例中,我们从涵盖 2023 年 6 月整个月份的每日时间序列 DataFrame 开始。频率为“W”的重采样函数将数据下采样到每周间隔。通过应用平均值方法,我们获得每周内的平均值。生成的 DataFrame df_downsampled 包含均值下采样时间序列数据。
import pandas as pd
# Create a sample time series DataFrame with daily frequency
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)
# Downsampling using mean
df_downsampled = df.resample('W').mean()
# Print the downsampled DataFrame
print(df_downsampled)
输出
Value
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 而不是平均值或总和允许我们执行最大下采样。
例子
在下面的示例中,我们从涵盖 2023 年 6 月整个月份的每日时间序列 DataFrame 开始。频率为“W”的重采样函数将数据下采样到每周间隔。通过应用 max 方法,我们获得每周内的最大值。生成的 DataFrame df_downsampled 包含最大下采样时间序列数据。
import pandas as pd
# Create a sample time series DataFrame with daily frequency
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)
# Downsampling using mean
df_downsampled = df.resample('W').max()
# Print the downsampled DataFrame
print(df_downsampled)
输出
Value
2023-06-04 3
2023-06-11 10
2023-06-18 17
2023-06-25 24
2023-07-02 29
结论
在本文中,我们讨论了如何使用 Python 对时间序列数据进行重新采样。 Python 提供了各种上采样和下采样技术。我们探索了用于上采样的线性插值和最近邻插值以及用于下采样的平均插值和最大插值。您可以根据当前的问题使用任何上采样或下采样技术。