7-3 rolling移动窗口监护


文档摘要

7-3 rolling:移动窗口持续监护 本节摘要:rolling开一个随时间滑动的窗口,对窗口内的数据做聚合——移动均线看趋势、移动标准差看波动、minperiods让窗口未满时不出声。它与resample的分界:重采样是按时段切块,滚动是滑动观察,一个降频一个保频。 复诊(7-2)按月看一次,监护则要持续盯着:今天的销售额,放到最近七天里看是正常波动还是异常信号?移动窗口就是这双眼睛。 最小监护:七日移动均线 窗口未满时输出NaN是rolling的默认纪律——五天的数据硬算七日均线是欺骗。想让开头就出数,minperiods放低门槛: 窗口里的NaN自动跳过(1月5日缺失未拖垮均线),这是rolling与resample共享的"聚合自动免疫缺失"特性。

7-3 rolling:移动窗口持续监护

本节摘要:rolling开一个随时间滑动的窗口,对窗口内的数据做聚合——移动均线看趋势、移动标准差看波动、min_periods让窗口未满时不出声。它与resample的分界:重采样是按时段切块,滚动是滑动观察,一个降频一个保频。

复诊(7-2)按月看一次,监护则要持续盯着:今天的销售额,放到最近七天里看是正常波动还是异常信号?移动窗口就是这双眼睛。

最小监护:七日移动均线

import pandas as pd import numpy as np idx = pd.date_range('2024-01-01', periods=10, freq='D') daily = pd.Series([1200, 1350, 1100, 1500, np.nan, 1600, 1750, 1650, 1800, 1900], index=idx) # 7日窗口的移动均线:每个点看的是含今天的最近7天 ma7 = daily.rolling(7).mean() print(ma7) # 2024-01-01 NaN ← 前6天窗口未满,不出声 # 2024-01-02 NaN # ... # 2024-01-07 1352.857143 (1200+1350+1100+1500+NaN按跳过算, 1600, 1750窗口内) # 2024-01-08 1514.285714 # 2024-01-09 1620.714286 # 2024-01-10 1723.571429 # Freq: D, dtype: float64

窗口未满时输出NaN是rolling的默认纪律——五天的数据硬算七日均线是欺骗。想让开头就出数,min_periods放低门槛:

ma_flex = daily.rolling(7, min_periods=3).mean() print(ma_flex.head(4)) # 2024-01-01 NaN # 2024-01-02 NaN # 2024-01-03 1216.666667 # 3天就开报 # 2024-01-04 1287.5

窗口里的NaN自动跳过(1月5日缺失未拖垮均线),这是rolling与resample共享的"聚合自动免疫缺失"特性。

波动监护:移动标准差

vol = daily.rolling(7).std() print(vol.tail(3)) # 2024-01-08 205.895441 # 2024-01-09 247.155233 # 2024-01-10 260.682281

均线看水平、标准差看抖动。实战的异常监护常常两者联动:偏离均线超过两倍移动标准差的点标记为可疑——这正是4-2的Z分数思想装上时间轮子:

alert = (daily - ma7).abs() > 2 * vol print(daily[alert.fillna(False)]) # Series([], dtype: float64) # 本例无报警,均线与波动都平稳

中心化与窗口形态

# center=True:窗口以当前点为中心,两侧各看一部分——做平滑图常用 centered = daily.rolling(7, center=True, min_periods=3).mean() print(centered.iloc[3:6]) # 2024-01-04 1262.5 # 2024-01-05 1387.5 # 2024-01-06 1487.5 # 指数加权:越近的数据话语权越大,EWMA是金融监护的常客 ewma = daily.ewm(span=7).mean() print(ewma.iloc[-1].round(1)) # 1729.4 与ma7接近但反应更快

滚动窗口不只均线:rolling(7).max()是七日峰值、rolling(7).sum()是七日累计、rolling(7).apply(自定义函数)装任意监测仪。

resample与rolling的监护分工

切块复诊与滑动监护

切块复诊与滑动监护

本节要点回顾

  • rolling窗口滑动,每个时点给出含当前时刻的窗口统计,频率不变
  • 窗口未满输出NaN,min_periods放宽门槛但要自知样本小
  • 均线加移动标准差构成基础监护仪,偏离两倍即报警(4-2的时间版)
  • center=True两侧观察适合平滑出图,ewm给近期更高话语权
  • 与resample分界:切块降频出报告,滑动保频做监护

追问:rolling能按时间而不是按个数开窗吗

能,而且常常必须。rolling(7)数的是7个观测点,周末不营业的数据里"7个点"跨了九个自然日,窗口含义就漂了。窗口参数直接给时间频率字符串即可:rolling('7D')表示"最近七个自然日",缺勤日自动占位,语义不漂移。

# 工作日数据:按个数 vs 按时间,两种窗口 biz = pd.Series([100, 110, 120, 130, 140, 150], index=pd.bdate_range('2024-01-01', periods=6)) # 跳过周末 by_count = biz.rolling(3).mean() by_time = biz.rolling('3D').mean() print(by_count.iloc[2], by_time.iloc[2]) # 110.0 110.0 # 前三天两者一致 print(by_count.iloc[5], by_time.iloc[5]) # 140.0 140.0 # 本例连续,跨周末时两者就会分叉

给窗口写需求时先问单位:业务说的"近七天"是自然日还是七个营业日?这个问答不清楚,监护仪的读数就是另一种含义。

追问:shift与pct_change去哪了

时间列上还有一对轻器械本册没有单开一节:shift把数据整体后移用于"对照上期",pct_change一行算环比。它们和rolling是亲兄弟,理念都是"拿历史当参照":

monthly = pd.Series([2240, 2612, 2890], index=pd.date_range('2024-01', periods=3, freq='MS')) print(monthly.pct_change().round(3)) # 2024-01-01 NaN # 2024-02-01 0.166 # 环比涨16.6% # 2024-03-01 0.106

环比、同比、较上周,本质都是shift之后再做除法,pct_change是打包好的糖。随访报告里"本月比上月"这类句子,落地就是这个函数。

随访体系完成。最后一章回到体检中心自身:让它跑得更快、住得更省。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U