Python用於金融數據分析第7課-----Pandas處理時間序列數據
一、Rolling 和 Expanding
rolling和expanding都是類似的,目的是查看股票市場價格隨著時間的變化,不同的是rolling average算的是最近一個窗口期(比如說20天)的一個平均值,過了一天這個窗口又會向下滑動一天算20天的平均值;expanding的話,是從第一個值就開始累加地計算平均值。
import pandas as pdimport matplotlib.pyplot as plt%matplotlib inlinedf=pd.read_csv(walmart_stock.csv)df.head()
#在這裡我把索引設為日期列df.set_index(Date)df.head()
輸出結果
繪製一下開盤指數
df[Open].plot(figsize=(16, 6), -)
rolling
現在開始繪製滾動平均值
根據官方文檔,我們主要設置窗口大小就可以了。
#注意在滾動之後是要設置聚合函數的,expanding一樣,跟groupby操作類似df.rolling(7).mean().head(10)
可以看到前6天是沒有值的,原因是前6天都沒有之前的7天數據,所以是nan。
#繪製出open的原數據的曲線和滾動平均值的曲線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個,否則前面的可能都會是nandf[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曲線相對於原數據點的曲線要更加穩定一些,它可以用來看這隻股票的長期穩定性。
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()#在這裡我們取20天內的標準差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都是一樣的,都是分組操作。
官方文檔當中主要注意的是rule,它是一個字元串的形式給出,表示我們希望以年月日工作日等等來對數據進行編組,同樣地是編組完之後需要有個聚合函數。
看一下rule的種類。我們先把以上麥當勞的數據的index進行轉換成datetime格式,可以使用pd.to_datetime的方法。
df.index=pd.to_datetime(df.index)type(df.index)
通過轉換以後就是datetime格式了,接下來就是進行resample。
df.resample(M).mean()
可以看得到,在按照月份resample之後多餘的行會去掉,只剩下最後統計的那一行(在這裡就是每個月底統計上一個月的平均值)。
也可以自己定義我要對group後的元素怎麼操作(比如說按照一個月group以後我想取出第一個值,或者說是其他的)def first_day(grp): return grp[0]#返回這個月的第一天的值df.resample(M).apply(first_day)
這樣,每個月底都會返回這個月的第一天的值。
三、Time shifting
time shifting其實就是把索引往前或者往後挪動
df.shift(10)
這裡索引往前挪了10天,相當於數據往後挪動了10天,缺失值用nan補充。
推薦閱讀:
※用特徵選擇方法優化模型|python數據挖掘思考筆記(1)
※數據分析師必須知道的九個問題
※運營做數據分析都會犯的幾個錯
※R語言-簡單數據分析
※用數據講故事