pandas.DataFrame.rolling的参数介绍,以及df.rolling中参数closed = “neither”的bug

 1、函数用处:

可以对series或者对dataframe进行窗口滚动计算

#官方文档参数
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, 
axis=0, closed=None, method='single')

2、部分参数:

window:移动窗口的大小

min_periods:窗口中要求具有值的最小观察次数; 否则,result 为 np.nan。当前面window的类型为整数时,min_period 将默认为窗口的大小,即window的大小

center:

如果为 False,则将窗口标签设置为窗口索引的右边缘。

如果为 True,则将窗口标签设置为窗口索引的中心。

axis:

如果是0或‘ index’,则在行间滚动

如果是1或者‘ columns’,滚过这些列

closed:

='right',则计算中将排除滚动窗口中的第一个点。

='left',则滚动窗口中的最后一个点将被排除在计算之外。

='both',则滚动窗口中的无点将被排除在计算之外。

='neither',则滚动窗口中的第一点和最后一点将被排除在计算之外。

默认为'right'

3、BUG:window=n,当设置closed=“neither”时,按道理应该是对n-1的窗口大小进行相关运算,但是从下面测试结果来看,此时滚动的窗口大小为nan

df = pd.DataFrame(data = range(10))
df.rolling(5, closed='neither').apply(lambda x:len(x))

运行的结果如下

4、BUG解决办法

 在GitHub上找到了pandas库的作者们给的回答

 简而言之就是,当close='neither'时,min_periods不等于n-1(n为窗口大小),而是等于n,作为滚动计算的对象窗口里,却至多只剩n-1个值,达不到min_periods的最小窗口值 数(n)的要求,所以:

 

输出就都是nan了

解决办法就是:手动设置min_periods=n-1

补充:当close="left", "right", "both"时,min_periods 仍然等于n,但作为滚动计算的对象窗口里,分别至多剩 n/n/n+1 个值,可以有数据窗口达到min_periods的最小窗口值 数(n)的要求,有兴趣可以做个简单测试~

函数官方文档:pandas.DataFrame.rolling — pandas 1.4.2 documentation

GitHub作者回答:BUG: Setting closed='neither' for rolling function of Series leads to mean() producing nan values · Issue #39038 · pandas-dev/pandas · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值