2014-03-26 36 views
1

我有一個數據幀,我想用它來計算相對於事件日期的滾動和。每個列的事件日期都不相同,並由每列中有值的最新日期表示。Python Pandas - 將絕對時間段轉換爲相對時間段

這裏是一個玩具例子:

rng = pd.date_range('1/1/2011', periods=8, freq='D') 
df = pd.DataFrame({ 
      '1' : [56, 2, 3, 4, 5, None, None, None], 
      '2' : [51, 2, 3, 4, 5, 6, None, None], 
      '3' : [51, 2, 3, 4, 5, 6, 0, None]}, index = rng) 

pd.rolling_sum(df,3) 

它產生看起來像這樣的數據幀:

  1  2  3 
2011-01-01 NaN  NaN  NaN 
2011-01-02 NaN  NaN  NaN 
2011-01-03 61  56  56 
2011-01-04 9  9  9 
2011-01-05 12  12  12 
2011-01-06 NaN  15  15 
2011-01-07 NaN  NaN  11 
2011-01-08 NaN  NaN  NaN 

我現在要對齊的最後一場比賽日期的數據框和集的最後一行索引爲0,每個前面的索引爲-1,-2,-3等等。期間不再是絕對的,而是相對於事件日期。

所需的數據幀是這樣的:

1 2 3 
-7.00 NaN NaN NaN 
-6.00 NaN NaN NaN 
-5.00 NaN NaN NaN 
-4.00 NaN NaN 56 
-3.00 NaN 56 9 
-2.00 61 9 12 
-1.00 9 12 15 
0.00 12 15 11 

感謝您的任何指導。

回答

2

我看不到任何簡單的方法來做到這一點。下面的工作,但有點混亂。

In [37]: def f(x): 
    ....:  y = x.dropna() 
    ....:  return Series(y.values,x.index[len(x)-len(y):]) 
    ....: 

In [40]: roller = pd.rolling_sum(df,3).reset_index(drop=True) 

In [41]: roller 
Out[41]: 
    1 2 3 
0 NaN NaN NaN 
1 NaN NaN NaN 
2 61 56 56 
3 9 9 9 
4 12 12 12 
5 NaN 15 15 
6 NaN NaN 11 
7 NaN NaN NaN 

[8 rows x 3 columns] 

In [43]: roller.apply(f).reindex_like(roller) 
Out[43]: 
    1 2 3 
0 NaN NaN NaN 
1 NaN NaN NaN 
2 NaN NaN NaN 
3 NaN NaN 56 
4 NaN 56 9 
5 61 9 12 
6 9 12 15 
7 12 15 11 

[8 rows x 3 columns] 

In [44]: result = roller.apply(f).reindex_like(roller) 

In [49]: result.index = result.index.values-len(result.index)+1 

In [50]: result 
Out[50]: 
    1 2 3 
-7 NaN NaN NaN 
-6 NaN NaN NaN 
-5 NaN NaN NaN 
-4 NaN NaN 56 
-3 NaN 56 9 
-2 61 9 12 
-1 9 12 15 
0 12 15 11 

[8 rows x 3 columns] 
+0

FWIW,我不得不像這樣(我通常所說的)「重複實現」幾次。 – DSM

+0

正在等你評論!我認爲第一部分實際上可能是一個不錯的方法(如果將它作爲框架,效率會更高)。感興趣嗎?它在dropna上的變體,也許''df.dropna(kind ='furthest',axis = 1)''或者什麼? (或者'faller') – Jeff

+1

https://github.com/pydata/pandas/issues/6713 – Jeff