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,并使用rule参数指定所需的重采样频率。可以提供其他参数(*args)和关键字参数(**kwargs)以自定义重采样行为,例如指定聚合方法或处理缺失值。
-
asfreq 方法与resample函数一起使用,用于转换时间序列数据的频率。它使用freq参数指定输出的所需频率字符串。可选的method参数允许指定如何处理在重采样过程中引入的任何缺失值,例如向前填充、向后填充或插值。
-
interpolate方法用于填充时间序列数据中的缺失值或间隙。它根据指定的方法(例如’linear’、’nearest’、’spline’)对现有观察值之间的值进行插值。其他参数允许控制插值所执行的轴、要填充的连续NaN值的限制以及是否就地修改DataFrame或返回新的DataFrame。
线性插值
线性插值用于上采样时间序列数据。它通过在数据点之间绘制直线来填充间隙。可以使用pandas库的resample函数来实现线性插值。
示例
在下面的示例中,我们有一个非连续日期上的时间序列DataFrame。我们将’Date’列转换为datetime格式并将其设置为索引。使用asfreq方法将数据上采样到每日频率(’D’)。最后,使用’linear’选项的interpolate方法使用线性插值填充数据点之间的间隙。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
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中,可以使用插值函数的’nearest’选项来执行最近邻插值。
示例
在上面的示例中,我们使用与之前相同的原始DataFrame。在使用“D”频率重新采样后,使用’nearest’选项的插值方法通过复制最近的可用观测来填补间隙。结果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
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)
在这里,聚合方法,如 mean、sum或max ,在重新采样后应用以计算代表每个重新采样间隔内的分组观测的单个值。这些方法在降采样数据时通常使用。它们可以直接应用于重新采样的DataFrame,也可以与重新采样函数结合使用,根据特定频率(如每周或每月)通过指定适当的规则来聚合数据。
均值降采样
均值降采样计算每个间隔内数据点的平均值。此方法在处理高频数据并获取每个间隔的代表值时很有用。可以使用与均值方法结合的重新采样函数来执行均值降采样。
示例
在下面的示例中,我们从跨越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
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
最大降采样
最大降采样计算并设置每个间隔内的最高值。这种方法适用于识别时间序列中的峰值或极端事件。在前面的示例中,使用最大值而不是平均值或总和允许我们执行最大降采样。
示例
在下面的示例中,我们从整个2023年6月的每日时间序列数据框开始。使用“W”频率的重采样函数将数据降采样为每周间隔。通过应用最大值方法,我们获得每周内的最大值。结果数据框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
Date
2023-06-04 3
2023-06-11 10
2023-06-18 17
2023-06-25 24
2023-07-02 29
结论
在本文中,我们讨论了如何使用Python对时间序列数据进行重新采样。Python提供了各种上采样和下采样技术。我们探讨了线性和最近邻插值的上采样方法,以及均值和最大值插值的下采样方法。您可以根据手头的具体问题选择任何一种上采样或下采样技术。