2016-02-06 30 views
1

我希望能夠根據數據框中的部分數據計算滾動標準偏差。一個例子將解釋我想完成的事情。使用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 

這是我想什麼能夠做到:

  1. 計算應做滾動的每一列。
  2. 我想使用dataftame中的每個n:th日期 的數據計算滾動標準偏差。如果n = 3,並且我想使用以下日期的值 計算2000-01-15的標準偏差 :2000-01-15,2000-01-12,2000-01-09,2000-01- 06, 2000-01-03。對於2000-01-14,我使用2000-01-14,2000-01-11,2000-01-08, 2000-01-05,2000-01-02。與其他日期相同的邏輯來獲得滾動標準偏差。
  3. 如果邏輯可以應用於其他 計算,那將是非常好的。我無法弄清楚的是如何在不同的時間分辨率之間切換 。

回答

2
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 

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') 

在此基礎上新的索引,從數據庫中選擇的值:

>>> 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_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 
+0

謝謝,但我需要一個滾動值爲每個日期,而不是每三個日期。 – Jonas

+0

請參閱編輯以獲取更新。 – Alexander

+0

太棒了!我需要一些時間來試着瞭解代碼中發生了什麼,但它看起來很有希望。謝謝! – Jonas