移动窗口rolling的概念


概念:

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

在这里插入图片描述

                                      上图是10天作为窗口大小,蓝色线条是滑动窗口的均值,红色线条是原始的数据

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()处理后:

在这里插入图片描述

首先我们设置的窗口window=3,也就是3个数取一个均值。index 0,1 为NaN,是因为它们前面都不够3个数;等到index2 的时候,它的值是怎么算的呢?

index2 =(index0+index1+index2 )/ 3
index3 =( index1+index2+index3)/ 3

参数详解:

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
  • window: 也可以省略不写。表示时间窗的大小,注意有两种形式(int oroffset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。
  • min_periods:每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA。值可以是int,默认None。offset情况下,默认为1。
  • center: 把窗口的标签设置为居中。布尔型,默认False,居右
  • win_type: 窗口的类型。截取窗的各种函数。字符串类型,默认为None。各种类型
  • on: 可选参数。对于dataframe而言,指定要计算滚动窗口的列。值为列名。
  • axis: int、字符串,默认为0,即对列进行计算
  • closed: 定义区间的开闭,支持int类型的window。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left、 both等。
import pandas as pd
s = [1,2,3,5,None,10,12,14,12,30]
pd.Series(s).rolling(3,min_periods=2).mean()

在这里插入图片描述

代码:

%matplotlib inline 
import matplotlib.pylab
import numpy as np
import pandas as pd
 
import matplotlib.pyplot as plt
%matplotlib inline
 
df = pd.Series(np.random.randn(600), index = pd.date_range('7/1/2016', freq = 'D', periods = 600))
 
r = df.rolling(window = 10)
 
 
plt.figure(figsize=(15, 5))
 
df.plot(style='r--')
df.rolling(window=10).mean().plot(style='b')

在这里插入图片描述


举例:

一个简单的场景,从A向B运送东西,我们想看一下以3秒作为一个时间窗运送的量。

# A地有两个仓库,都运往B。
df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'],
                  '2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'],
                  'num': [1,2,1,3,4,2,1]}, 
                 index = [pd.Timestamp('20130101 09:00:00'),
                          pd.Timestamp('20130101 09:00:01'),
                          pd.Timestamp('20130101 09:00:02'),
                          pd.Timestamp('20130101 09:00:03'),
                          pd.Timestamp('20130101 09:00:04'),
                          pd.Timestamp('20130101 09:00:05'),
                          pd.Timestamp('20130101 09:00:06')])
#   1   2   num
# 2013-01-01 09:00:00   A1  B1  1
# 2013-01-01 09:00:01   A2  B1  2
# 2013-01-01 09:00:02   A1  B1  1
# 2013-01-01 09:00:03   A2  B1  3
# 2013-01-01 09:00:04   A2  B1  4
# 2013-01-01 09:00:05   A1  B1  2
# 2013-01-01 09:00:06   A2  B1  1
# 首先我们先对groupby进行聚合(如果只有从A->B,那么不用聚合一个rolling就可以)
# 以9:00:04秒为例,由于时间窗是3s,默认的closed是right,所以我们相加04,03,02秒的num,共有4+3+0=7
df.groupby(['1', '2'])['num'].rolling('3s').sum()
# 1   2                      
# A1  B1  2013-01-01 09:00:00    1.0
#         2013-01-01 09:00:02    2.0
#         2013-01-01 09:00:05    2.0
# A2  B1  2013-01-01 09:00:01    2.0
#         2013-01-01 09:00:03    5.0
#         2013-01-01 09:00:04    7.0
#         2013-01-01 09:00:06    5.0
# Name: num, dtype: float64

本博客转载于:https://blog.csdn.net/maymay_/article/details/80241627

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐