2014-09-03 360 views
6

我試圖有效地計算一個熊貓DataFrame的每列的指數衰減的運行總和。 DataFrame包含世界上每個國家的每日評分。數據框看起來是這樣的:Python的指數衰減大熊貓DataFrame

   AF  UK  US 
2014-07-01 0.998042 0.595720 0.524698 
2014-07-02 0.380649 0.838436 0.355149 
2014-07-03 0.306240 0.274755 0.964524 
2014-07-04 0.396721 0.836027 0.225848 
2014-07-05 0.151291 0.677794 0.603548 
2014-07-06 0.558846 0.050535 0.551785 
2014-07-07 0.463514 0.552748 0.265537 
2014-07-08 0.240282 0.278825 0.116432 
2014-07-09 0.309446 0.096573 0.246021 
2014-07-10 0.800977 0.583496 0.713893 

我不知道如何計算的滾動總和(帶衰減),而無需通過數據幀進行迭代,因爲我需要知道昨天的成績來計算今天的成績。但是爲了計算昨天的分數,我需要知道前天的分數等。這是我一直在使用的代碼,但我想要一個更有效的方法來解決它。

for j, val in df.iteritems(): 
    for i, row in enumerate(val): 
     df[j].iloc[i] = row + val[i-1]*np.exp(-0.05) 

回答

8

您可以使用一個事實,即當指數乘以它們的指數增加:

如:

N(2) = N(2) + N(1) * exp(-0.05) 
N(3) = N(3) + (N(2) + N(1) * exp(-0.05))*exp(-0.05) 
N(3) = N(3) + N(2)*exp(-0.05) + N(1)*exp(-0.1) 
N(4) = ...and so on 

這可以被矢量使用numpy的:

dataset = pd.DataFrame(np.random.rand(1000,3), columns=["A", "B","C"]) 

weightspace = np.exp(np.linspace(len(dataset), 0, num=len(dataset))*-0.05) 
def rollingsum(array): 
    weights = weightspace[0-len(array):] 
    # Convolve the array and the weights to obtain the result 
    a = np.dot(array, weights).sum() 
    return a 


a = pd.expanding_apply(dataset, rollingsum) 

pd.expanding_apply適用rollingsum功能向後到每行,稱它爲len(dataset)次。 np.linspace生成一個大小爲len(dataset)的數據集,並計算每行與當前行相乘的次數exp(-0.05)

由於是矢量,它應該是快:

%timeit a = pd.expanding_apply(dataset, rollingsum) 
10 loops, best of 3: 25.5 ms per loop 

與此相比,(注意:我使用Python 3中,不得不使第一行更改的行爲...):

def multipleApply(df): 
    for j, val in df.iteritems(): 
     for i, row in enumerate(val): 
      if i == 0: 
       continue 
      df[j].iloc[i] = row + val[i-1]*np.exp(-0.05) 

這出來的:

In[68]: %timeit multipleApply(dataset) 
1 loops, best of 3: 414 ms per loop 
+0

@ZJS是什麼呢? - 我將稍微修改一下,以便讓它在python中工作3 – undershock 2014-09-03 18:38:07

+0

'%timeit t(df)' 100個循環,最好是3:每個循環3.96 ms – ZJS 2014-09-03 18:46:06

+0

@ZFS你是什麼數據運行這個?編輯 – undershock 2014-09-03 18:46:52