一、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補充。