Python數(shù)據(jù)分析_Pandas06_窗函數(shù)

窗函數(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日平均移動線

這里窗口大小為5棒仍,所以前面四個數(shù)據(jù)是沒有值的悲靴。把它們合在一起看看(把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()

補充

除了算平均值浇揩,還可以計算方差、相關憨颠、最大最小值等等胳徽,大部分的統(tǒng)計量都可以計算,就看你需要了爽彤。

另外如果已有的函數(shù)不能滿足需要养盗,我們還可以用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中也有好些金融函數(shù)铆铆,比如計算指數(shù)加權移動平均,就現(xiàn)成的pandas.ewma()丹喻。待挖掘的東西好多呢薄货。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碍论,隨后出現(xiàn)的幾起案子谅猾,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件税娜,死亡現(xiàn)場離奇詭異坐搔,居然都是意外死亡,警方通過查閱死者的電腦和手機敬矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門概行,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弧岳,你說我怎么就攤上這事凳忙。” “怎么了禽炬?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵涧卵,是天一觀的道長。 經常有香客問我腹尖,道長柳恐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任桐臊,我火速辦了婚禮胎撤,結果婚禮上晓殊,老公的妹妹穿的比我還像新娘断凶。我一直安慰自己,他們只是感情好巫俺,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布认烁。 她就那樣靜靜地躺著,像睡著了一般介汹。 火紅的嫁衣襯著肌膚如雪却嗡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天嘹承,我揣著相機與錄音窗价,去河邊找鬼。 笑死叹卷,一個胖子當著我的面吹牛撼港,可吹牛的內容都是我干的。 我是一名探鬼主播骤竹,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼帝牡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒙揣?” 一聲冷哼從身側響起靶溜,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罩息,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗤详,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年瓷炮,在試婚紗的時候發(fā)現(xiàn)自己被綠了断楷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡崭别,死狀恐怖冬筒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情茅主,我是刑警寧澤舞痰,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站诀姚,受9級特大地震影響响牛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜赫段,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一呀打、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糯笙,春花似錦贬丛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至够庙,卻和暖如春恭应,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耘眨。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工昼榛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剔难。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓胆屿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钥飞。 傳聞我的和親對象是個殘疾皇子莺掠,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容