Python 使用熊猫数据帧中的部分数据滚动标准偏差

Python 使用熊猫数据帧中的部分数据滚动标准偏差,python,pandas,dataframe,Python,Pandas,Dataframe,我希望能够根据数据框中的部分数据计算滚动标准偏差。一个例子将解释我想要实现的目标 A B C 2000-01-01 0.425615 1.679789 -1.903056 2000-01-02 0.791313 0.562471 0.098124 2000-01-03 1.223165 -0.548387 -1.558204 2000-01-04 0.354931 -0.685773 0.647817 2000

我希望能够根据数据框中的部分数据计算滚动标准偏差。一个例子将解释我想要实现的目标

                   A         B         C
2000-01-01  0.425615  1.679789 -1.903056
2000-01-02  0.791313  0.562471  0.098124
2000-01-03  1.223165 -0.548387 -1.558204
2000-01-04  0.354931 -0.685773  0.647817
2000-01-05  1.137434  1.000594  0.428180
2000-01-06 -0.265311 -1.807045  0.533477
2000-01-07  0.717505  1.647540 -0.141123
2000-01-08 -2.405664  1.278410  1.043872
2000-01-09  0.463943  0.982042 -0.382241
2000-01-10 -0.403267 -0.615421  0.583384
2000-01-11 -0.714163  0.470505 -0.291396
2000-01-12  0.209979 -0.118331 -0.369776
2000-01-13 -0.779638  0.924612 -0.477497
2000-01-14  0.149868 -0.376292  0.747637
2000-01-15 -0.464360  0.821400  1.412874
这就是我希望能够做到的:

  • 应针对每根立柱进行计算
  • 我想使用以下数据计算滚动标准偏差: 每n:th日期 在dataftame中。如果n=3,我想计算标准 使用 以下日期:2000-01-1512000-01-1212000-01-092000-01-06, 2000-01-03. 对于2000-01-14,我使用2000-01-14、2000-01-11、2000-01-08, 2000-01-05, 2000-01-02. 其他日期的逻辑相同,以获得滚动标准偏差
  • 如果这个逻辑可以应用于其他领域,那就太好了 计算。我搞不懂的是如何在两者之间切换 不同的时间分辨率
  • df.index[:-1]
    反转索引中的日期,以便最新的日期是第一个
    df.ix[df.index[:-1][::window\u step\u size]
    然后从该索引中每隔
    n次
    取一个值(例如每三个日期)。最后,df.index[:-1][::window\u step\u size][:-1]首先使用最早日期的索引

    >>> df.index[::-1][::window_step_size][::-1]
    Index([u'2000-01-03', u'2000-01-06', u'2000-01-09', u'2000-01-12', u'2000-01-15'], dtype='object')
    
    基于此新索引,从数据库中选择值:

    >>> df.ix[df.index[::-1][::window_step_size][::-1]]
    
                       A         B         C
    2000-01-03  1.223165 -0.548387 -1.558204
    2000-01-06 -0.265311 -1.807045  0.533477
    2000-01-09  0.463943  0.982042 -0.382241
    2000-01-12  0.209979 -0.118331 -0.369776
    2000-01-15 -0.464360  0.821400  1.412874
    
    现在,您可以对所选滚动窗口使用常规的
    pd.rolling\u std
    功能

    pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]], window=rolling_window)
    
    编辑要获取每日值,可以连接

    def roll_sd(df, rolling_window, window_step_size):
        return pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]], 
                              window=rolling_window)
    
    df_sd = pd.concat([roll_sd(df.iloc[0:len(df)-n], rolling_window, window_step_size) 
                       for n in range(window_step_size)])
    
    df_sd.sort_index()
                       A         B         C
    2000-01-01       NaN       NaN       NaN
    2000-01-02       NaN       NaN       NaN
    2000-01-03       NaN       NaN       NaN
    2000-01-04       NaN       NaN       NaN
    2000-01-05       NaN       NaN       NaN
    2000-01-06       NaN       NaN       NaN
    2000-01-07  0.192205  1.356544  1.305998
    2000-01-08  1.953373  0.360948  0.480009
    2000-01-09  0.744288  1.396749  1.048535
    2000-01-10  0.571905  1.327296  0.438081
    2000-01-11  1.772152  0.410464  0.668307
    2000-01-12  0.370182  1.404848  0.525129
    2000-01-13  0.778805  1.155806  0.542145
    2000-01-14  1.299902  0.827427  0.701223
    2000-01-15  0.479753  0.594379  1.032831
    

    谢谢,但是我需要一个滚动值来表示每个日期,而不是每第三个日期。太棒了!我需要一些时间来尝试理解代码中发生了什么,但它看起来非常有希望。谢谢!我不能说我完全理解这一点,但我也希望有一个2000-01-15的值。它应该基于2000-01-1的标准开发5,2000-01-12,2000-01-09,2000-01-06,2000-01-03。它可以工作,但我在理解范围(4)中的n在这种情况下意味着什么方面有问题。为什么是4?我对熊猫来说是新手,它很强大,但并不总是容易理解。应该是窗口步长。我已经修改了。
    >>[n代表范围(3)]
    结果是
    [0,1,2]
    def roll_sd(df, rolling_window, window_step_size):
        return pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]], 
                              window=rolling_window)
    
    df_sd = pd.concat([roll_sd(df.iloc[0:len(df)-n], rolling_window, window_step_size) 
                       for n in range(window_step_size)])
    
    df_sd.sort_index()
                       A         B         C
    2000-01-01       NaN       NaN       NaN
    2000-01-02       NaN       NaN       NaN
    2000-01-03       NaN       NaN       NaN
    2000-01-04       NaN       NaN       NaN
    2000-01-05       NaN       NaN       NaN
    2000-01-06       NaN       NaN       NaN
    2000-01-07  0.192205  1.356544  1.305998
    2000-01-08  1.953373  0.360948  0.480009
    2000-01-09  0.744288  1.396749  1.048535
    2000-01-10  0.571905  1.327296  0.438081
    2000-01-11  1.772152  0.410464  0.668307
    2000-01-12  0.370182  1.404848  0.525129
    2000-01-13  0.778805  1.155806  0.542145
    2000-01-14  1.299902  0.827427  0.701223
    2000-01-15  0.479753  0.594379  1.032831