11.7 移动窗口函数

为了处理数字数据,Pandas提供了几个变体,如滚动,展开和指数移动窗口统计的权重。 其中包括总和,均值,中位数,方差,协方差,相关性等;
所谓窗口,就是将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断;
移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行;
窗口函数主要用于通过平滑曲线来以图形方式查找数据内的趋势。如果日常数据中有很多变化,并且有很多数据点可用,那么采样和绘图就是一种方法,应用窗口计算并在结果上绘制图形是另一种方法。 通过这些方法,可以平滑曲线或趋势。

统计和其他通过移动窗口或指数衰减而运行的函数是用于时间序列操作的数组变换的一个重要类别。这对平滑噪声或粗糙的数据非常有用。称这些函数为移动窗口函数,它包含了一些没有固定长度窗口的函数,比如指数加权移动平均。与其他的统计函数类似,这些函数会自动排除缺失数据。

close_px_all = pd.read_csv('stock_px_2.csv',sep='\t',parse_dates=True,index_col=0)
close_px = close_px_all[['AAPL', 'MSFT', 'XOM']]
close_px = close_px.resample('B').ffill()   # 先载入一些数据序列数据并按照工作日的频率进行重新采样。

然后就是rolling 算子,它的行为于resample and groupby类似。可以在series or dataframe 上通过一个window(以一个区间的数字来表示)进行调用。
在这里插入图片描述
这个就是苹果股价及250日的MA(移动平均线,,就是把某段时间的股价加以平均,再依据这个平均值作出平均线图像)

rolling(250) 与groupby 的行为类似,但是他创建的对象是根据250 日滑动窗口分组而不是直接分组(啊。。这。。)。因此这里是股票价格的250日移动窗口平均值。

默认情况下,滚动函数需要窗口中所有的值都是非NA值,由于存在缺失值这种行为会发生改变,尤其是时间序列的起始位置你有用的数据是少于窗口区间的。

appl_std250 = close_px.AAPL.rolling(250, min_periods=10).std()
appl_std250[5:12]
2003-01-09         NaN
2003-01-10         NaN
2003-01-13         NaN
2003-01-14         NaN
2003-01-15    0.077496
2003-01-16    0.074760
2003-01-17    0.112368
Freq: B, Name: AAPL, dtype: float64

DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)

感觉整个人都傻了。。。。脑补链接 我语文不好,表达不清,看不懂的还是去看原来的文章吧。。。。

window:表示时间窗的大小,通常为int(也可以是offset),数值表示计算统计量的观测值的数量即向前几个数据。就像上面那个rolling(250).mean() 产生的数据,就是原数据250个数据的平均值,所以前249个都是NAN(向前扩展嘛),

min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。若调整,则一般小于window值。那个rolling(250, min_periods=10)现在最小的组是10,也就是对于那些nan,如果源数据有10个,就可以。。。所以现在只有9个nan.

freq:从0.18版本中已经被舍弃。

center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。感觉就是向前推进一个,最后一个是nan。

win_type:默认为None,一般不特殊指定

on:对于多列FrameData,用on来指定使用哪列(举例data.test,已经指定了)

closed:定义区间的开闭,即默认为right

axis:0–行,1—列

为了计算扩展窗口的均值,使用expanding算子,而不是rolling 。扩展均值从时间序列的起始位置开始时间窗口,并增加窗口的大小,直到涵盖整个序列,

expanding()函数的参数,与rolling()函数的参数用法相同;DataFrame.expanding(min_periods = 1,center = False,axis = 0)

就是rolling 的阉割版。。。只设置最小的观测值数量,类似cumsum()函数的累计求和,其优势在于还可以进行更多的聚类计算

expanding_mean = appl_std250.expanding().mean()      # apple_std250 的扩展均值窗口

在dataframe上调用一个移动窗口函数会将变换应用到每一行上。这个股票60日MA( Y 轴去对数)
在这里插入图片描述

rolling 函数也接受表示固定大小的时间偏置字符串,而不只是一个区间的集合数字。对不规则时间序列使用注释非常有用。这些字符串可以传递给resample。例如我们可以像这样计算20天的滚动平均值。

close_px.rolling('20D').mean()
AAPL	MSFT	XOM
2003-01-02	7.400000	21.110000	29.220000
2003-01-03	7.425000	21.125000	29.230000
2003-01-06	7.433333	21.256667	29.473333
2003-01-07	7.432500	21.425000	29.342500
2003-01-08	7.402000	21.402000	29.240000
...	...	...	...
2011-10-10	389.351429	25.602143	72.527857
2011-10-11	388.505000	25.674286	72.835000
2011-10-12	388.531429	25.810000	73.400714
2011-10-13	388.826429	25.961429	73.905000
2011-10-14	391.038000	26.048667	74.185333
2292 rows × 3 columns

11.7.1 指数加权函数

指定一个常数衰减因子以向更多近期观测值提供更多权重,可以替代使用具有相等加权观测值的静态窗口尺寸的方法。有多种方式可以指定衰减因子。例如span(跨度),这使得结果与窗口大小等于跨度的简单移动窗口函数。

由于指数加权统计值给更近期的观测值以更多的权重,与等权重的版本相比,他对变化适应的更快。(说人话好吗。。)

pandas拥有ewm ,通rolling expanding 一起使用。。
在这里插入图片描述
脑补连接
在这里插入图片描述

11.7.2 二元移动窗口函数

一些方法,例如相关度和协方差,需要操作两个时间序列。

spx_px = close_px_all['SPX']
spx_rets = spx_px.pct_change()
returns = close_px.pct_change()    # 获得百分比变换

# 调用rolling后,corr聚合函数可以根据spx_rets计算滚动相关性。
corr = returns.AAPL.rolling(125, min_periods=100).corr(spx_rets)
corr.plot()

在这里插入图片描述
苹果公司与标普500的6个月的收益相关性。。。(这6个月是怎么出来的???)

如果你想一次性计算多只股票与标普500的相关性。编写循环然后放到ig新的dataframe里,但是麻烦。如果你传递的是一个series or dataframe ,像corr这样的函数会计算sereis 与dataframe的每一列的相关性。
在这里插入图片描述
这是多只股票与标普500的六个月收益相关性。

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

就是在rolling的基础上使用apply 方法。唯一的要求是该函数从每个数组中产生一个单值。这个percentileofscore是获得岩本中特定值的百分位数。
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐