【Python】移动窗口rolling的概念
pandas ---- 移动窗口rolling的概念概念:为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。上图是10天作为窗口大小,蓝色线条是滑动窗口的均值,红色线条是原始的数据import pandas as pds = [1,2,3,5,
·
移动窗口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
更多推荐
已为社区贡献8条内容
所有评论(0)