One - One Code All

Blog Content

pandas的移动窗口函数rolling

Python 统计学-科学计算   2014-05-08 22:47:24

先举例:

df.rolling(3, min_periods=1).sum()

df.rolling(3, min_periods=1).mean()


在建模过程中,我们常常需要需要对有时间关系的数据进行整理。比如我们想要得到某一时刻过去30分钟的销量(产量,速度,消耗量等),传统方法复杂消耗资源较多,pandas提供的rolling使用简单,速度较快。


函数原型和参数说明

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


window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里。


min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。


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


center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。



# 为方便观察,并列排列


df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})

df.rolling(3, min_periods=1).sum()

df.rolling(3, min_periods=1, center=True).sum()

    B    B1   B2

0   0.0  0.0  1.0

1   1.0  1.0  3.0

2   2.0  3.0  3.0

3   NaN  3.0  6.0

4   4.0  6.0  4.0


win_type:窗口类型,默认为None一般不特殊指定,了解支持的其他窗口类型,参考这里。


on:对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。


closed:定义区间的开闭,曾经支持int类型的window,新版本已经不支持了。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left both等。


axis:方向(轴),一般都是0。


举例


一个简单的场景,从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


使用rolling进行计算


# 首先我们先对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


由于使用groupby,所以最后的结果是MultiIndex,想使用正常格式在DataFrame上使用reset_index()即可。


它都是以rolling打头的函数,后接具体的函数,来显示该移动窗口函数的功能。...



最近经常使用移动窗口函数,觉得很方便,功能强大,代码简单,故将pandas中的移动窗口函数都做介绍。它都是以rolling打头的函数,后接具体的函数,来显示该移动窗口函数的功能。


rolling_count 计算各个窗口中非NA观测值的数量

函数


pandas.rolling_count(arg, window, freq=None, center=False, how=None)


arg : DataFrame 或 numpy的ndarray 数组格式 

window : 指移动窗口的大小,为整数 

freq : 

center : 布尔型,默认为False, 指取中间的 

how : 字符串,默认为“mean”,为down- 或re-sampling


import pandas as pd

import numpy as np

df = pd.DataFrame({'key1':['a','a','b','b','a'],

               'key2':['one','two','one','two','one'],

               'data1':np.nan,

               'data2':np.random.randn(5)})



pd.rolling_count(df[['data1','data2']],window = 3)


rolling_sum 移动窗口的和

pandas.rolling_sum(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)


arg : 为Series或DataFrame 

window : 窗口的大小 

min_periods : 最小的观察数值个数 

freq : 

center : 布尔型,默认为False, 指取中间的 

how : 取值的方式,默认为None


pd.rolling_sum(df,window = 2,min_periods = 1)


rolling_mean 移动窗口的均值

pandas.rolling_mean(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)


rolling_median 移动窗口的中位数

pandas.rolling_median(arg, window, min_periods=None, freq=None, center=False, how='median', **kwargs)


rolling_var 移动窗口的方差

pandas.rolling_var(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)


rolling_std 移动窗口的标准差

pandas.rolling_std(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)


rolling_min 移动窗口的最小值

pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs)


rolling_max 移动窗口的最大值

pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs)


rolling_corr 移动窗口的相关系数

pandas.rolling_corr(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None)


rolling_corr_pairwise 配对数据的相关系数

等价于: rolling_corr(…, pairwise=True)


pandas.rolling_corr_pairwise(df1, df2=None, window=None, min_periods=None, freq=None, center=False)


rolling_cov 移动窗口的协方差

pandas.rolling_cov(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None, ddof=1)


rolling_skew 移动窗口的偏度(三阶矩)

pandas.rolling_skew(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)


rolling_kurt 移动窗口的峰度(四阶矩)

pandas.rolling_kurt(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)


rolling_apply 对移动窗口应用普通数组函数

pandas.rolling_apply(arg, window, func, min_periods=None, freq=None, center=False, args=(), kwargs={})


rolling_quantile 移动窗口分位数函数

pandas.rolling_quantile(arg, window, quantile, min_periods=None, freq=None, center=False)


rolling_window 移动窗口

pandas.rolling_window(arg, window=None, win_type=None, min_periods=None, freq=None, center=False, mean=True, axis=0, how=None, **kwargs)


ewma 指数加权移动

ewma(arg[, com, span, halflife, ...])


ewmstd 指数加权移动标准差

ewmstd(arg[, com, span, halflife, ...])


ewmvar 指数加权移动方差

ewmvar(arg[, com, span, halflife, ...])


ewmcorr 指数加权移动相关系数

ewmcorr(arg1[, arg2, com, span, halflife, ...])


ewmcov 指数加权移动协方差

ewmcov(arg1[, arg2, com, span, halflife, ...])



上一篇:lxml初步使用获取href链接和文本
下一篇:docker挂载本地目录

The minute you think of giving up, think of the reason why you held on so long.