Python时间序列优化之道滑动与累积窗口的应用技巧

大家好,在时间序列数据处理中,通常会进行滑动窗口计算(rolling)和累积窗口计算(expanding)等操作,以便分析时间序列的变化趋势或累积特征。Pandas提供的rollingexpanding函数提供了简单、高效的实现方式,特别适用于金融、气象、市场营销等领域的数据分析。这些函数能够对时间序列数据进行窗口操作,从而灵活地进行均值、标准差、最大值、最小值等计算。

1.滑动窗口与累积窗口概述

在Pandas中,滑动窗口和累积窗口是处理数据流时常用的两种窗口模型,它们在时间序列分析、事件处理、流处理等领域中非常重要。

滑动窗口是一种动态窗口模型,它在时间轴上滑动以覆盖连续的数据段。窗口的大小是固定的,但随着时间的推移,窗口会沿着数据流向前移动。这种窗口模型允许数据的连续处理,窗口内的数据可以是重叠的。

累积窗口是一种非重叠的窗口模型,每个窗口包含不重叠的数据段。当窗口内的数据被处理完毕后,窗口会向前移动到下一个数据段,开始处理新的数据。

2.rolling函数的用法与应用

rolling函数可以在指定的窗口长度内对数据进行滑动计算。常见应用包括计算移动平均、滑动标准差、滑动最大值和最小值等。rolling函数的基本语法如下:

Series/DataFrame.rolling(window, min_periods=None, center=False).agg(func)
  • window:窗口大小,通常为整数,表示滑动窗口包含的数据点数。

  • min_periods:窗口内计算所需的最小非缺失值数量。默认为窗口大小。

  • center:窗口是否居中对齐,默认为False

2.1 示例数据集

首先,创建一个包含日销售额的示例数据集:

import pandas as pd
import numpy as np

# 创建示例数据
date_range = pd.date_range(start="2023-01-01", periods=10)
sales = [100, 150, 120, 130, 170, 160, 180, 200, 210, 220]
df = pd.DataFrame({'日期': date_range, '销售额': sales})
df.set_index('日期', inplace=True)
print("原始数据:\n", df)

原始数据如下:

             销售额
日期             
2023-01-01   100
2023-01-02   150
2023-01-03   120
2023-01-04   130
2023-01-05   170
2023-01-06   160
2023-01-07   180
2023-01-08   200
2023-01-09   210
2023-01-10   220

2.2 滑动均值

滑动均值(moving average)是时间序列分析中最常用的统计方法之一,用于平滑数据。以下计算3天的滑动均值:

# 计算3天滑动均值
df['3天滑动均值'] = df['销售额'].rolling(window=3).mean()
print("3天滑动均值:\n", df)

结果如下:

             销售额  3天滑动均值
日期                     
2023-01-01   100       NaN
2023-01-02   150       NaN
2023-01-03   120     123.33
2023-01-04   130     133.33
2023-01-05   170     140.00
2023-01-06   160     153.33
2023-01-07   180     170.00
2023-01-08   200     180.00
2023-01-09   210     196.67
2023-01-10   220     210.00

3天滑动均值列中,前三行没有足够的数据计算3天均值,因此显示为NaN,从第四行开始展示滑动均值结果。

2.3 滑动标准差

滑动标准差可以反映数据在窗口期内的波动情况。下面计算5天的滑动标准差:

# 计算5天滑动标准差
df['5天滑动标准差'] = df['销售额'].rolling(window=5).std()
print("5天滑动标准差:\n", df)

结果如下:

             销售额  3天滑动均值  5天滑动标准差
日期                                        
2023-01-01   100       NaN        NaN
2023-01-02   150       NaN        NaN
2023-01-03   120     123.33        NaN
2023-01-04   130     133.33        NaN
2023-01-05   170     140.00       27.95
2023-01-06   160     153.33       21.91
2023-01-07   180     170.00       23.32
2023-01-08   200     180.00       25.17
2023-01-09   210     196.67       21.79
2023-01-10   220     210.00       23.33

可以看到,从第五行开始,5天滑动标准差列开始显示标准差结果。滑动标准差常用于分析波动情况,例如股票价格的波动性分析。

2.4 自定义滑动计算函数

rolling函数允许传入自定义函数进行复杂的滑动计算,以下示例展示使用自定义函数计算3天窗口的最大值与最小值之差:

# 自定义滑动计算函数
df['3天范围'] = df['销售额'].rolling(window=3).apply(lambda x: x.max() - x.min())
print("3天窗口的最大最小差:\n", df)

结果如下表所示:

             销售额  3天滑动均值  5天滑动标准差  3天范围
日期                                        
2023-01-01   100       NaN        NaN     NaN
2023-01-02   150       NaN        NaN     NaN
2023-01-03   120     123.33       NaN    30.0
2023-01-04   130     133.33       NaN    30.0
2023-01-05   170     140.00      27.95    50.0
2023-01-06   160     153.33      21.91    50.0
2023-01-07   180     170.00      23.32    50.0
2023-01-08   200     180.00      25.17    40.0
2023-01-09   210     196.67      21.79    30.0
2023-01-10   220     210.00      23.33    20.0

自定义滑动计算函数灵活性强,可以满足各种特定计算需求。

3.expanding函数的用法与应用

expanding函数从数据起点开始逐步增加窗口长度,适用于累积计算,常用于累计求和、累计均值等操作。expanding函数的基本语法如下:

Series/DataFrame.expanding(min_periods=1).agg(func)
  • min_periods:计算窗口所需的最小非缺失值数量。

3.1 累积均值

累积均值表示从数据起点到当前点的平均值,通常用于观察数据的长期趋势。

计算销售额的累积均值:

# 计算累积均值
df['累积均值'] = df['销售额'].expanding().mean()
print("累积均值:\n", df)

结果如下表所示:

             销售额  3天滑动均值  5天滑动标准差  3天范围    累积均值
日期                                        
2023-01-01   100       NaN       NaN      NaN   100.00
2023-01-02   150       NaN       NaN      NaN   125.00
2023-01-03   120     123.33      NaN    30.0   123.33
2023-01-04   130     133.33      NaN    30.0   125.00
2023-01-05   170     140.00     27.95   50.0   134.00
2023-01-06   160     153.33     21.91   50.0   138.33
2023-01-07   180     170.00     23.32   50.0   144.29
2023-01-08   200     180.00     25.17   40.0   151.25
2023-01-09   210     196.67     21.79   30.0   158.89
2023-01-10   220     210.00     23.33   20.0   166.00

可以看到,累积均值从初始值开始逐步加入新值进行平均,帮助我们分析数据的长期变化趋势。

3.2 累积最大值与最小值

累积最大值和最小值分别表示从数据起点到当前点的最大值和最小值,用于分析数据的累积范围。

以下代码展示了如何计算销售额的累积最大值和最小值:

# 计算累积最大值和累积最小值
df['累积最大值'] = df['销售额'].expanding().max()
df['累积最小值'] = df['销售额'].expanding().min()
print("累积最大值和最小值:\n", df)

结果如下表所示:

             销售额  3天滑动均值  5天滑动标准差  3天范围  累积均值  累积最大值  累积最小值
日期                                                                
2023-01-01   100       NaN        NaN     NaN  100.00   100      100
2023-01-02   150       NaN        NaN     NaN  125.00   150      100
2023-01-03   120     123.33       NaN    30.0  123.33   150      100
2023-01-04   130     133.33       NaN    30.0  125.00   150      100
2023-01-05   170     140.00      27.95   50.0  134.00   170      100
2023-01-06   160     153.33      21.91   50.0  138.33   170      100
2023-01-07   180     170.00      23.32   50.0  144.29   180      100
2023-01-08   200     180.00      25.17   40.0  151.25   200      100
2023-01-09   210     196.67      21.79   30.0  158.89   210      100
2023-01-10   220     210.00      23.33   20.0  166.00   220      100

累积最大值和最小值可以帮助识别数据中的波峰和波谷,进一步理解数据的波动范围。

3.3 两种窗口函数对比

功能rollingexpanding
窗口类型固定窗口累积窗口
窗口长度固定(指定窗口大小)动态(从起点到当前)
适用计算滑动均值、滑动标准差、滑动最值等累积和、累积均值、累积最大/最小值等
应用场景短期波动分析(如股票的滑动平均)累积趋势分析(如总销售额的增长)

rolling适用于分析短期波动,观察窗口内的均值或标准差,广泛应用于金融、气象等领域。而expanding更适用于分析长期累积变化,帮助理解总体趋势,例如累计销售额或累计增长趋势。

Pandas中的rollingexpanding函数为时间序列数据提供了灵活的窗口计算支持。rolling函数适用于滑动窗口分析,帮助观察数据的短期波动;expanding函数则适合累积计算,用于分析长期趋势。在日常的数据分析中,合理选择这两个函数并结合自定义函数,可以高效、灵活地进行时间序列的深度分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值