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 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索