看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
.rolling()函数又叫移动窗口函数,此函数可以应用于一系列数据,指定参数window=n,并在其上调用适合的统计函数。
创建 Rolling 对象后,可以对对象进行计算操作。
s = pd.Series(np.random.randn(1000),
index=pd.date_range('1/1/2000', periods=1000))
s = s.cumsum()
r = s.rolling(window=60)
r
# Rolling [window=60,center=False,axis=0]
我们可以看看 Rolling 支持的统计方法:
r.<TAB> # noqa: E225, E999
r.agg r.apply r.count r.exclusions r.max r.median r.name r.skew r.sum
r.aggregate r.corr r.cov r.kurt r.mean r.min r.quantile r.std r.var
在.rolling()
创建对象时,它支持以下参数:
参数 | 说明 |
---|---|
window | 可选参数,表示时间窗的大小,注意有两种形式(int 或 offset)。如果使用 int,则数值表示计算统计量的观测值的数量即向前几个数据,如果是offset类型,表示时间窗的大小。 |
min_periods | 每个窗口最少包含的观测值数量,小于这个值的窗口结果为NaN,值可以是int,默认None,offset情况下,默认为1。 |
center | 把窗口的标签设置为居中。布尔型,默认False,居右 |
win_type | 窗口的类型,截取窗的各种函数,字符串类型,默认为None。 |
on | 可选参数,对于dataframe而言,指定要计算滚动窗口的列,值为列名。 |
axis | int、字符串,默认为0,即对列进行计算 |
closed | 定义区间的开闭,支持int类型的window。对于offset类型默认是左开右闭,默认为right,可以根据情况指定为left、both等。 |
method | 对单个列或行(“单个”)或整个对象(“表”)执行滚动操作。此参数仅在方法调用中指定 engine='numba' 时实现。 {‘single’, ‘table’}, 默认 ‘single’, 1.3.0+ |
将win_type 传递给.rolling 会生成一个通用的滚动窗口计算,该计算将根据 win_type进行加权。
win_type 参数支持以下类型:
如:
ser.rolling(window=5, win_type='triang').mean()
ser.rolling(window=5, win_type='gaussian').mean(std=0.1)
# 以下相同
ser.rolling(window=5, win_type='boxcar').mean()
ser.rolling(window=5).mean()
我们可以使用上边的统计方法对窗口进行计算:
r.mean()
s.plot(style='k--') # 绘图看一下变化,原数据
r.mean().plot(style='k') # 绘图看一下变化,计算后的
它们也可以应用于DataFrame对象。 这实际上只是将移动窗口运算符应用于DataFrame 的所有列的语法糖:
df = pd.DataFrame(np.random.randn(1000, 4),
index=pd.date_range('1/1/2000', periods=1000),
columns=['A', 'B', 'C', 'D'])
df = df.cumsum()
# 操作并绘图
df.rolling(window=60).sum().plot(subplots=True)
提供许多常见的统计功能:
Method | Description |
---|---|
count() | Number of non-null observations |
sum() | Sum of values |
mean() | Mean of values |
median() | Arithmetic median of values |
min() | Minimum |
max() | Maximum |
std() | Bessel-corrected sample standard deviation |
var() | Unbiased variance |
skew() | Sample skewness (3rd moment) |
kurt() | Sample kurtosis (4th moment) |
quantile() | Sample quantile (value at %) |
apply() | Generic apply |
cov() | Unbiased covariance (binary) |
corr() | Correlation (binary) |
apply() 函数接受一个额外的 func 参数,并执行通用滚动计算。 func 参数应该是一个从 ndarray 输入生成单个值的函数。 假设我们要滚动计算平均绝对偏差:
def mad(x):
return np.fabs(x - x.mean()).mean()
s.rolling(window=60).apply(mad, raw=True).plot(style='k')
pandas 1.4+ 版本支持窗口内的排序,它给给每个数据给出它在窗口中的序号,还可以指定序号赋于的方法:
s = pd.Series([1, 4, 2, 3, 5, 3])
s.rolling(3).rank()
'''
0 NaN
1 NaN
2 2.0
3 2.0
4 3.0
5 1.5
dtype: float64
'''
s.rolling(3).rank(method="max")
'''
0 NaN
1 NaN
2 2.0
3 2.0
4 3.0
5 2.0
dtype: float64
'''
由于 Rolling.apply 无法对非数字进行函数操作,我们可以自行实现相关方法让它支持字符串。案例如下:
import pandas as pd
import string
class MyDataFrame(pd.DataFrame):
@property
def _constructor(self):
return MyDataFrame
def rolling_object(self, window, column, default):
return pd.concat(
[self[column].shift(i) for i in range(window)],
axis=1).fillna(default).T
接下来使用自定义的数据类型操作:
df = MyDataFrame({'col': [*string.ascii_lowercase[:10]]})
df
'''
col
0 a
1 b
2 c
3 d
4 e
5 f
6 g
7 h
8 i
9 j
'''
df.rolling_object(4, 'col', '-').apply(' '.join)
'''
0 a - - -
1 b a - -
2 c b a -
3 d c b a
4 e d c b
5 f e d c
6 g f e d
7 h g f e
8 i h g f
9 j i h g
dtype: object
'''
更新时间:2022-05-20 17:27:02 标签:pandas 移动窗口