2017-02-20 45 views
0

我有一個數據幀和一系列速率。我的計算是非常簡單的:行(n-1)* rate + row(n)在熊貓數據幀中

NEW_ROW(N)= NEW_ROW(N-1)*率+ old_row(N)

我有我的數據幀20列。 是一系列20(每列1)。我用循環編寫了一個代碼,運行時間接近9秒。我相信,這不是做這個練習的理想方式。我想找到一種Pythonic的方式來做到這一點。

data = pd.read_csv('data.csv') 
ret_rate = pd.read_csv('Retention_Rate.csv') 

ret_dat = data.copy() 
for i in range(4, ret_dat.shape[1]): 
    for j in range(1, ret_dat.shape[0]): 
     if (ret_dat['MARKET_ID'][j] == ret_dat['MARKET_ID'][j-1]): 
     ret_dat.iloc[j, i] = ret_dat.iloc[j, i] + ret_rate.iloc[i-4,0]*ret_dat.iloc[j-1, i] 

ret_dat.to_csv('adstock_data_v3.csv') 

我已經把數據in a Google sheet

回答

0

終於找到了解決辦法。在這一點上,我可以找到最優化的解決方案。利用來自scipy.signal.lfilter的信號處理。這裏有雲解決方案:

for media_var in self.config.media_vars: adstocked_vals = lfilter([1], [1, -ret_rate[media_var]], data[media_var])

感謝所有誰給了不同的答案。它以某種方式幫助了我。感謝Warren Weckesser在不同線程上的解決方案here

0
  1. 只需使用的data這是感興趣的切片

  2. 系列ret_rate是用於演示目的,長度等於data

  3. 列數的範圍內你乘data沿着ret_rate列(axis=1)和shift這個DataFrame加1,並加上初始DataFrame

代碼:

data = pd.read_csv("data_so.csv").iloc[:,4:] 
ret_rate = pd.Series(range(df.shape[1]), index=df.columns) 
data.multiply(ret_rate, 1).shift() + data 

因此,所有的計算IST只有一行大熊貓。

對於multiply()重要的是,ret_rate的索引等於data的列名稱。

+0

ret_rate在csv中具有值。在將索引轉換爲data.columns時遇到困難。任何幫助,請... 'ret_rate_s = pd.Series(ret_rate.ix [:,0],index = data.columns)' 給我所有NaN – Nil

+0

要讀取csv作爲系列,你應該使用熊貓函數['read_csv'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)。或者csv只有一列,或者您定義要與參數usecols一起使用的列。無論哪種情況,如果您設置'squeeze = True','read_csv'函數將返回一個Series而不是DataFrame。讀完csv後,你可以設置'ret_rate.index = data.columns' – elcombato

+0

它工作! @elcombato。我可以創建一個系列,但是,然後,只有意識到df.multiply不能處理浮動類型。只有整合者允許!無賴! – Nil

0

我不知道這是否是你所試圖實現 - 但這是簡單和公式的直接翻譯ü給

data = pd.read_csv('data.csv') 
ret_rate = pd.read_csv('Retention_Rate.csv',usecols=['rate']) 
# since you require only the 5th column onwards 
ret_data = data.ix[:,4:] 

# you can apply broad operations over rows instead of individual cells now 
for i in range(1,len(ret_data)): 
    ret_data.iloc[i] = ret_data.iloc[i-1].multiply(ret_rate.rate.iloc[i-1]) + ret_dat.iloc[i] 

ret_data.to_csv('your_filename.csv',sep=',') 
+0

可能是我犯了一個愚蠢的錯誤......但這隻給了我第一行輸出。其餘的都是NaN。 – Nil