40. Pandas的时间序列-滑动窗口
什么是滑动(移动)窗口?为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。例如想使用2011年1月1日的一个数据,单取这个时间点的数据当然是可行的,但是太过绝对,有没有更好的办法呢?可以选取2010年12月16日到2011年1月15日,通过求均值来评估1月1日这个点的值,2010-12-16到2011-1-15就是一个窗口,窗口的长度window=30. 移动窗口就是窗口向一端滑行,每次滑动(行)并不是区间整块的滑行,而是一个单位一个单位的滑行。例如窗口2010-12-16到2011-1-15,下一个窗口并不是2011-1-15到2011-2-15,而是2010-12-17到2011-1-16(假设数据的截取是以天为单位),整体向右移动一个单位,而不是一个窗口。这样统计的每个值始终都是30单位的均值。 窗口中的值从覆盖整个窗口的位置开始产生,在此之前即为NaN,举例如下:窗口大小为10,前9个都不足够为一个一个窗口的长度,因此都无法取值。
pandas里常用的滑动窗口函数有:
函数名 | 函数功能 |
---|---|
rolling_count(arg, window[, freq, center, how]) | Rolling count of number of non-NaN observations inside provided window. |
rolling_sum(arg, window[, min_periods, ...]) | Moving sum. |
rolling_mean(arg, window[, min_periods, ...]) | Moving mean. |
rolling_median(arg, window[, min_periods, ...]) | O(N log(window)) implementation using skip list |
rolling_var(arg, window[, min_periods, ...]) | Numerically stable implementation using Welford’s method. |
rolling_std(arg, window[, min_periods, ...]) | Moving standard deviation. |
rolling_min(arg, window[, min_periods, ...]) | Moving min of 1d array of dtype=float64 along axis=0 ignoring NaNs. |
rolling_max(arg, window[, min_periods, ...]) | Moving max of 1d array of dtype=float64 along axis=0 ignoring NaNs. |
rolling_corr(arg1[, arg2, window, ...]) | Moving sample correlation. |
rolling_corr_pairwise(df1[, df2, window, ...]) | Deprecated. |
rolling_cov(arg1[, arg2, window, ...]) | Unbiased moving covariance. |
rolling_skew(arg, window[, min_periods, ...]) | Unbiased moving skewness. |
rolling_kurt(arg, window[, min_periods, ...]) | Unbiased moving kurtosis. |
rolling_apply(arg, window, func[, ...]) | Generic moving function application. |
rolling_quantile(arg, window, quantile[, ...]) | Moving quantile. |
rolling_window(arg[, window, win_type, ...]) | Applies a moving window of type window_type and size window on the data. |
下面以求滑动窗口均值为例给出一个滑动窗口应用程序,如下所示:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
v = np.random.randn(20)
tx = pd.Series(v)
tx.index = pd.date_range('2018-12-01', periods = 20, freq = "d")
#print "tx", "-" * 20, "\n", tx
rm = tx.rolling(window = 5, center = False).mean()
rm.plot()
tx.plot()
plt.show()
程序执行结果:
可视图中绿色设tx,蓝色则是rm即滑动窗口处理后均值的可视化输出。
感谢Klang(金浪)智能数据看板klang.org.cn鼎力支持!