Python 用于金融數(shù)據(jù)分析第7課-----Pandas處理時間序列數(shù)據(jù)

一、Rolling 和 Expanding

rolling和expanding都是類似的,目的是查看股票市場價格隨著時間的變化,不同的是rolling average算的是最近一個窗口期(比如說20天)的一個平均值,過了一天這個窗口又會向下滑動一天算20天的平均值;expanding的話,是從第一個值就開始累加地計算平均值。

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df=pd.read_csv('walmart_stock.csv')
df.head()
#在這里我把索引設(shè)為日期列
df.set_index('Date')
df.head()

輸出結(jié)果


繪制一下開盤指數(shù)

df['Open'].plot(figsize=(16, 6), '-')

rolling

現(xiàn)在開始繪制滾動平均值


根據(jù)官方文檔,我們主要設(shè)置窗口大小就可以了。

#注意在滾動之后是要設(shè)置聚合函數(shù)的,expanding一樣,跟groupby操作類似
df.rolling(7).mean().head(10)

可以看到前6天是沒有值的,原因是前6天都沒有之前的7天數(shù)據(jù),所以是nan。

#繪制出open的原數(shù)據(jù)的曲線和滾動平均值的曲線
df['former 30 days rolling Open mean']=df['Open'].rolling(30).mean()
df[['Open', 'former 30 days rolling Open mean']].plot(figsize=(16, 6))

可以看到滾動平均值會更加地差異化更小。

Expanding

#在這里要定義最小的觀察元素是1個,否則前面的可能都會是nan
df['former 30 days expanding Open mean']=df['Open'].expanding(min_periods=1).mean()
df[['Open', 'former 30 days expanding Open mean']].plot(figsize=(16, 6))

從圖上可以看得出,expanding曲線相對于原數(shù)據(jù)點的曲線要更加穩(wěn)定一些,它可以用來看這只股票的長期穩(wěn)定性。

Bollinger Bands

df['former 30 days rolling Close mean']=df['Close'].rolling(20).mean()
df['upper bound']=df['former 30 days rolling Close mean']+2*df['Close'].rolling(20).std()#在這里我們?nèi)?0天內(nèi)的標(biāo)準(zhǔn)差
df['lower bound']=df['former 30 days rolling Close mean']-2*df['Close'].rolling(20).std()
df[['Close', 'former 30 days rolling Close mean','upper bound','lower bound' ]].plot(figsize=(16, 6))

二、Resampling

重采樣可以認為跟 group以及上面說到的rolling和expanding都是一樣的,都是分組操作。


官方文檔當(dāng)中主要注意的是rule,它是一個字符串的形式給出,表示我們希望以年月日工作日等等來對數(shù)據(jù)進行編組,同樣地是編組完之后需要有個聚合函數(shù)。
看一下rule的種類。


我們先把以上麥當(dāng)勞的數(shù)據(jù)的index進行轉(zhuǎn)換成datetime格式,可以使用pd.to_datetime的方法。

df.index=pd.to_datetime(df.index)
type(df.index)

通過轉(zhuǎn)換以后就是datetime格式了,接下來就是進行resample。

df.resample('M').mean()

可以看得到,在按照月份resample之后多余的行會去掉,只剩下最后統(tǒng)計的那一行(在這里就是每個月底統(tǒng)計上一個月的平均值)。
也可以自己定義我要對group后的元素怎么操作(比如說按照一個月group以后我想取出第一個值,或者說是其他的)

def first_day(grp):
    return grp[0]#返回這個月的第一天的值
df.resample('M').apply(first_day)

這樣,每個月底都會返回這個月的第一天的值。

三、Time shifting

time shifting其實就是把索引往前或者往后挪動


df.shift(10)

這里索引往前挪了10天,相當(dāng)于數(shù)據(jù)往后挪動了10天,缺失值用nan補充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容