首页电脑使用python滑动窗口 pandas滑动窗口

python滑动窗口 pandas滑动窗口

圆圆2025-10-26 13:01:16次浏览条评论

解决Pandas滑动平均边缘效应:min_periods与center参数详解

使用 Pandas 计算移动平均值时,默认行为会在数据序列的两端生成 nan 值,导致结果滞后。本文将深入讨论这个常见问题,并提供优雅的解决方案。smooth 是移动平均函数的效果,即窗口在数据两端自动扩大或收缩,从而消除 nan 值和滞后现象,确保时间序列分析的完整性和准确性。Pandas 滑动平均默认行为及挑战

在时间序列分析中,移动平均值(Moving Average)是一种常用的平滑技术,可以消除噪声并揭示数据趋势。Pandas 库通过 rolling() 方法提供了强大的滑动窗口功能。例如,下面的代码可以计算9个样本的移动平均值: import pandas as pd import numpy as np #创建示例 Seriesdata = pd.Series(np.arange(20) np.random.randn(20) * 2) df = pd.DataFrame({'signal': data}) #df['signal_rolling_default'] = df['signal'].rolling(window=9).mean() print(quot;default rolling average result (前10行):\nquot;, df[['signal', 'signal_rolling_default']].head(10)) 电影后名生

运行上面的代码,会发现 signal_rolling_default列的全在天天值是NaN。 这是因为默认情况下,rolling()方法采用“右对齐”窗口,而要求是窗口内部必须有足够多的数据点(也就是窗口指定的参数)才能进行计算。对于window=9的情况,这意味着前8个数据点无法组成完整的9个样本窗口,因此结果为NaN。

因此,这种默认的右对齐窗口也会导致一个问题:移动平均结果相比原始信号有所延迟。由于平均值是基于当前点及其之前的8个点计算的,因此这个平均值实际上代表的是窗口的“右边缘”位置,而不是窗口的“中心”位置。当需要直接将平滑结果与原始信号进行比较时,这会引入视觉偏差。边缘效应:NaN值和滞后问题

这种数据序列两端都出现NaN值和滞后结果的现象,我们称之为“边缘效应”。在很多实际应用中,这是一个痛点,尤其是在数据量较小或需要对整个序列进行无缝平滑处理的情况下。例如,在MATLAB中,smooth(signal, 9, 'moving')函数可以很好地处理这些边缘情况。它会让滑动窗口从数据序列开始时的1个样本逐渐增加,直到达到设定的窗口大小(例如9);在数据序列结束时,窗口会相应地逐渐缩小。这种机制确保整个序列具有平滑的值,并且不会出现NaN,同时通过中心对齐消除滞后。解决方案:min_periods和center参数

Pandas rolling()方法提供了min_periods和center两个关键参数,可以完美解决上述边缘效应问题,并实现类似于MATLAB中smooth函数的行为。min_periods=1的电影

min_periods参数指定需要计算的最小观测值个数。

默认情况下,min_periods 等于窗口的大小。当我们将其设置为 1 时,表示即使窗口中只有 1 个数据点,也可以进行计算。窗口将从 1 个样本开始计算,然后是 2、3,直到达到窗口指定的大小。这样,前几个数据点就不会产生 NaN。在数据序列的末尾:当没有足够的数据点来填满整个窗口时,窗口会自动缩小,同样避免了 NaN 的影响。center=True

center 参数为单值,默认为 False。当 center=False 时,窗口右对齐,即将滑动平均值赋值到窗口的右边缘(最新的数据点)。当 center=True 时,滑动平均值将被赋值到窗口的中心位置。消除滞后:通过将平均值与窗口中心点对齐,center=True有效消除了窗口默认右对齐带来的滞后现象,使得平滑后的信号与原始信号在时间轴上保持一致。

练习示例

下面我们用一个具体的例子来演示如何使用 min_periods=1 和 center=True 来优化滑动平均: import pandas as pd import numpy as np # 创建示例 Seriesdata = pd.Series(np.arange(20) np.random.randn(20) * 2) df = pd.DataFrame({'signal': data}) # 默认滑动平均 (右对齐,min_periods=window) df['rolling_default'] = df['signal'].rolling(window=9).mean() # 优化滑动平均 (中心对齐,min_periods=1) df['signal'].rolling(window=9,min_periods=1,center=True).mean() print(quot;------------------------------------------------quot;) print(quot;原始信号、默认滚动平均和优化滑动平均对比(前10行):\nquot;)print(df[['signal', 'rolling_default', 'rolling_optimized']].head(10))print(quot;\n--------------------------------------------------quot;)print(quot;原始信号、默认滑动平均 vs 优化滑动平均对比 (后10行):\nquot;)print(df[['signal', 'rolling_default','rolling_optimized']].tail(10)) 复制后登录

样例输出(部分):------------------------------------------------ (前10行): signal rolling_default rolling_optimized0 0.342127 NaN 0.3421271 1.801083 NaN 1.0716052 3.468202 NaN 1.8704713 3.743538 NaN 2.3387384 6.439739 南 3.1596785 5.760228 南 3.8691526 7.464947 南 4.6200237 7.599909 南 5.2399728 9.932698 5.170941 5.9436099 10.559385

6.417215 6.790408-​​------------------------------------------ 原始信号、默认滑动平均和优化滑动平均对比(后10行): signal rolling_default rolling_optimized10 9.076046 7.708949 7.70894911 11.458925 8.80459512 11.583094 9.531776 9.53177613 13.439498 10.158869 10.15886914 15.548480 11.238686 11.23868615 15.228532 12.316223 12.31622316 16.486289 13.570772 13.57077217 17.075929 14.755075 14.75507518 19.534298 15.939226 15.93922619 18.064560 16.497200 16.497200 复制后登录

从输出结果可以看到,rolling_default列 从第8行开始都是NaN,而rolling_optimized列 从第一行开始就有有效值,并且没有NaN。这充分体现了min_periods=1和center=True的强大效果。关键考虑和最佳实践是没有NaN和没有滞后:使用min_periods=1和center=True是处理移动平均边缘效应的最佳实践。它消除了NaN值,使平滑结果在时间轴上与原始数据对齐,这对于数据可视化和后续分析非常重要。边缘精度:需要注意的是,在数据序列的两端,由于窗口尚未达到满窗口大小,这些点的平均值是基于较少的数据点计算的。这意味着边缘处的平滑结果可能不如中间部分那么“平滑”或“准确”(因为它们没有充分利用到设定的窗口大小),但这通常是可以接受的权衡,因为它避免了NaN值和滞后。适用场景:此方法尤其适用于需要对整个时间序列进行无缝平滑处理,并且需要对数据点的边缘进行可视化或分析的场景。总结

Pandas的rolling()方法是计算滑动窗口的强大工具。通过理解并灵活运用min_periods和center这两个参数,我们可以克服默认的滑动问题。在数据两端之间移动平均值产生的NaN值和滞后问题。将min_periods设置为1,允许在数据不足时进行窗口计算,从而消除NaN;将Center设置为True,使平均值与窗口中心对齐,从而消除滞后。

以上就是Pandas滑动平均边缘效应的解决:min_periods和center参数详细内容,更多请关注乐哥常识网相关文章!应对大规模PDF提取标题:PyMuPDF与机器学习的局限性以及专业OCR工具python3的优势如何创建新项目

解决Pandas滑动
vscode状态栏不见了 vscode活动栏不见了
相关内容
发表评论

游客 回复需填写必要信息