窗函數(shù)(window function)經常用在頻域信號分析中逆瑞。我其實不咋個懂笨篷,大概是從無限長的信號中截一段出來斟湃,然后把這一段做延拓變成一個虛擬的無限長的信號。用來截取的函數(shù)就叫窗函數(shù)辑甜,窗函數(shù)又分很多種衰絮,什么矩形窗、三角窗磷醋、高斯窗猫牡。
在scipy.signal中有各種我不懂的實現(xiàn)窗函數(shù)的方法。瀏覽了一下邓线,頭疼的緊淌友。
那在pandas中也有實現(xiàn)窗函數(shù)的方法:rolling()
煌恢。我呢就不折騰什么信號處理的東西,用金融數(shù)據(jù)做個小示例好了震庭。
金融時間序列也是一種時間序列數(shù)據(jù)瑰抵,前后次序是固定,多為二維數(shù)據(jù)器联。例如要看一只股票的平均移動線二汛,就會用到rolling()
。
先介紹一下這個翻滾函數(shù)
DataFrame.rolling(window,
min_periods=None,
freq=None,
center=False,
win_type=None,
on=None,
axis=0)
window
: 移動窗口的大小主籍。值可以是int(整數(shù)值)或offset(偏移)习贫。如果是整數(shù)值的話逛球,每個窗口是固定的大小千元,即包含相同數(shù)量的觀測值。值為offset(偏移時長,eg:'2s'
)則指定了每個窗口包含的時間段颤绕,每個窗口包含的觀測值的數(shù)量是不一定的幸海。offset必須在index是時間類型數(shù)據(jù)時才可以使用。min_periods
: 每個窗口最少包含的觀測值數(shù)量奥务,小于這個值的窗口結果為NA物独。值可以是int,默認None氯葬。offset情況下挡篓,默認為1。freq
: 棄用帚称。不用管它官研。center
: 把窗口的標簽設置為居中。布爾型闯睹,默認False戏羽,居右。-
win_type
: 窗口的類型楼吃。上面介紹的始花,截取窗的各種函數(shù)。字符串類型孩锡,默認為None酷宵。可用的窗口類型有:- 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
: 可選參數(shù)躬窜。對于dataframe而言浇垦,指定要計算滾動窗口的列。值為列名斩披。axis
: int溜族、字符串讹俊,默認為0,即對列進行計算煌抒。
使用方法仍劈,例:
In [2]: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
In [3]: df.rolling(2).sum()
Out[3]:
B
0 NaN
1 1.0
2 3.0
3 NaN
4 NaN
按tab鍵可以查看rolling對象可用的方法,如下:
In [4]: r = df.rolling(2)
In [5]: r
Out[5]: Rolling [window=10,center=False,axis=0]
In [6]: 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()
這種寫法已經淘汰了寡壮,現(xiàn)在都是df.rolling().mean()
贩疙、df.rolling().std()
這樣來寫。
例:計算蘋果收盤價的平均移動線
獲取數(shù)據(jù)
從雅虎獲取蘋果公司2016年1月1日至今的股票數(shù)據(jù)况既。
import pandas_datareader.data as web
apple = web.DataReader(name='AAPL',
data_source='yahoo',
start='2016-1-1')
print(apple.head())
數(shù)據(jù)大概是這個樣子的:
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
收盤價的折線圖
為了方便觀察滾完了之后的效果这溅,我們把數(shù)據(jù)都畫圖呈現(xiàn)出來。
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棒仍,所以前面四個數(shù)據(jù)是沒有值的悲靴。把它們合在一起看看(把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()
補充
除了算平均值浇揩,還可以計算方差、相關憨颠、最大最小值等等胳徽,大部分的統(tǒng)計量都可以計算,就看你需要了爽彤。
另外如果已有的函數(shù)不能滿足需要养盗,我們還可以用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中也有好些金融函數(shù)铆铆,比如計算指數(shù)加權移動平均,就現(xiàn)成的
pandas.ewma()
丹喻。待挖掘的東西好多呢薄货。