0


使用Pandas的resample函数处理时间序列数据的技巧

时间序列数据在数据科学项目中很常见。通常,可能会对将时序数据重新采样到要分析数据的频率或从数据中汲取更多见解的频率感兴趣。

在本文中,我们将介绍一些使用Pandas resample()函数对时间序列数据进行重采样的示例。我们将介绍以下常见问题,并应帮助您开始使用时序数据操作。

  1. 下采样并执行聚合
  2. 使用自定义基数进行下采样
  3. 上采样和填充值
  4. 一个实际的例子

向下采样和执行聚合

下采样是将一个时间序列数据集重新采样到一个更大的时间框架。例如,从几分钟到几小时,从几天到几年。结果的行数将减少,并且可以使用mean()、min()、max()、sum()等聚合值。

让我们通过一个示例来了解它是如何工作的。

假设我们有一个关于销售的数据集。

df_sales = pd.read_csv(
    'sales_data.csv', 
    parse_dates=['date'], 
    index_col=['date']
)

要获得每2小时添加的总销售额,只需使用resample()将DataFrame向下采样到2小时的容器中,并将落入容器中的时间戳的值相加。

df_sales.resample('2H').sum()

要执行多个聚合,我们可以向agg()方法传递一个聚合函数列表。

df_sales.resample('2H').agg(['min','max', 'sum'])

使用自定义基数向下采样

默认情况下,对于平均细分为1天/月/年的频率,聚合间隔的“原点”默认为0。所以2H频率的结果范围是00:00:00,02:00:00,04:00:00,…,22:00:00。

对于我们正在使用的销售数据,第一个记录的日期值为2017-01-02 09:02:03,因此将输出范围从09:00:00开始比从08:00开始更有意义。为此,我们可以使用参数base将聚合间隔的“原点”设置为不同的值,例如,set base=1,这样结果范围就可以从09:00:00开始。

df_sales.resample('2H', base=1).sum()

上采样和填充值

上采样是下采样的相反操作。它将时间序列数据重新采样到一个更小的时间框架。例如,从小时到分钟,从年到天。结果将增加行数,并且附加的行值默认为NaN。内置的方法ffill()和bfill()通常用于执行前向填充或后向填充来替代NaN。

让我们为演示创建一个DataFrame。

df = pd.DataFrame(
    { 'value': [1, 2, 3] }, 
    index=pd.period_range(
        '2012-01-01',
         freq='A',
         periods=3
    )
)

按季度重新采样一年并向前填充值。前向填充方法ffill()将使用最后一个已知值来替换NaN。

df.resample('Q').ffill()

按季度重新采样一年并向后填充值。向后填充方法bfill()将使用下一个已知值来替换NaN。

df.resample('Q').bfill()

一个实际的例子

让我们看看如何使用Pandas resample()来处理一个现实世界的问题。

假设我们有两个数据集,一个是月销售额df_sales,另一个是价格df_price。df_price只有关于价格变化的记录。

我们想计算一下每个月的销售总额,下面是预期的产量。

这个计算中比较困难的部分是,我们需要检索每个月的价格,并将其合并到数据中,以便计算总价格。

一种简洁的解决方案是使用Pandas的resample()函数。一行代码可以检索每个月的价格。

步骤1:按月重新取样价格数据集,并向前填充值

df_price = df_price.resample('M').ffill()

通过调用resample('M')来按月重新采样给定的时间序列。在此之后,调用ffill()来转发填充值。你是不是有点困惑?查看下面的图片了解细节。

步骤2:结合结果并计算总销售额

df = pd.concat([df_sales, df_price], axis = 1)
df['total_sales'] = df['num_sold'] * df['price']

使用参数axis=1的Pandas concat()函数水平组合df_sales和df_price。在此之后,可以使用元素方面的乘法df['num_sold'] * df['price']来计算总销售额。

通过执行上述语句,您应该得到如下输出:

结论

Pandas resample()函数是一个简单、强大、高效的函数,用于在频率转换期间执行重采样操作。

我希望本文能帮助您节省分析时间序列数据的时间。我建议您查看resample() API的文档,了解您可以做的其他事情。

感谢你的阅读。如果您对机器学习的实践方面感兴趣,请查看笔记本以获取源代码

https://github.com/BindiChen/machine-learning/blob/master/data-analysis/020-pandas-resample/pandas-resample.ipynb

作者:B. Chen

deephub翻译组

标签:

“使用Pandas的resample函数处理时间序列数据的技巧”的评论:

还没有评论