大家好,在时间序列数据处理中,通常会进行滑动窗口计算(rolling)和累积窗口计算(expanding)等操作,以便分析时间序列的变化趋势或累积特征。Pandas提供的rolling
和expanding
函数提供了简单、高效的实现方式,特别适用于金融、气象、市场营销等领域的数据分析。这些函数能够对时间序列数据进行窗口操作,从而灵活地进行均值、标准差、最大值、最小值等计算。
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 两种窗口函数对比
功能 | rolling | expanding |
---|---|---|
窗口类型 | 固定窗口 | 累积窗口 |
窗口长度 | 固定(指定窗口大小) | 动态(从起点到当前) |
适用计算 | 滑动均值、滑动标准差、滑动最值等 | 累积和、累积均值、累积最大/最小值等 |
应用场景 | 短期波动分析(如股票的滑动平均) | 累积趋势分析(如总销售额的增长) |
rolling
适用于分析短期波动,观察窗口内的均值或标准差,广泛应用于金融、气象等领域。而expanding
更适用于分析长期累积变化,帮助理解总体趋势,例如累计销售额或累计增长趋势。
Pandas中的rolling
和expanding
函数为时间序列数据提供了灵活的窗口计算支持。rolling
函数适用于滑动窗口分析,帮助观察数据的短期波动;expanding
函数则适合累积计算,用于分析长期趋势。在日常的数据分析中,合理选择这两个函数并结合自定义函数,可以高效、灵活地进行时间序列的深度分析。