如何在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”列转换为日期时间格式并将其设置为索引。resample 函数用于使用 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 中的 interpolate 方法可以与 'nearest' 选项一起使用以执行最近邻插值。
示例
在上面的示例中,我们使用与之前相同的原始 DataFrame。使用 'D' 频率重采样后,使用 'nearest' 选项的 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 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)
这里,聚合方法(例如,**平均值、总和或最大值**)在重采样后应用,以计算代表每个重采样间隔内分组观测值的单个值。这些方法通常在对数据进行下采样时使用。它们可以直接应用于重采样的 DataFrame,也可以与 resample 函数组合以根据特定频率(例如每周或每月)聚合数据,方法是指定相应的规则。
平均值下采样
平均值下采样计算每个区间内数据点的平均值。处理高频数据并获取每个区间的代表性值时,此方法很有用。resample 函数与平均值方法组合可以使用来执行平均值下采样。
示例
在下面的示例中,我们从跨越 2023 年 6 月整月的每日时间序列 DataFrame 开始。具有 'W' 频率的 resample 函数将数据下采样到每周间隔。通过应用平均值方法,我们获得了每周内的平均值。生成的 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
最大值下采样
最大值下采样计算并设置每个区间内的最高值。此方法适用于识别时间序列中的峰值或极端事件。在前面的示例中使用 max 代替 mean 或 sum 可以执行最大值下采样。
示例
在下面的示例中,我们从跨越 2023 年 6 月整月的每日时间序列 DataFrame 开始。具有 'W' 频率的 resample 函数将数据下采样到每周间隔。通过应用 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 Date 2023-06-04 3 2023-06-11 10 2023-06-18 17 2023-06-25 24 2023-07-02 29
结论
在本文中,我们讨论了如何使用 Python 重采样时间序列数据。Python 提供各种上采样和下采样技术。我们探讨了用于上采样的线性插值和最近邻插值,以及用于下采样的平均值和最大值插值。您可以根据手头的具体问题使用任何上采样或下采样技术。