Pandas中的窗口函数

2025 年 1 月 4 日 | 阅读 16 分钟

引言

该语言还提供了 Pandas,这是 Python 中一个官方的数据操作工具,它包含许多用于数据分析和操作的函数。其中有一种功能强大的窗口函数可以在 Pandas 中实现。窗口函数是允许您对行范围进行计算的操作,可以提供有关趋势和模式的一些信息。本文的目的是结合 Pandas 库中关于窗口函数的信息,描述它们的类型和使用示例,并指出它们的应用程序。

什么是窗口函数?

窗口函数作用于与当前行相关的表行集,并对这些行进行计算。它们类似于聚合函数。然而,与大多数聚合函数不同,窗口函数不会将多行的结果合并为单个行值。它们保留了相同的行布局,但同时显示了额外的摘要信息。

窗口函数中的分析工具最常用于计算与运行总计、移动平均值以及数据特定窗口内的各种其他累积参数相关的度量。

窗口函数的类型

Pandas 提供了几种类型的窗口函数,包括

  1. 滚动窗口: 对这些统计数据创建移动平均值或移动窗口。
  2. 扩展窗口: 计算随时间增长的累积统计数据的边际聚合。
  3. 指数移动窗口: 在移动窗口上计算指数加权移动平均值。
  4. 分组窗口: 这应该在组中完成,最好通过执行窗口计算。

设置环境

在展示示例之前,让我们准备好上下文,并将库和一个小示例数据集加载到变量中。

输出

 
    date  sales
0 2021-01-01     15
1 2021-01-02     20
2 2021-01-03     21
3 2021-01-04     18
4 2021-01-05     30
5 2021-01-06     35
6 2021-01-07     40
7 2021-01-08     45
8 2021-01-09     50
9 2021-01-10     55   

说明

  • 首先导入 Pandas 库并将其别名设置为 'pd'。
  • 导入 pandas 和 NumPy,分别用 'pd' 和 'np' 作为数值计算的别名。
  • 创建一个名为 'data' 的字典,其中包含两个键
  • 'date:' 创建从 2021 年 1 月 1 日到 1 月 10 日的各种日期。
  • 'sales:' 它包含每个日期的销售列表。
  • 将数据导入到名为 df 的 Pandas DataFrame 中,但首先,字典数据应该被平坦化。
  • 显示 DataFrame 'df',它将以表格形式说明源中的数据。

滚动窗口

运行或滚动窗口用于应用一个函数,该函数在给定大小的滑动窗口上计算数据。另一个作用于此的特性是 Pandas 中的 'rolling()' 方法。

1. 计算滚动平均值

滚动平均值取一定数量观测值的平均值并随时间“滚动”,从而掩盖短期波动,同时揭示长期趋势或振荡。

输出

 
date  sales  rolling_mean
0 2021-01-01     15           NaN
1 2021-01-02     20           NaN
2 2021-01-03     21     18.666667
3 2021-01-04     18     19.666667
4 2021-01-05     30     23.000000
5 2021-01-06     35     27.666667
6 2021-01-07     40     35.000000
7 2021-01-08     45     40.000000
8 2021-01-09     50     45.000000
9 2021-01-10     55     50.000000   

说明

  • 在使用数据框时,作为工作的一部分,导入名为“PD”的 Pandas 库。
  • 导入 NumPy 库,别名为 'np',用于数值计算。
  • 创建一个名为 'data' 的字典,其中包含两个键
  • 'date:' 返回从 2021 年 1 月 1 日开始到 2021 年 1 月 10 日结束的日期选择。
  • 'sales:' 它提供了一份销售报告,列出了每个日期的公司。
  • 将字典数据转换为一个名为 'df' 的 Pandas DataFrame 数据对象。
  • 现在,需要找到销售列前 20 个值的平均值,扩展为 3,并将新列命名为 'rolling_mean'。
  • 显示 DataFrame 'df' 的内容,以查看原始数据和新创建的 'rolling_mean' 列。
  • 最后生成的 DataFrame 将包含原始的“日期和销售额”列以及为每行新创建的 rolling_mean 列。滚动平均值是当前值和前两个销售值的中点。因此,对于前两行,滚动平均值将等于 NaN,这意味着没有足够的先前值来计算平均值。

2. 滚动和

您还可以计算滚动和,它给出窗口中值的总和。

输出

 
 date  sales  rolling_sum
0 2021-01-01     15          NaN
1 2021-01-02     20          NaN
2 2021-01-03     21         56.0
3 2021-01-04     18         59.0
4 2021-01-05     30         69.0
5 2021-01-06     35         83.0
6 2021-01-07     40        105.0
7 2021-01-08     45        120.0
8 2021-01-09     50        135.0
9 2021-01-10     55        150.0   

说明

  • 使用 Pandas 作为别名 'pd' 来处理数据。
  • 导入列表中的最后一个库,名为 'NumPy',并为数字运算分配别名 'np'。
  • 创建一个名为 'data' 的字典,其中包含两个键:创建一个名为 'data' 的字典,其中包含两个键
  • 'date:' 创建一组从 2021 年 1 月 1 日开始的日期,并在集合中包含 10 天。
  • 'sales:' 提供以下每个日期的销售列表和详细信息
  • 将收集到的字典数据转换为名为 'df' 的 Pandas DataFrame 形式。
  • 对于当前的透视表,创建一个名为 'rolling_mean' 的新列,并对 'sales' 列使用窗口大小为 3 的滚动平均函数。
  • 在此步骤中,创建了 DataFrame df 以打印原始数据和新创建的列 'rolling_mean'。
  • 将窗口大小定义为 3,计算销售列的滚动和,然后将其分配给名为 'rolling_sum' 的新列。
  • 为了显示原始数据以及 'rolling_mean' 和 'rolling_sum' 列,我们可以再次打印 DataFrame 'df'。
  • DataFrame 的最后形状将展示初始 DataFrame 中的日期和销售额列,以及根据特定行计算的新 'rolling_mean' 和 'rolling_sum'。滚动平均值和滚动和的值在 3 行的窗口上计算,并且此类计算的结果显示在后续行中。对于这些列的前两行,值将为 'NaN',因为没有更早的值可以计算它们。

滚动标准差

为了评估上一步中应用的窗口中值的离散程度,您可以使用滚动标准差。

输出

 
date  sales  rolling_std
0 2021-01-01     15          NaN
1 2021-01-02     20          NaN
2 2021-01-03     21     3.214550
3 2021-01-04     18     1.527525
4 2021-01-05     30     6.244998
5 2021-01-06     35     8.736895
6 2021-01-07     40     5.000000
7 2021-01-08     45     5.000000
8 2021-01-09     50     5.000000
9 2021-01-10     55     5.000000   

说明

  • 导入 `NumPy` 库,别名为 'np',用于执行数值运算。
  • 创建一个名为 'data' 的字典,其中包含两个键
  • 'date:' 创建一组从年初 2021 年 1 月 1 日开始的日期,共 10 天。
  • 'sales:' 销售需求并提供从周一到周日每天要销售的数量。
  • 将字典数据转换为 Pandas DataFrame,该 DataFrame 将命名为 'df'。
  • 使用 sales 列,应用滚动函数并将其窗口大小设置为 3。然后,计算滚动列的标准差并将其存储在“rolling_std”中。
  • 建议打印 DataFrame df 以重新查看原始数据以及引入的 'rolling_std' 列。
  • 再次打印 DataFrame 'df'(考虑到第二个打印语句,这可能看起来不必要;但是,它打印相同的 DataFrame)。
  • 最后一个 DataFrame 将列出每行的原始日期和销售额,并包含一个名为 'rolling_std' 的新名称列。滚动标准差在三行的移动窗口中计算。对于前两行,rolling_std 将为 'NaN',因为没有更早的值来计算标准差。

扩展窗口

增长窗口从索引 I 开始,包含从 I 到 J 的所有元素。此功能在 Pandas 中通过 expanding() 方法提供。

1. 计算扩展平均值

扩展平均值提供从初始行到当前行的运行总平均值。

输出

 
date  sales  expanding_mean
0 2021-01-01     15       15.000000
1 2021-01-02     20       17.500000
2 2021-01-03     21       18.666667
3 2021-01-04     18       18.500000
4 2021-01-05     30       20.800000
5 2021-01-06     35       23.166667
6 2021-01-07     40       25.571429
7 2021-01-08     45       28.000000
8 2021-01-09     50       30.444444
9 2021-01-10     55       32.900000   

说明

  • 导入 NumPy 库,别名为 'np',用于数值运算。
  • 创建一个名为 data 的字典,其中包含两个键
  • 'date:' 使用 N 次方根,创建从 2021 年 1 月 1 日开始的 10 个日期值。
  • 'sales:' 给出每个日期的可能销售额。
  • 将获得的字典数据转换为名为 'df' 的 Pandas DataFrame。
  • 找到 sales 列的扩展平均值并将其放入名为“expanding mean”的新列中。另一方面,扩展平均值是通过将前几行添加到当前行来计算的。
  • 您可以打印出 DataFrame df 以查看原始数据和新创建的 'expanding_mean' 列。
  • 最后一个 DataFrame 描述了原始日期和销售额列,以及为每个列计算的扩展平均值。递增平均值提供从表开头到指定行的运行总平均值。

2. 扩展和

就像您在扩展平均值中一样,您也可以确定扩展和。

输出

 
date  sales  expanding_sum
0 2021-01-01     15           15.0
1 2021-01-02     20           35.0
2 2021-01-03     21           56.0
3 2021-01-04     18           74.0
4 2021-01-05     30          104.0
5 2021-01-06     35          139.0
6 2021-01-07     40          179.0
7 2021-01-08     45          224.0
8 2021-01-09     50          274.0
9 2021-01-10     55          329.0   

说明

  • 让我们导入 NumPy 库,它被称为 'np' 用于数值计算。
  • 创建一个名为 'data' 的字典,其中包含两个键
  • 'date:' 使用 'pd. date_range(start='2021-01-01', periods=10, freq='D')',创建从 2021 年 1 月 1 日到 2021 年 1 月 10 日的日期序列。
  • 'sales:' 给出每个日期的销售数组:[15, 20, 21, 18, 30, 35, 40, 45, 50, 55]。
  • 使用 pd. DataFrame (data) 将字典数据转换为名为 'df' 的 pandas 数据框。
  • 对 'sales' 列应用 'expanding()' 函数,因为它计算到特定行的累积和并将其保存到名为 'expanding_sum' 的新变量中。
  • 在添加“grp”的滚动和之前,打印 DataFrame df 以查看原始数据以及新的“expanding_sum”列。
  • 最后一个 DataFrame 包括日期和销售额列,以及作为通过对每行应用扩展函数建模的度量的“expanding_sum”。计数显示了从第一个到当前行的销售额总和,因为单元格通过添加先前的销售额进行了格式化。“expanding_sum”列表明,当我们到达数据集的每一行时,它包含所有销售额的总和,从数据集的开头开始。

指数移动窗口

指数移动窗口利用随时间呈指数式下降的权重。用于此的方法是 Pandas 中的 'ewm()'。

这是首选,因为它转置了指数移动平均值的使用。请记住,我们已经确定了两种衡量股票价格波动的方法。

1. 指数移动平均值

当需要对当前观测值给予比先前观测值更大的权重时,指数移动平均值是完美的方法。

输出

 
date  sales   ewm_mean
0 2021-01-01     15  15.000000
1 2021-01-02     20  17.500000
2 2021-01-03     21  19.250000
3 2021-01-04     18  18.625000
4 2021-01-05     30  24.312500
5 2021-01-06     35  29.656250
6 2021-01-07     40  34.828125
7 2021-01-08     45  39.914062
8 2021-01-09     50  44.957031
9 2021-01-10     55  49.978516   

说明

  • 导入 pandas 和 numpy 库。
  • 创建一个名为 'data' 的字典,其中包含两个键。添加包含两个条目的字典 'data'
  • 'date:' 应用 'pd. date_range()' 函数,安排从 2021 年初到第 10 天的特定数量日期 = pd. date_range(start = '2021-01-01', periods = 10, freq = 'D'。
  • 'sales:' 对于每个日期,销售列表为 15, 20, 21, 18, 30, 35, 40, 45, 50, 55。通过将其转换为 Python DataFrame,将字典数据转换为表格形式。使用 'pd. DataFrame(data)' 将转换后的数据命名为 'df'。
  • 我已经继续工作并计算了销售额的“new ()”作为销售额的指数加权平均值,参数为 span=3 和 adjust=False,并将结果数据存储在一个新列中,名为 ewm_mean。
  • 要打印原始数据以及新的 'ewm_mean' 列,请使用以下代码:要打印原始数据和包含 'ewm_mean' 列的新数据框,需要使用以下代码
  • 实际上,EWMA 涉及以一种对当前时期数据给予更多权重而对先前时期数据给予更少权重的方式计算数据。这对于选择似乎对时间序列中当前变化响应更快的响应机制特别有利。

2. 指数移动标准差

但是,您可以计算指数移动标准差。在计算指数移动标准差时,可以对上述基本公式进行某些修改或调整。

输出

 
date  sales   ewm_std
0 2021-01-01     15       NaN
1 2021-01-02     20  3.535534
2 2021-01-03     21  3.146427
3 2021-01-04     18  2.304240
4 2021-01-05     30  7.164865
5 2021-01-06     35  8.274524
6 2021-01-07     40  8.622124
7 2021-01-08     45  8.715860
8 2021-01-09     50  8.725208
9 2021-01-10     55  8.711331   

说明

  • 导入 numpy 库,别名为 np,用于函数计算。
  • 创建一个名为 'data' 的字典,其中包含两个键
  • 'date:' 通过使用工具 pd,可以生成从 2021 年 1 月 1 日开始的以下日期,最多十个不同的日期:日期生成器 pd. date_range(start =' 2021-01-01 ', periods = 10, freq = 'D')。
  • 'sales:' 因此,根据前身数据计算一个包含每个日期的销售额未来值的列表:[15, 20, 21, 18, 30, 35, 40, 45, 50, 55]。
  • 如果字典数据要重新排列成适合 Pandas DataFrame 分析的形式,代码将是 'df = pd. DataFrame(data)'。
  • 在下一步中,使用 span 关键字参数并将 adjust 设置为 False,使用 'ewm()' 方法计算数据到 'sales' 列的指数加权平均值,并将新列重命名为 'ewm_mean'。
  • 为此,使用 'ewm()' 方法计算销售列的指数加权标准差,span 为 3,'adjust=False',并将结果存储在 'ewm_std' 变量中。
  • 如果您打印 DataFrame 'df',您将能够看到原始数据以及两个新列 'ewm_mean' 和 'ewm_std'。

分组窗口

分组窗口允许用户按组进行窗口计算。这在处理时间相关数据时特别有用,这些数据需要基于分类变量(如客户 ID、产品类型等)进行某种分组。

示例:组内的滚动平均值。

现在,想象一个包含“类别”列的 DataFrame,并为每个类别找到滚动平均值。

输出

 
date category  sales  grouped_rolling_mean
0  2021-01-01        X     15                   NaN
1  2021-01-02        X     20                  17.5
2  2021-01-03        X     21                  20.5
3  2021-01-04        X     18                  19.5
4  2021-01-05        Y     30                   NaN
5  2021-01-06        Y     35                  32.5
6  2021-01-07        Y     40                  37.5
7  2021-01-08        Y     45                  42.5
8  2021-01-09        Z     50                   NaN
9  2021-01-10        Z     55                  52.5
10 2021-01-11        Z     60                  57.5
11 2021-01-12        Z     65                  62.5   

说明

  • 创建一个名为 'data' 的字典,其中包含三个键
  • 'date:' 使用函数 'pd. date_range',参数为 start= '2021-01-01' 和 periods=12,将频率设置为 'D'。创建从 2021-01-01 开始的 12 天日期列表
  • 'category:' 将销售数据分类,并使用类别名称 'X、Y 和 Z' 四次。
  • 'sales:' 创建一个销售额列表,对应于日期(格式为 dd. MM. yyyy)和类别:[15, 20, 21, 18, 30, 35, 40, 45, 50, 55, 60, 65]。
  • 通过 'pd. DataFrame(data)' 将字典数据存储在 Pandas 的 DataFrame 名为 df 中。
  • 对于在每个类别上执行的操作,而不是跨类别执行的操作,需要使用 'df. group by ('category')' 按“类别”对 DataFrame 进行分组。
  • 在 rolling(window=2) 函数中,使用 sales 列并按类别对其进行分组,将在其上执行滚动平均值。
  • 在合并步骤中,使用 'reset_index(level=0, drop=True)" 来删除分组生成的额外索引,并使结果集与原始 DataFrame 的索引匹配。
  • 将计算出的分组滚动平均值存储在新列中,名为 'grouped_rolling_mean'。
  • 要查看原始数据以及添加的 'grouped_rolling_mean' 列,请打印 DataFrame df。
  • 生成的 DataFrame 将由四列组成,它们是记录所属的原始日期、记录分配到的类别、零售销售额和新列“grouped_rolling_mean”。至于滚动平均值,这是按类别计算的;也就是说,对于每个类别,都考虑了该特定类别的销售数据。因此,对于每个类别的第一行,滚动平均值的值将为 NaN,因为没有先前的M值可供计算平均值。

实际应用

  1. 财务分析
    • 移动平均线: 滚动平均线在股票市场分析中有着广泛的应用。例如,50 天或 200 天移动平均线让分析师对股票或特定指数的价格总体趋势有所了解,因为价格每天都在波动。这有助于得出买入或卖出信号。
    • 波动率测量: 当用户想要确定股票价格或特定时期回报的波动量时,会应用滚动标准差。这有助于确定与特定投资相关的风险水平。
  2. 销售和收入预测
    • 趋势分析: 商业组织使用滚动平均值分析给定时间段内的销售额。例如,一家拥有每日销售额的零售公司可以使用 7 天或 30 天的滚动平均值,这反过来将促进适当的库存控制和需求预测。
    • 绩效跟踪: 窗口函数的应用扩展到累计销售额或收入,从而提供了在特定时间间隔内的业务量线索。
  3. 制造中的质量控制
    • 过程监控: 滚动平均值和滚动标准差用于通过统计过程控制 (SPC) 图表控制制造过程。当这些函数应用于实际生产时,公司可以监控过程性能的变化并防止重大问题。
    • 缺陷率分析: 增长函数可以包括聚合缺陷率历史;此信息将有助于指示产品质量是否有改进或恶化。
  4. 时间序列预测
    • 平滑时间序列数据: 在时间序列分析中,可以通过滚动和扩展窗口函数导出运行平均值,以协助数据平滑等活动,这在建模和预测中很重要。随后,提取方法提供干净的数据,从而改善对用于计算预测的重要模式的识别。
    • 滞后特征创建: 滚动窗口可以产生滞后,这些滞后在时间序列分析中用作输入或预测变量。这些特征编码历史和季节性,这有助于提高模型的性能。
  5. 体育分析
    • 球员表现: 通常将滚动平均值应用于分析运动员在多场比赛或比赛中的表现。例如,在板球运动中,球员在过去五到十局中的得分的滚动平均值将有助于检查击球形式并做出选择决定。
    • 团队策略: 增长和平均值可以跟踪聚合团队绩效指标,这对于教练或分析师根据团队绩效的变化制定有关比赛结果的策略非常有用。
  6. 客户行为分析
    • 客户流失预测: 企业可以利用客户活动(例如登录和/或销售)的移动平均指数来确定可能的客户流失。如果客户的活动量与他们的滚动平均值相比大幅下降,他们可能会流失。
    • 生命周期价值计算: 增长总计可以应用于获取客户生命周期价值,这有助于对客户和促销策略进行分类。

最佳实践和注意事项

选择合适的窗口大小:选择能够最大限度地减少噪声影响同时保留趋势的窗口大小。薄的窗口适用于短期数据变化,而较大的窗口则最能显示长期趋势。

  • 处理缺失数据: 在应用窗口函数之前,请确保正确处理缺失数据。为了避免数据连续性中断,可以使用诸如前向或后向填充等方法。
  • 考虑数据频率: 选择与数据频率相关的窗口大小(每日数据 - 每日窗口,每周数据 - 每周窗口等)。如果不遵循并行性,结论将不正确。
  • 必要时分组数据: 对于分类数据,必须使用 group by (),这使得在所考虑的组内执行窗口函数成为可能,同时保持逻辑比较。
  • 优化性能: 始终使用高效的窗口函数。如果处理大数据,请首先使用采样或数据聚合等选项对其进行缩减。
  • 可视化结果: 您还需要绘制图表以说明值并验证窗口函数是否正在捕获正确的模式和特征。

结论

Pandas 中的这些窗口函数为计算基于时间和时间相关的聚合提供了出色的面板。它们帮助分析师和数据科学家分析他们的数据并发现模式和关系,这使得它们在金融、销售和客户分析公司中非常有用。

最后,在本文中,我们简要探讨了不同类型的窗口函数,例如滚动窗口、扩展窗口、指数移动窗口和分组窗口。我们讨论了这些函数的真实场景,并通过示例进行了说明,例如警告 Pandas 中的窗口函数将提高您的数据处理能力和决策制定。