Python数据分析_Pandas_窗函数

窗函数(window function)常常用在频域信号分析中。我其实不咋个懂,大概是从无限长的信号中截一段出来,而后把这一段作延拓变成一个虚拟的无限长的信号。用来截取的函数就叫窗函数,窗函数又分不少种,什么矩形窗、三角窗、高斯窗。javascript

scipy.signal中有各类我不懂的实现窗函数的方法。浏览了一下,头疼的紧。php

那在pandas中也有实现窗函数的方法:rolling()。我呢就不折腾什么信号处理的东西,用金融数据作个小示例好了。css

金融时间序列也是一种时间序列数据,先后次序是固定,多为二维数据。例如要看一只股票的平均移动线,就会用到rolling()html

先介绍一下这个翻滚函数

DataFrame.rolling(window, 
                  min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0) 
  • window: 移动窗口的大小。值能够是int(整数值)或offset(偏移)。若是是整数值的话,每一个窗口是固定的大小,即包含相同数量的观测值。值为offset(偏移时长,eg:'2s')则指定了每一个窗口包含的时间段,每一个窗口包含的观测值的数量是不必定的。offset必须在index是时间类型数据时才可使用。java

  • min_periods: 每一个窗口最少包含的观测值数量,小于这个值的窗口结果为NA。值能够是int,默认None。offset状况下,默认为1。python

  • freq: 弃用。不用管它。web

  • center: 把窗口的标签设置为居中。布尔型,默认False,居右。windows

  • win_type: 窗口的类型。上面介绍的,截取窗的各类函数。字符串类型,默认为None。可用的窗口类型有:app

    • boxcar
    • triang
    • blackman
    • hamming
    • bartlett
    • parzen
    • bohman
    • blackmanharris
    • nuttall
    • barthann
    • kaiser (needs beta)
    • gaussian (needs std)
    • general_gaussian (needs power, width)
    • slepian (needs width)
  • on: 可选参数。对于dataframe而言,指定要计算滚动窗口的列。值为列名。函数

  • axis: int、字符串,默认为0,即对列进行计算。

使用方法,例:

In []: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]}) In []: df.rolling(2).sum() Out[]: B 0 NaN 1 1.0 2 3.0 3 NaN 4 NaN 

按tab键能够查看rolling对象可用的方法,以下:

In []: r = df.rolling(2) In []: r Out[]: Rolling [window=10,center=False,axis=0] In []: r. r.agg r.cov r.max r.ndim r.aggregate r.exclusions r.mean r.quantile r.apply r.is_datetimelike r.median r.skew r.corr r.is_freq_type r.min r.std r.count r.kurt r.name r.sum 

注:rolling_mean()这种写法已经淘汰了,如今都是df.rolling().mean()df.rolling().std()这样来写。

例:计算苹果收盘价的平均移动线

获取数据

从雅虎获取苹果公司2016年1月1日至今的股票数据。

import pandas_datareader.data as web apple = web.DataReader(name='AAPL', data_source='yahoo', start='2016-1-1') print(apple.head()) 

数据大概是这个样子的:

Open High Low Close Volume \ Date 2016-01-04 102.610001 105.370003 102.000000 105.349998 67649400 2016-01-05 105.750000 105.849998 102.410004 102.709999 55791000 2016-01-06 100.559998 102.370003 99.870003 100.699997 68457400 2016-01-07 98.680000 100.129997 96.430000 96.449997 81094400 2016-01-08 98.550003 99.110001 96.760002 96.959999 70798000 Adj Close Date 2016-01-04 103.057063 2016-01-05 100.474523 2016-01-06 98.508268 2016-01-07 94.350769 2016-01-08 94.849671 

收盘价的折线图

为了方便观察滚完了以后的效果,咱们把数据都画图呈现出来。

apple['Close'].plot(figsize=(9, 5), grid=True) plt.show() 
 
收盘价

平均移动线MA

apple['roll_mean'] = apple['Close'].rolling(window=5).mean() apple[['Close', 'roll_mean']].plot(subplots=True, figsize=(9, 5), grid=True) plt.show() 
 
收盘价和5日平均移动线

这里窗口大小为5,因此前面四个数据是没有值的。把它们合在一块儿看看(把subplots改成False)。

 
收盘价和5日平均移动线合在一块儿

拉近一点:

 
 

直观上看更平滑了。毕竟取五天作平均了,第一天涨次日跌的这种一平均波动就小了。若是窗口变大会更平滑。

windowsize = [5,10,20] for i in windowsize: apple['roll_mean_'+str(i)] = apple['Close'].rolling(i).mean() apple[['roll_mean_5','roll_mean_10','roll_mean_20']].plot(figsize=(9, 5), grid=True) plt.show() 
 
 

补充

除了算平均值,还能够计算方差、相关、最大最小值等等,大部分的统计量均可以计算,就看你须要了。

另外若是已有的函数不能知足须要,咱们还能够用lambdaapply()写本身的方法。

例如(直接复制官网的咯):

mad = lambda x: np.fabs(x - x.mean()).mean() apple['Close'].rolling(window=5).apply(mad).plot(figsize=(9, 5), grid=True) plt.show() 

这里计算的是平均绝对误差。

 
 

个人图长得漂亮是由于安装了seaborn库,画图以前悄悄加载了一下。

另外,pandas中也有好些金融函数,好比计算指数加权移动平均,就现成的pandas.ewma()。待挖掘的东西好多呢。

做者:ChZ_CC 连接:https://www.jianshu.com/p/f6e489de57f7 來源:简书 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
相关文章
相关标签/搜索