美文网首页每天写1000字工具癖程序员
Python 用于金融数据分析第7课-----Pandas处理时

Python 用于金融数据分析第7课-----Pandas处理时

作者: 九日照林 | 来源:发表于2018-03-19 00:48 被阅读1368次

    一、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()
    
    #在这里我把索引设为日期列
    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个,否则前面的可能都会是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曲线相对于原数据点的曲线要更加稳定一些,它可以用来看这只股票的长期稳定性。

    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 用于金融数据分析第7课-----Pandas处理时

        本文链接:https://www.haomeiwen.com/subject/srfuqftx.html