窗函數(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
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()
apple['roll_mean'] = apple['Close'].rolling(window=5).mean() apple[['Close', 'roll_mean']].plot(subplots=True, figsize=(9, 5), grid=True) plt.show()
這裏窗口大小爲5,因此前面四個數據是沒有值的。把它們合在一塊兒看看(把subplots改成False)。
拉近一點:
直觀上看更平滑了。畢竟取五天作平均了,第一天漲次日跌的這種一平均波動就小了。若是窗口變大會更平滑。
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()
除了算平均值,還能夠計算方差、相關、最大最小值等等,大部分的統計量均可以計算,就看你須要了。
另外若是已有的函數不能知足須要,咱們還能夠用lambda
和apply()
寫本身的方法。
例如(直接複製官網的咯):
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()
。待挖掘的東西好多呢。