使用 Pandas 数据框中的部分数据滚动标准差

Jon*_*nas 1 python dataframe pandas

我希望能够根据数据框中的部分数据计算滚动标准差。一个例子将解释我想要完成的任务。

                   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
Run Code Online (Sandbox Code Playgroud)

这就是我希望能够做到的:

  1. 应该对每一列进行滚动计算。
  2. 我想使用数据文件中每个第 n:th 日期的数据来计算滚动标准差。如果 n=3 并且我想使用以下日期的值计算 2000-01-15 的标准差:2000-01-15、2000-01-12、2000-01-09、2000-01-06, 2000年1月3日。对于 2000-01-14,我使用 2000-01-14、2000-01-11、2000-01-08、2000-01-05、2000-01-02。其他日期的逻辑相同以获得滚动标准差。
  3. 如果该逻辑可以应用于其他计算,那就太好了。我不明白的是如何在不同的时间分辨率之间切换。

Ale*_*der 5

window_step_size = 3
rolling_window = 3
>>> pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]], window=rolling_window)
                   A         B         C
2000-01-03       NaN       NaN       NaN
2000-01-06       NaN       NaN       NaN
2000-01-09  0.744288  1.396749  1.048535
2000-01-12  0.370182  1.404848  0.525129
2000-01-15  0.479753  0.594379  1.032831
Run Code Online (Sandbox Code Playgroud)

df.index[::-1]反转索引中的日期,使最近的日期位于第一个。 df.ix[df.index[::-1][::window_step_size]然后从该索引中获取每个nth值(例如,每三个日期)。最后, df.index[::-1][::window_step_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')
Run Code Online (Sandbox Code Playgroud)

根据这个新索引,从数据库中选择值:

>>> 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
Run Code Online (Sandbox Code Playgroud)

您现在可以pd.rolling_std对您选择的滚动窗口使用常规函数。

pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]], window=rolling_window)
Run Code Online (Sandbox Code Playgroud)

编辑要获取每日值,您可以连接。

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
Run Code Online (Sandbox Code Playgroud)