博客
关于我
pandas 时序统计的高级用法!
阅读量:794 次
发布时间:2023-02-26

本文共 3179 字,大约阅读时间需要 10 分钟。

pandas时间序列重采样详解

时间序列数据的重采样是数据分析中常见且重要的一种操作。通过重采样,我们可以将数据从一个频率转换为另一个频率,从而更方便地进行数据分析和可视化。在pandas中,实现时间序列重采样的核心工具是resample()函数。本文将详细介绍pandas重采样的核心功能、使用方法以及实际应用案例。

1. 重采样的概念

时间重采样是一种将数据按一定频率重新组织的技术。常见的重采样方式包括向上采样和向下采样。向上采样是指将数据的时间频率变得更细,如将天转换为分钟、小时等更精细的单位。向下采样则是将数据的时间频率变得更粗,如将天转换为周、月、季度等更粗粒度的单位。

2. resample()函数的核心功能

在pandas中,resample()函数是实现时间序列重采样的主要工具。该函数可以对Series和DataFrame对象执行重采样操作。由于重采样默认对索引进行操作,因此索引必须是时间类型,或者通过on参数指定要重采样的时间类型的列。

2.1 resample()函数的主要参数

  • rule:定义重采样的频率规则,可为DateOffset、Timedelta或str类型。当为str类型时,需遵循特定规则。
  • axis:指定轴方向,默认为0(索引)。
  • closed:指定时间频率分组的左右闭合状态,默认右闭合。
  • label:指定分组标签的边界,默认为右边界。
  • kind:将结果索引转换为指定的时间类型(如DateTimeIndex或PeriodIndex)。
  • on:对于DataFrame,指定被重采样的列,且列必须是时间类型。
  • level:对于多级索引,指定要重采样的索引层级。
  • origin:调整时间分组的起点。
  • offset:对origin添加的偏移量。
  • group_keys:指定结果索引中是否包含分组标签,默认为False。

3. 重采样的实际应用

3.1 基于索引的重采样

默认情况下,resample()对索引进行操作。假设索引是时间类型,直接调用函数即可。

df.resample('W')['C_0'].sum().head()

3.2 基于列的重采样

如果不想对索引重采样,可以通过on参数指定时间类型的列。

df = df.reset_index(drop=False, inplace=True)df.resample('W', on='index')['C_0'].sum().head()

3.3 开闭区间的控制

通过closed参数可以指定时间频率的左右闭合状态。默认情况下,MAQBMBABQW是右闭合,其余频率默认为左闭合。

df.resample('W', closed='left')['C_0'].sum().head()df.resample('W', closed='right')['C_0'].sum().head()

3.4 标签的控制

通过label参数可以指定输出结果的标签。默认为右边界,通过设置label='left'可以更改为左边界。

df.resample('W', label='left')['C_0'].sum().head()df.resample('W', label='right')['C_0'].sum().head()

3.5 聚合统计的应用

重采样后可以对多个列进行聚合统计。例如,采用agg()函数对多个列进行多种聚合操作。

df.resample('W').agg({    'C_0': ['sum', 'mean'],    'C_1': lambda x: np.std(x, ddof=1)}).head()

3.6 上采样的应用

通过对rule参数指定更细粒度的频率,可以实现上采样。例如,将天转换为12小时频率。

df.resample('12H')['C_0'].sum().head()

3.7 上采样后的数据填充

在上采样过程中,可能会出现数据缺失。通过ffill()bfill()nearest()等函数可以对缺失数据进行填充。

df.resample('8H')['C_0'].ffill(limit=1).head()df.resample('8H')['C_0'].bfill(limit=1).head()df.resample('8H')['C_0'].nearest(limit=1).head()

3.8 高级填充方法

除了上述填充方法,还可以使用fillna()函数进行混合填充。

df.resample('8H')['C_0'].fillna(method='pad', limit=1).head()df.resample('8H')['C_0'].asfreq(-999).head()

3.9 高阶填充方法

通过interpolate()函数可以对缺失数据进行高级插值填充。

df.resample('8H').interpolate(method='linear').applymap(lambda x: round(x, 2)).head()

4. 聚合与变换操作

4.1 agg()聚合函数

通过agg()函数可以对多个列进行多种聚合操作。例如,计算多个列的统计量并进行组合。

df.resample('W').agg({    'C_0': ['sum', 'mean'],    'C_1': lambda x: x.max() - x.min()}).head()

4.2 apply()函数

apply()函数可以对重采样后的数据执行自定义函数,适用于需要灵活处理的场景。

def agg_func(x):    names = {        'C_0_mean': round(x['C_0'].mean(), 2),        'C_1_sum': x['C_1'].sum(),        'C_2_max': x['C_2'].max(),        'C_3_mean_plus1': round(x['C_3'].mean() + 1, 2)    }    return pd.Series(names, index=[key for key in names.keys()])df.resample('W').apply(agg_func).head()

4.3 transform()函数

transform()函数可以对重采样后的数据执行组内转换操作,不改变原索引结构。

df['C_0_cumsum'] = df.resample('W')['C_0'].transform('cumsum')df['C_0_rank'] = df.resample('W')['C_0'].transform('rank')df.head(10)

4.4 pipe()函数

pipe()函数可以对重采样后的resampler对象执行链式操作,提升代码可读性和效率。

df['cumsum_delta'] = df.resample('W')['C_0', 'C_1'] \    .pipe(lambda x: x.cumsum()) \    .pipe(lambda x: x['C_1'] - x['C_0'])df.head(10)

5. 总结

通过本文的介绍,已经掌握了pandas中时间序列重采样的核心概念和实际操作方法。无论是向上采样还是向下采样,resample()函数都提供了强大的功能,能够满足多种数据分析场景的需求。在实际应用中,可以根据具体需求灵活配置ruleclosedlabel等参数,对时间序列数据进行精细化处理。

转载地址:http://jsvfk.baihongyu.com/

你可能感兴趣的文章