Pandas —— 移动窗口函数

本文介绍了Pandas中用于数据分析的移动窗口函数,包括移动窗口的概念、简单的移动窗口操作如rolling()及其聚合函数,指数加权移动窗口ewm(),二元移动窗口计算相关性,以及如何使用apply()实现自定义的移动窗口函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动窗口概念引入

为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。

举例:

import pandas as pd
s = [1,2,3,5,6,10,12,14,12,30]
pd.Series(s).rolling(window=3).mean()

此时的pd.Series(s)
这里写图片描述

此时的pd.Series(s).rolling(window=3).mean()

如:index2=(index0+index1+index2 )/3
这里写图片描述


简单的移动窗口函数

  • rolling(),参数window指定窗口的大小,参数min_periods指定最小的观察数值个数
  • rolling()后,可以接mean、count、sum、median、std等聚合函数,相当于rolling_mean()、rolling_count()、rolling_sum()、rolling_median()、rolling_std()
close_px['AAPL'].plot(figsize=(10,3))
close_px['AAPL'].rolling(window=250).mean().plot()#方法1
close_px['AAPL'].rolling_mean().(window=250).plot()#方法2

这里写图片描述


指数加权的移动窗口函数

  • yt+1^=αyt+(1α)yt^Nyt+1^=αyt+(1−α)yt^N,其中yt^yt^表示t时刻指数加权的预测值,ytyt表示t时刻的观测值,αα是平滑常数。
  • 指数加权函数会赋予近期的观测值更大的权数,因此,它能适应更快的变化
  • ewm(),若根据跨度指定衰减,即α=2span+1α=2span+1,则需要指定参数spanspan;若根据质心指定衰减,即α=1com+1α=1com+1,则需要指定参数comcom;若根据半衰期指定衰减,即α=1explog(0.5)halflife, for halflife>0α=1−explog(0.5)halflife, for halflife>0,则需要指定参数halflifehalflife
  • ewm()后,可以接mean、corr、std等聚合函数,相当于ewma()、ewmcorr()、ewmstd(),但count、sum等聚合函数没有对应的特定函数
  • -
aapl_px = close_px.AAPL['2005':'2009']
aapl_px.ewm(span=60).mean().plot() # 方法1
aapl_px.ewm_mean(span=60).plot() # 方法2

这里写图片描述


二元移动窗口函数

一些统计计算符,比如相关性和协方差,需要在两个时间序列上进行计算。例如,经济分析通常喜欢比较一只股票与基础指数标普500之间的相关性。我们先计算一下时间序列的百分比变化:

spx_px = close_px_all['SPX']
spx_rets = spx_px.pct_change()  # 相邻两数百分比
returns = close_px.pct_change()

在我们调用rolling后,corr聚合函数会去计算spx_rets的滚动相关性(rolling correlation)

corr = returns.AAPL.rolling(125, min_periods=100).corr(spx_rets)
corr.plot(figsize=(15, 8))

这里写图片描述


用户自定义的移动窗口函数

  • 通过rolling().apply()方法,可以在移动窗口上使用自己定义的函数。唯一需要满足的是,在数组的每一个片段上,函数必须产生单个值。
from scipy.stats import percentileofscore
score_at_2percent = lambda x: percentileofscore(x, 0.02)
result = returns.AAPL.rolling(250).apply(score_at_2percent)
result.plot(figsize=(15, 8))

这里写图片描述

### Pandas 开窗函数的基础概念 Pandas 的开窗函数是一种强大的工具,用于基于滑动窗口的数据操作。它允许用户定义一个固定大小的窗口,在该窗口上执行聚合或其他自定义运算[^1]。 #### 基本语法结构 `DataFrame.rolling(window)` 是实现滚动窗口的核心方法之一。通过指定 `window` 参数可以设置窗口大小,并结合 `.sum()`、`.mean()` 或其他聚合函数完成具体计算[^2]。 --- ### 使用案例解析 以下是几个具体的例子展示如何利用 Pandas 的开窗函数: #### 示例一:基本滚动平均值 下面是一个简单的时间序列数据集,演示了如何使用 `rolling` 方法计算每三个数值的移动平均值[^3]。 ```python import pandas as pd import numpy as np df = pd.DataFrame(np.arange(32).reshape(8, 4), index=pd.date_range('12/1/2020', periods=8), columns=['A', 'B', 'C', 'D']) print("原始数据:") print(df) # 计算每3个数的均值 result = df.rolling(window=3).mean() print("\n每3个数的均值:") print(result) ``` 上述代码展示了如何创建一个 DataFrame 并应用滚动窗口来计算连续三行的平均值。注意,前两行由于未达到窗口长度而返回 NaN 值。 --- #### 示例二:带参数调整的复杂场景 如果希望进一步定制化功能,则可以通过传递额外参数给 `apply` 函数来自定义逻辑。例如,以下代码实现了对两个相邻元素求和并除以 100 的操作: ```python import pandas as pd import numpy as np index = pd.date_range('2019-01-01', periods=10) data = pd.DataFrame(np.arange(len(index)), index=index, columns=['test']) data["use_app"] = data.rolling(2, min_periods=1)["test"].apply( lambda x: sum(x) / 100, raw=False ) print(data) ``` 这里的关键在于设置了最小周期数目为 1 (`min_periods=1`) 来确保即使不足两个样本也能正常运行;同时借助匿名函数完成了特定业务需求下的转换过程。 --- ### 性能优化建议 当面对大规模数据集时,为了提高效率可考虑如下几点: 1. **减少不必要的列参与运算** —— 只选取真正需要用到的部分字段; 2. **合理设定 window 和 min_periods 参数** —— 避免过宽范围增加负担; 3. **优先选用内置向量化方法而非 apply() 调用外部 Python 函数** —— 后者通常较慢因为无法充分利用底层 C 实现的优势。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值